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.
您好!
在我的项目中、我使用 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、顶部中间]。
所以、很明显、传感器(目标)好像是出于没有明显原因而永远拉伸时钟。 我可以问一下这是什么传感器吗?