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.

[参考译文] DAC8742H:HART 调制解调器 FIFO 不会清除字符。

Guru**** 2386700 points
Other Parts Discussed in Thread: DAC8742H, TMS570LS0432, DAC8740H
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/748938/dac8742h-hart-modem-fifo-does-not-clear-characters

器件型号:DAC8742H
主题中讨论的其他器件: TMS570LS0432DAC8740H

我正在尝试在 SPI 模式下使用 TI DAC8742H 芯片来实现 HART 通信。 主机处理器是 Hercules TMS570LS0432。

首先、我发现 DAC8742h.pdf 文档有错误。 MODEM_STATUS 寄存器的地址记录为0x20、FIFO_STATUS 寄存器的地址为0x24、但我观察到它们是相反的。 实际行为是 MODEM_STATUS 寄存器的地址为0x24、FIFO_STATUS 寄存器的地址为0x20。

系统启动后,我通过 TeraTerm 发送单个字符,例如‘1’(十六进制0x31)。 我的设备收到 IRQ。 我读取 MODEM_STATUS 寄存器和 FIFO_M2D 寄存器;DAC8742报告它接收到0x31。 到目前为止、非常好。 从 TeraTerm 发送‘2’(十六进制0x32);我获取 IRQ。 我读取 MODEM_STATUS 寄存器和 FIFO_M2D 寄存器;DAC8742报告它接收到0x31。 不好。 应为0x32。 实际上、无论我键入什么字符、调制解调器都会报告我得到了0x31。 DAC8740H.pdf 指出、当我执行 SPI 读取命令时、缓冲器将被清除。 它不是

我重新启动、发送一个单字符'A'(十六进制0x61)。 我的设备收到 IRQ。 我读取 MODEM_STATUS 寄存器和 FIFO_M2D 寄存器;DAC8742报告它接收到0x61。 再说一次、好的。 从 TeraTerm 发送‘b’(十六进制0x62);我获取 IRQ。 我读取 MODEM_STATUS 寄存器和 FIFO_M2D 寄存器;DAC8742报告它接收到0x61。 不好。 应为0x62。 实际上、无论我键入什么字符、调制解调器都会报告我得到了0x61。

