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.

[参考译文] MSPM0G1507:在快速模式 (400kHz) 下进行通信时、控制器侧会在重复启动操作中将数据移位 1 个字节

Guru**** 2894990 points

Other Parts Discussed in Thread: MSPM0G1507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1638647/mspm0g1507-when-communicating-in-fast-mode-400khz-the-controller-side-shifts-the-data-by-1-byte-in-repeated-start-operation

部件号: MSPM0G1507

h iexperts、

这是下述主题的延续。
(1) MSPM0G1507:在快速模式 (400kHz) 下通信时、控制器侧会将数据移动 1 个字节。 -基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 

我已确认客户的实际使用情况。 MSPM0G1507 将用作目标器件、控制器可以执行正常的启动/停止通信和重复的启动通信。

在实际用例中、这不是回波操作。 如下图所示、从控制器接收到的数据被视为地址信息、目标器件从最后接收到的数据字节所指示的地址开始返回存储在其地址空间中的数据。 因此、目标器件每次接收数据时、都需要提前将相应的数据移至 TXFIFO 中。

考虑到这一点、尽管这是一个反复出现的问题:
问:使用重复启动时、作为在重复启动触发之前准备 TXFIFO 的一种方法、在 RxFIFO 触发时序(阈值= 1)时将数据移至 TXFIFO 是否存在任何问题? 如果有任何其他推荐的方法、请告诉我。

作为参考、我修改了随附的程序原始线程、以便在 RxFIFO 触发时(阈值= 1)将数据移至 TXFIFO。 如果您能告诉我这种方法是否有任何问题或是否有其他建议的方法、我将不胜感激。

e2e.ti.com/.../i2c_5F00_target_5F00_rw_5F00_multibyte_5F00_fifo_5F00_interrupts.c

此致、
正常

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

    尊敬的 O.H:

    我不确定我是否理解正确、当 I2C 目标器件中接收到第一个 RX 字节时、您想填充 I2C TXFIFO、这样在重复启动情况下、I2C 数据将在“R“序列之前准备就绪、我是对的吗?

    这听起来不错、请注意在首次填充 TXFIFO 之前刷新 TXFIFO。 您是否在这个逻辑上进行了测试、并解决了任何问题?

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

    谢鹏飞

    感谢您的答复。

    我不确定我是否理解正确、当 I2C 目标器件中接收到第一个 RX 字节时、您要填充 I2C TXFIFO、因此在重复启动情况下、I2C 数据将在“R“序列之前准备就绪、我对吗?

    基本正确。 更准确地说、我对于 接收 RX 字节的确切时序并不特别。 只要 在重复 START 事务中的“R“序列之前准备了 I2C 数据、任何时序都是可以接受的。

    听起来不错、请注意在首次填充 TXFIFO 之前刷新 TXFIFO。 您是否使用此逻辑进行了测试并解决了任何问题?

    此时、我还没有看到实际行为中存在任何问题。
    我提出的原因是、我想确认 TI 是否有适合此用例的推荐方法、以及该方法是否存在任何潜在的问题或疑虑。

    此致、
    正常

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

    谢鹏飞

    很抱歉耽误你。 是否有其他意见或信息?

    此致、
    正常

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

    嗨、O.H

    很抱歉晚才回复。

    请注意、在读取重复开始命令的序列之前、您只需确保 TX 数据准备充分。

    我这边只有一条注释、如果 TX 数据是固定的、那么您可以在控制器读取 TX 数据之前随时准备该数据。 但是、如果此 TX 数据可由应用程序更改或应根据从控制器接收到的数据而有所不同、则最好在从控制器接收到重复启动命令的第一个字节时准备 TX 数据。

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

     谢鹏飞

    感谢您的答复。

    然后、当从控制器接收到 REPEAT START 命令的第一个字节时、最好准备 TX 数据。

    如果“在接收到重复启动命令的第一个字节时准备好 TX 数据“、则移入 TX FIFO 的数据移位无法及时完成、从而导致 1 字节移位。 这正是我们所面临的问题、正因为如此、我们才提出这个问题。

    背景情况下、当使用示例工程作为 400kHz 的基地并同时使用 STOP+START 和重复 START 时、我们遇到了数据按 1 个字节移位的问题。
    对于 STOP+START (400kHz)、我们根据您对 另一个线程 的回答了解、TI 推荐的解决方案是在 STOP 中断时准备 TX 数据。

    对于重复启动 (400kHz)、TI 是否有任何建议的使用方法或建议的实现方法? 或者是否没有具体的推荐方法?
    目前、我是否可以考虑使用当前方法(在 RxFIFO 触发时间(阈值= 1)将数据移动到 TX FIFO)、这是推荐的方法?

    硬件支持高达 1MHz 的通信。 如果您已经在 400kHz 或更高频率下执行了通信测试、如果您能分享在这些情况下适用的任何操作方法或实现方法、我将不胜感激。

    此致、
    正常

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

    尊敬的 O.H:

    根据您的当前代码、看起来从 TXFIFO 以“R“序列发送的数据与 RX 缓冲区中先前接收到的数据相同。 如果这是您在应用中所需的功能、那么您当前的实现将会很好、我这边没有其他建议。

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

     谢鹏飞

    感谢您的答复。

    我知道这种情况没有特别推荐的方法、需要根据实际操作对其进行评估和确认。

    如果您对此有任何信息、请告诉我您的团队是否使用 400kHz 或更高频率的重复启动进行了通信测试? 示例工程似乎基于 100kHz。
    此致、
    正常
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否打算在不进行时钟延展的情况下执行此操作(如另一个线程中所述)? 时钟延展是 I2C 中的主(可以说是唯一的)流控制机制。 如果没有流量控制、总会有竞争。 重复启动情况下的竞态幅度为 (1+8+1) 个位时间、或 400KHz I2C 时为 25usec-32MHz 时为 800 个 SYSCLK、但这包括任何唤醒时间。

    您的图表似乎描述了“寄存器“(或可能是“EEPROM“)模型的一个非常受限的版本、其中:

    1) 不写入数据、因此每次写入时为 3 个字节(存储器地址)。

    2) 每次写入之后、都会读取一个已知长度。

    如果是、您的 Rx 代码可能会计数到 3 并立即开始填充 TXFIFO。 如果没有 (2)、这可能会在 TXFIFO 中留下过时的数据;I2C 单元中有一种机制来处理此问题、但它需要时钟延展才能工作。 如果没有 (1)、目标将不知道在后续启动中的 R/W 位之前是否有读取操作、因此竞速幅度约为 0。

    或者、您可能需要停止(无重复启动)和控制器中停止 (W) 和启动 (R) 之间的人工延迟。 这有一些先例(虽然相当罕见),它只是改善了比赛,而不是消除它。