This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PGA460: pga460突发周期问题

Part Number: PGA460

前提:

pga460,200KHz

主控:mcu(STM32xxx);

通信方式:uart,dma

描述:mcu每隔10ms,uart_dma发送突发指令0x55, 0x00, 0x01,xx(校验);等待9ms后发送读取测量结果指令uart_dma发送指令0x55, 0x02, 0x05,xx(校验);此方式发波正常。

47b2cf9cd29091f57ea1ad509969f253.jpg

现在我有个新需求事件A,在突发和测量指令之间的9ms做了一个事情,获取DEV_STAT0和DEV_STAT1的状态,检测有没有出错。于是问题出现了,发波的周期并不是我的10ms,而是混乱的。(具体实现是发送突发后,隔了900us去读取DEV_STAT0和DEV_STAT1,然后执行一些检查(总时间不超过2ms),随后等待测量结果读取,所以时序上应该是没问题的)

a25ade54fc9bc364812d232d2cb103ca.jpg

我能确保发送一切正常。

现在我陷入了困难。

突发和测量结果读取之间不能有别的通信吗?可是我做温度的读取不会发生以上问题。

请给出一些指导意见。

  • 请参阅以下信息。

    在发出突发命令后,PGA460 会进入一个时间敏感的测量状态,在超声波测量完成之前,任何其他命令都无法对其进行寻址 [1]。您在 9 毫秒时间窗口内读取 DEV_STAT0/DEV_STAT1 的操作会中断此受保护状态,从而导致您所观察到的时序混乱现象。

    当您发出“发射并监听”命令时,PGA460 会立即开始进行超声波回波检测。在此期间:

    • 该设备处于繁忙状态,此时尝试通信可能会引发包括数据争用在内的各种通信错误 [2]
    • 仅允许填充回波数据转储内存或使用阈值比较器——任何其他操作均不应中断此过程 [3]
    • 如果在测量进行过程中尝试读取测量结果,您将获得上一次测量的结果,而非当前数据 [1]

    寄存器读取命令(CMD 9)要求 PGA460 向您的 MCU 发送响应 [4]。当设备正在积极监听超声波回波时,这一响应要求会导致通信冲突。

    为了解决此问题,请在发送突发命令之前或获取测量结果之后读取 DEV_STAT0/DEV_STAT1——切勿在 9 毫秒的测量窗口期间进行读取。

    推荐流程:

    1. 读取 DEV_STAT0/DEV_STAT1(错误检查)
    2. 发送突发命令
    3. 等待记录时长到期(即9毫秒)
    4. 读取测量结果
    5. 重复

    如果您需要在每个周期内检测错误,请在读取测量结果后、下一组数据传输开始前立即检查状态寄存器。这样既能保持 10 毫秒的周期时序,又能捕获发生的任何错误。