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.

[参考译文] MSP430FR5969:eUSCI I2C -零字节非阻塞 I2C 读取

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/694226/msp430fr5969-eusci-i2c---zero-byte-non-blocking-i2c-read

器件型号:MSP430FR5969

您好!

我最近一直在为公司的一款产品研发 I2C 驱动器接口。 控制固件构建在 MSP430FR5969之上、并利用为 I2C 配置的 eUSCI B0。

我在设计高速非阻塞 ISR 状态机方面投入了大量精力、到目前为止、它在大约500kHz 之前完全稳定。  

固件仅针对主器件进行配置、硬件配置已由我们的电气工程团队进行验证。

当前的问题是、无论如何配置第一个字节事务、我都能看到相同的接收行为。 如果我将 UCTXSTT 置为有效并对 UCRX0IFG 做出反应、那么我知道这是预期的。 如果我同时使能这两个引脚(UCTXSTT | UCTXSTP)、即使在启用 I2C 线路或中断之前、我也总是在从器件 ACK 后接收一个字节。 用户指南提到只有在 UCTXSTT 未被置位时、才会在 ACK 之后接收到从器件数据;我的问题是、为什么我仍然在另一个字节中计时? 我们的设备对零字节读取*和*写入的反应不同。 如何使用 eUSCI 模块实现完全非阻塞的零字节读取?

此外、是否有关于使用 eUSCI 的非阻塞 I2C 的更详细的参考? 我能够找到的 TI 示例受到严格限制、缺乏边沿大小写和错误条件逻辑。 FSM 图将令人难以置信!

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

    我将获得一个设置、以重现您看到的内容、然后我们可以进一步深入探讨。 为了澄清一下、双接收问题是在所有 I2C 时钟速率下发生、还是仅在达到500kHz 时发生? 此器件上的 I2C CLK 最大规格为400kHz。

    此致、
    Walter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当同时置位(UCTXSTT | UCTXSTP)时、我始终至少接收一个字节、无论速度如何、所有测试都以50kHz 的频率执行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的澄清、Quinn。

    Walter

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

    当您提到零字节读取和零字节写入时、您是否只是尝试发送 START -> ADDR/RW -> STOP 序列、而实际上根本不传输任何数据? 换句话说、您只是寻址一个从器件、获取 ACK、然后中止事务?

    或者、是否正在运行 START -> ADDR/RW-BYTE0 -> STOP 序列、在该序列中、您只在寻址发生后读取/写入一个字节?

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

    在倾注用户指南、论坛帖子和数据表之后,我希望开始-> ADDR/RW ->停止*读取和写入位,

    WRITE 按预期工作,但读取*ALYS* 会导致第二种情况:START -> ADDR/RW-BYTE0 -> STOP。 如果我同时设置 STT 和 STP、我总是接收一个字节。 现在、我们将研究两个选项。  

    将所有零字节读取转换为零字节写入

    2.阻止所有零字节读取。

    理想情况下、我们希望实现 void 读取和 void 写入  

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

    我更深入地探讨了这个问题、我认为没有办法使用 eUSCI 实现硬件无效读取。 您需要通过控制 IO 手动执行此操作。

    这不是一个常见的 I2C 用例、如果从器件不知道如何处理它、实际上可能会很棘手。 从 I2C 规范的角度来看、在主接收器模式下、应在 STOP 声明之前有一个主 NACK。 这是为了防止冲突、因为如果从器件希望为接下来读取的 MSB 输出一个低电平值、从器件可以在 ADDR/RW 从器件 ACK 之后的下一个时钟上保持 SDA。 在这种情况下、主器件将无法提供停止条件、您可以将总线挂起。 因此、最好始终在主接收器发送 NACK 后跟随 STOP 的情况下运行虚拟读取。 在主发送器情况下、从器件不会在 ADDR/RW 从器件 ACK 之后的下一个时钟上控制 SDA、因此可以在该点安全地发送 STOP。

    出于好奇、在这种特定情况下读取零字节的需求是什么? 您是否有需要支持此行为的从器件? 如果是,我想知道,这样我们就可以在将来考虑这一点。 我必须承认、这不是我在我的经验中遇到的请求、因此了解使用案例的要求将会很好。

    如果我对飞利浦规范的解释有误,社区成员也可以随时跳进来,并为我纠正错误。

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

    沃尔特

    我们的 EE 团队为我们的各种通信接口设计了定制路由接口。 I2C 切换到不同的板(每个板具有相同的从地址组)。 开关器件根据发出的地址和 R/W 位重新配置自身、但不是真正的 I2C 从器件。 这些器件充当大型多路复用器、可将数据传递到逻辑、从而进一步处理和路由 I2C 数据。

    似乎没有彻底审查硬件实现、因为设计人员假设 MSP430FR5969的 eUSCI 模块可以进行空读取和空写入。 如果绝对无法发送从器件地址和 R/W NACK、则我们可能需要审查设计。 我们希望避免在每次交易中都将 eUSCI 重新配置为 GPIO、因为我们批准后制造软件更改的过程非常冗长。GPIO 解决方案已经过讨论、并不理想。

    我还被认为最大 I2C 时钟速度是 MCLK 频率的1/4。 这不是真的吗?

    谢谢、

    Quinn

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

    您好、Quinn、

    我将进行一些额外的挖掘以确保、但现在我看不到执行无效读取的方法。  空写入不是问题。

    [引用用户="Quinn Mikelson">我也觉得最大 I2C 时钟速度是 MCLK 频率的1/4。 这不是真的吗?

    您是否有指向提及此内容的文档的链接?  下面是澄清最大 I2C SCL 频率的数据表规格。

    Walter

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

    我想再次与您结束联系。 我可以确认 eUSCI 不支持硬件零字节读取、因此这实际上是对您的限制。 我与另一位有关 eUSCI_B 的专家进行了核对、只是为了确保结果。 此外、如上所述、SCL 限制为400kHz。

    如果还有其他任何我可以帮助的东西、请随时告诉我。

    此致、
    Walter