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 模式下使用 DAC8742H 时、通过 SPI 读取 Rx FIFO 时出现问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/987444/dac8742h-issues-reading-from-the-rx-fifos-over-spi-when-using-the-dac8742h-in-hart-mode

器件型号:DAC8742H

在 HART 模式下使用 DAC8742H 时、客户在通过 SPI 读取 Rx FIFO 时遇到问题、尽管它们似乎能够向 Rx FIFO 发送数据并启动 HART 传输。

在该系统中、SPI 时钟为~500kHz、连续 SPI 帧之间的间隔大于3usec。 SPI 读取请求间隔为60us、因此这大大超过了 SPI 帧之间所需的最小值2.442us

在 测试 代码中、它们发送两个连续的 MODEM_STATUS 读取请求:0xA00000

在发送第2个读取请求期间接收到的响应是0xA04044、表示 FIFO_M2D 已满、FIFO_D2M 为空。

它们发送4个连续的 FIFO_M2D 寄存器读取请求:0xA40000

收到的答复是:
0x04044
0xA405FF
0xA405FF
0xA405FF

4的第一个是来自第二个状态读取请求的响应。

其他3个响应指示 FULL_FLAG 和 FIFO_LEVEL = 0。 他们假设 FIFO_LEVEL 只是溢出、不能表示16的填充级别。 但是、为什么报告的 FIFO_LEVEL 不会随着每个连续读取请求而递减? 此外、HART 数据字节始终为0xff、而不管它们尝试读取的字节数量如何。

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

    您好、Jonathan、

    他们能否使用示波器捕获 SPI 帧、以确认时序和边沿关系是否正确?

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

    捕获并连接 SPI 帧的开始。  D0是 ChipSelect; D1是 SCLK (位拆裂、因此不完美); D2是 SDI (MOSI); D3是 SDO (MISO)。  SCLK 频率为~500kHz。

    在 SCLK 的上升沿之后、I 转换 MOSI 数据、并在 SCLK 的下降沿对 MISO 数据进行采样。

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

    Bill、


    很抱歉、我没有机会更早地查看这一点、但我没有看到基本 SPI 有什么问题。 对于该器件、数据在 SCLK 的上升沿进行设置、并在下降沿随时钟移入和移出器件。 除此之外、您的 SPI 以500kHz 的频率运行、 这有点慢、无法真正解决任何其他时序问题。

    明天我将再次回顾这一点、看看我是否可以提出要检查的内容。

    吴约瑟

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

    有更新吗?  我无法自行解决问题。   

    我确认了在发送 HART 命令时、寄存器写入的 SPI 回波匹配、从而确认 SPI 接收路径正常运行。 此外、现场 HART 器件会按预期响应我的命令、从而进一步确保 SPI 写入过程正常工作。

    我已经连接到该器件的 EVM 板和自定义集成。 在这两个器件上观察到相同的结果。  此外、我还能够使 UART 模式在 EVM 和自定义集成平台上正常工作。  遗憾的是、我需要 SPI 操作、但它不起作用。

    您能否确认我的上述简单测试程序是否有效?  也就是说、是否发送 MODEM_STATUS 读取请求、然后发送多个 FIFO_M2D 读取请求?  此外、是否预计在设置 FULL_FLAG 时会将 FIFO_LEVEL 报告为0?

    当我询问问题时、为响应 FIFO_M2D 读取请求而报告的 FIFO_LEVEL 是否指示报告的数据值之前或之后的级别(即、从完整 FIFO 读取时、报告的 FIFO 级别15或16/0)?

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

    Bill、

    很抱歉、很多事情都在进行、所以我最近在所有支持方面都有点落后。 我曾与设计人员讨论过这个问题、但我没有机会真正查看他们的回答。 我明天会回来。

    吴约瑟

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


    Bill、

    我使用 EVM 运行了快速测试、将器件设置为 SPI 模式。 对于 HART 写入、我设置了一个16字节的阵列以发送到器件:

    0f 1F 2F 3F 4F 5F 6F 7F 8F 9F AF BF CF DF EF FF

    然后、我生成该写入。 然后、我开始对单个字节01的另一次写入、这样我一定会填充缓冲区。

    当我开始读取时、接收到040F、表示缓冲区已满。 接下来的读取会经过缓冲器的元素。

    A4F01F A4E02F A4D03F A4C04F A4B05F A4A06F A4907F A4808F A4709F A460AF A450BF A440CF A430DF A420EF A1010

    最后、当缓冲区变空时、我得到 A4020F。 后续读取返回缓冲区的最后一个元素、因此该读取不会改变。 最后两次读取看起来是交换的、所以我需要仔细检查一下、看看这是 GUI 中的伪影还是其他的东西正在进行。

    无论如何、FULL 缓冲器由 FULL_FLAG 指示、并且 FIFO 电平为0。 我要注意的是、当我通过缓冲区进行读取时、从这一完整读取到下一组16次读取、我确实有相当长的时间。 当我检查设计时、他运行了一个快速仿真、该仿真表明 FULL_FLAG 也显示 FIFO 电平为0、然后后续读取会使 FIFO 电平输出递减。 他已经经历了一组四次 FIFO_M2D 读取。

    吴约瑟

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

    显然、我有一个根本问题、因为我甚至无法复制您的实验。  我假设您在 FIFO 回路模式下使用调制解调器。

    是否可以向我发送完整的 SPI 传输帧和相应的读取帧集、包括所有配置消息?  请发送完整的帧信息(即3字节)、而不仅仅是数据字节。  我将执行该精确序列作为测试。

    谢谢。

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

    Bill、

    我有一个逻辑分析仪、并查看进出器件的 SPI。 我基本上重复了我上面解释过的同一个实验。 除非您只对器件进行另一次写入、否则 GUI 似乎不允许您向 FIFO 写入太多字节。 序列如下所示:

    字被~10ms、SCLK ~48kHz 分隔

    写入器件:
    DIN:25 00 0F
    DIN:23 00 0F
    DIN:23 00 1F
    DIN:23 00 2F
    DIN:23 00 3F
    DIN:23 00 4F
    DIN:23 00 5F
    DIN:23 00 6F
    DIN:23 00 7F
    DIN:23 00 8F
    DIN:23 00 9F
    DIN:23 00 AF
    DIN:23 00 BF
    DIN:23 00 CF
    DIN:23 00 DF
    DIN:23 00 EF
    DIN:22 00 0D //无 FF 写入
    DIN:22 00 0C
    现在再写入一个字节:
    DIN:25 00 01
    DIN:23 00 01
    DIN:22 00 0D
    DIN:22 00 0C

    现在开始读取。 我向 GUI 询问了16位、但它发现 FIFO 已满、并停止了读取。
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 04 0F //FIFO 满

    然后、我请求另一个读取。 读取成对。 对间隔~10ms、每次读取间隔~150ms
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 F0 1F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 E0 2F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 D0 3F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 C0 4F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 B0 5F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 A0 6F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 90 7F
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 80 8F
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 70 9F
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 60 AF
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 50 BF
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 40 CF
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 30 DF
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 20 EF
    DIN:A4 FF 00 00 00
    DOUT:FF FF A4 10 00
    DIN:A4 FF 00 00 00
    DOUT:FF FF FF A4 02 0F

    吴约瑟

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

    您好、Joseph、

    在您的商品信息的帮助下、我终于解决了问题、尽管复制您的结果需要一段时间。 回送测试的一个关键要素是回送仅在 RTS 启用后发生、并且似乎以 HART 速率计时(即每~9.2msec 一个字节)。 事后看来、这是合理的、但肯定没有记录在数据表中。

    解决我的问题的关键在于观察到您使用 NOP 函数(0x00 00 00)时钟输出每个 FIFO 读取请求(0xA4 FF FF)的结果。 虽然这是可以的,但它显然没有按数据表的要求记录... 实际上、情况正好相反。 第7.4.5.2节的第2段包含这样的语句:"SDO 将始终提供来自前一帧的信息、如果前一帧是读取的、则输出数据将是请求的数据。" 这种说法显然是错误的、必须使用 NOP 命令来获取读取命令的结果。

    我感到非常震惊的是,以前没有人遇到过这个问题。 请发布数据表勘误表。

    -Bill

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

    Bill、

    感谢您的回答。 我很高兴您能够从器件中获取数据。 我将尝试对数据表进行编辑、以使其更清晰。 通常、我们没有勘误表。 我们会收集此类更新和错误、并在能够时将修订版本滚动到数据表中。

    如果您有任何其他问题或意见、请告诉我。 您可以随时发布或启动另一个线程。


    吴约瑟