Other Parts Discussed in Thread: HDC2010, MSP430FR5994
主题中讨论的其他器件:HDC2010、
对于我们的硬件,我们在 I2C 主模式下使用 MSP430FR5994的端口 B2与电池供电设备上的 HDC2010湿度传感器进行通信。 我们在电路板上遇到了一些罕见的情况,在这些电路板上 MSP430会锁定,电池会耗尽。 我们终于发现了 I2C 主机接收模式的问题。 在 MSP430 TI 驱动程序(版本2.20.00.08)的 I2CEUSCI.c 文件中、在函数 I2CEUSCI_hwiIntFxn ()中、第315至325行如下:
/*
*通过发送来在主机接收模式下启动 I2C 传输
*起始位和停止位、因为它是最后一个字节
*
eUSCI_B_I2C_masterReceiveStart (hwAttrs->baseAddr);
while (eUSCI_B_I2C_masterIsStartSent (hwAttrs->baseAddr));
EUSCI_B_I2C_masterReceiveMultiByteStop (hwAttrs->baseAddr);
Log_Print1 (Diags_User2、"I2C:(%p) I2CEUSCI_WRITE_MODE:-> I2CEUSCI_READ_MODE;"
"读取时重新启动并停止"、
hwAttrs->baseAddr);
MSP430偶尔会无限期停留在上面代码中的 while 循环上。 它启动 I2C 启动、但它从未看到启动被发送的确认。 在一些电路板上、这种情况比其他电路板更经常发生;在某些高/低环境温度情况下、某些电路板的情况也更频繁发生。 我认为、正确的解决方案是对 while 环路设置计数限制、然后在发生故障时中止传输。 但是,我们不确定该位置是否有合理的环路限制计数。 我假设有一个基于 I2C 时钟速度的合理限制,但我不确定它是什么。 您是否有基于 I2C 总线设置的建议限值、或其他可能适用的方法?
我还在 I2CEUSCI_primeTransfer()中看到类似的循环。 ISR 中有意义的任何解决方案也应应用于 I2CEUSCI_primeTransfer 中。
