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.

[参考译文] MSP430FR2355:I2C 挂起、使用 driverlib:如何写入9个时钟周期以复位 I2C 总线。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1206905/msp430fr2355-i2c-hanging-using-driverlib-how-to-write-9-clock-cycles-in-order-to-reset-the-i2c-bus

器件型号:MSP430FR2355

您好!

在我的项目中、我使用 MSP430驱动程序库与传感器进行通信。  一切都运行正常、除非经过一段时间(小时)后、 I2C 通信最终将暂停。  

我正在使用一个具有飞线的开发系统、该系统将 CPU 板连接到传感器板、 因此我毫无疑问、噪声可能会是一个问题。  无论硬件如何改进、我都需要保护我的软件免受任何潜在挂起的影响。  

从 googleing 来看、I2C 挂起似乎并不完全是一个罕见的问题、从 I2C 死锁中恢复的一种方法是通过在 SDA 线路上观察 ACK 的同时将9个时钟周期强制到 SCL 线路来重新启动接口。  

我在驱动程序库中没有看到用于此目的的方法。  是否有人建议或有关如何执行此操作的代码片段?

提前感谢您的任何帮助。

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

    这里是它悬挂的函数、以供参考。  我的目标是在 while 循环中设置一个超时、并在那里重新启动接口。   

    uint8_t i2c_read_one_byte (uint8_t index){

      uint8_t rxData;

      无符号字符状态;

      EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、

                       索引

        );

      //延迟到传输完成

      while (EUSCI_B_I2C_isBusBusy (EUSCI_B0_BASE);//<—— 此处挂起

      //轮询方法

      rxData = EUSCI_B_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);

      返回 rxData;

    }

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

     您能(通过示波器等)判断总线上发生了什么情况吗?

    如果传感器(目标)侧使 SCL 保持为低电平、则通过总线可以做的事情不多、因为在这种情况下、无法强制 SCL 为高电平。 I2C 规范[UM10204 Rev 7、第3.1.16节"总线清除"]非常明确地指出了这一点,并建议对目标进行某种(带外)电源/复位控制。

    SendSingleByte 和 ReceiveSingleByte 对 Nacks 的处理能力并不好、因此有时该掩码会伪装成总线挂起。 您可能需要检查忙环路中的 UCNACKIFG。

    [编辑:我忘了回答你的实际问题。 eUSCI 没有可用于9个时钟复位的内置机制、因此您需要将引脚(主要是 SCL)切换为 GPIO 输出、将其切换9个周期、然后将其设置回交替功能。 如果只有 SDA 保持低电平、这可能会有所帮助。]

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

    谢谢你的答复。

    首先、我在 while 环路中进行检查、 在故障期间 UCNACKIFG 没有触发。  

    第二, 花了一天的大部分时间,但我终于能够捕捉到一个失败的消息在范围.  在这里、您可以看到 地址先是有效的起始位、然后 是8位、但主机永远不会发送 ACK 信号的第9个时钟。  在这一点后、SDA 和 SCL 都保持低电平。   我想从器件必须 将 SCL 线保持在低电平 、这意味着我无法像我希望的那样使用9个时钟周期进行复位。

    遗憾的是、该传感器芯片没有复位引脚、因此我需要 控制进入芯片的电源才能对其进行复位。  由于必须添加组件 以切换电源、并且为传感器提供单独的 Vcc、因此 我更倾向于说旋紧它、在项目中使用 SPI、而不是 I2C。


    (SDA 为橙色/顶部、 SCL 为绿色/底部)

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

    此波形(也)与主器件请求启动但不加载 TXBUF 的情况一致。 但 SendSingleByte 的构建方式确实会加载 TXBUF、而且不会在地址字节上的 ACK 之前返回[请参考用户指南(SLAU445I)图24-12、顶部中间]。  

    所以、很明显、传感器(目标)好像是出于没有明显原因而永远拉伸时钟。 我可以问一下这是什么传感器吗?