如有任何建议,请提出。

       Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    我的同事 Garrett 需要在假期结束后再次与您沟通、您应该在周一得到回复。

    谢谢、
    Paul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    您是如何得出 FIFO_M2D 和 MODEMO_STATUS 寄存器具有交换地址的结论的? 复位后、FIFO_M2D 为0x0200、MODEMO_STATUS 为0x0000。 当我在复位后读取这些值时、它们是正确的。

    我对您的测试有几个问题:

    1.当您使用 TeraTerm 发送字符时、如何对 HART 信号进行调制以使 DAC8742H 进行解调? 您能否提供要解调的波形?
    2. MODEM_IRQ_MASK 寄存器的值是多少? 这将确定触发 IRQ 的原因。
    3.如果在发送0x61之前复位器件并发送0x62、器件是否接收到0x62?

    谢谢、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    加雷特:

    感谢你的答复。 今天、我的症状与上周不同。 我不记得做了什么改变、但我必须这样做。 今天、我得到一个奇偶校验错误、接收字符始终为0x00:

    首先、下面是我配置的方法:

    我发送复位:

    TxBuffer = 0x07 0x00 0x01

    我发送 CONTRAL_REG:

    TxBuffer = 0x02 0x00 0x4c

    我发送 MODEM_IRQ_MASK:

    TxBuffer = 0x21 0x7f 0x3f

    我发送 MODEM_CONTROL:

    TxBuffer = 0x22 0x00 0x48

    我发送 FIFO_LEVEL_SET:

    TxBuffer = 0x25 0x00 0x11

    最后、我发送 PAFF_Jabber:

    TxBuffer = 0x27 0x00 0x02

    现在、此过程空闲、等待 IRQ 线路变为高电平...

    来自 TeraTerm、设置为1200波特、8位、奇数奇偶校验、1个停止位、无流量控制、 我发送'A'。

    IRQ 线路变为高电平、我收到一个中断。 我唤醒我的字符处理任务...

    在字符处理任务中、我请求状态、使用0x24表示状态寄存器地址:

    TxBuffer = 0xa4 0x00 0x00

    我检查接收缓冲器:

    RxBuffer = 0xa0 0xc4 0x84

    我使用0x20为 M2D FIFO 寄存器请求 FIFO_M2D:

    TxBuffer = 0xa0 0x00 0x00

    我检查接收缓冲器:

    RxBuffer = 0xa4 0x02 0x00

    我刚才注意到的一点是、当我对状态或 FIFO 寄存器执行读取请求时、接收缓冲区的第一个字节与我请求的字节相反、例如、如果我发送 TxBuffer[0]= 0xa4 RxBuffer[0]将为0xa0等 RxBuffer 似乎反映了之前的读取请求。

    我希望这能说明这一问题。

    谢谢!

           Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、这是一个更新。 我在对前一条命令的答复中计时的任何命令都会被计时。 这就是为什么 MODE_STATUS_REG 和 FIFO_M2D 地址看起来是向后的原因。 那么、我需要做些什么来获得 MODEM_STATUS_REG 和 FIFO_M2D 读取请求的正确应答?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ken、

    数据表的第25页说明了 SPI 帧结构。 D23表示写入帧与读取帧。 D23中的"1"会在后跟相应的地址时发起读取。 读取命令的以下帧将包含请求的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的答案不是很有用。

    发出 FIFO_M2D 寄存器(偏移= 24h)命令后、我需要在另一帧中计时? 这样、您意味着为 FIFO_M2D 寄存器读取设置6个字节的时钟吗? 如果我这么做、我在0xa4 0x00 0x00 0x00 0x00 0x00 0x00时钟输出0x00 0x00 0xa4 0x00 0x00 0x00。

    或者、您是说我需要发送后续命令吗? 什么命令? 有命令吗?

    我尝试发出第二个 FIFO_M2D 读取:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x18 0x21。 我在 TeraTerm 中键入了'A'(0x62)。 'A'在哪里?

    我在 TeraTerm 中键入了"b"、得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x18 0x62。 好的、这更好...

    我在 TeraTerm 中键入了"c"、然后得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x18 0x63。 好的。

    我在 TeraTerm 中键入了"c"、然后得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x18 0x63。 好的。

    我在 TeraTerm 中键入了"d"、并得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x18 0x64。 好的。

    我在 TeraTerm 中键入了"e"、并得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x19 0x65。 还可以、但奇偶校验位?

    我在 TeraTerm 中键入了'f'、得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x19 0x26。 不正常。

    我在 TeraTerm 中键入了"g"、得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x19 0xe6。 不正常。

    我在 TeraTerm 中键入了"h"、得到:

    第一个读取命令:0xa4 0x00 0x00、我返回0x00 0x00 0x00。 第二次请求0xa4 0x00 0x00、然后返回0xa4 0x19 0x70。 不正常。

    好的、现在该怎么办?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    SPI 读取操作需要48个 SCLK 周期。 前24个是读取命令、后跟地址和"无关"位。 在接下来的24个 SCLK 周期中、请求的数据将由包含寄存器数据的低16位 SDO 输出。 这可能是当地址在 SDI 中计时时读取 SDO 时、第一次读取时会收到零的原因。 如果发出读取命令、SDO 始终为之前写入的 SDI 数据或寄存器数据计时。

    当您回读时、正确的值有时会出现在 FIFO 中。 我想知道输入 HART 信号是否存在问题。

    -当您读取错误值时、您能否提供 MOD_IN/MOD_INF 输入信号的示波器捕获? 您是否正在使用内部滤波器?
    -上面显示错误的特定字符在传输时是否总是产生相同的错误?

    谢谢、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用内部滤波器。

    从 FIFO 读取字符的正确方法是发送6个字节、命令字节0xa4、两个无关字节和另外三个无关字节、总共6个字节?

    不。

    如果我发送0xa4 0x00 0x00 0x00 0x00 0x00 0x00、则时钟回位的字节为0xa0 0xc0 0x24 0xa4 0x00 0x00。

    下一个字符... 我发送0xa4 0x00 0x00 0x00 0x00e2e.ti.com/.../IR4-HART-screenshots.docx 0x00时钟回位的字节为0xa0 0xc0 0x24 0xa4 0x00 0x00。

    第三个字符... 0xa4 0x00 0x00 0x00 0x00 0x00 0x00时钟回位的字节为0xa0 0xc0 0x84 0xa4 0x00 0x00。

    从那时起、IRQ 线路再也不会变为高电平。

    如果我为 FIFO_M2D 读取命令计时六个字节、则芯片停止升高 IRQ 线路。 如果我复位并重新启动、有时我会在芯片停止升高 IRQ 之前获得三个字符、有时它只是一个字符。

    如果我发送一个三字节 FIFO_M2D 命令(0xa4 0x00 0x00)、然后发送第二个三字节 FIFO_M2D 命令(0xa4 0x00 0x00)、我将获得大约50%的时间和另50%的时间为垃圾。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../IR4-HART-screenshots_2C00_-bad-char.docxHere's我在 TeraTerm 中键入"9"并接收到0xce 的屏幕截图。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 问题似乎已解决。
    1.今天下午,我收到了一个 MACTek RS-232转 HART 调制解调器。 它的行为比 Endress + Hauser 要好得多。 不再有垃圾字符。
    2.当我读取 FIFO_M2D 寄存器时、我发送三个字节:0xa4 0x00 0x00、SPI 总线时钟在0x00 0x00;接下来、我发送另一条具有三个字节的 SPI 消息: 0x00 0x00 0x00 SPI 总线时钟位于0xa4 0x19 0x33、其中0x33是我从 TeraTerm 发送的字符。

    我希望这个信息能让我经历的痛苦中的下一个人得到缓解。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    我很高兴你解决了这个问题。 如果您需要更多支持、请告知我们。

    谢谢、
    Garrett