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.

[参考译文] RTOS/MSP432P401R:如果总线未连接、I2C 传输会挂起

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/677895/rtos-msp432p401r-i2c-transfer-hangs-if-bus-not-connected

器件型号:MSP432P401R

工具/软件:TI-RTOS

我们正在使用 TI-RTOS/MSP432对项目进行各种故障测试、其中一项测试涉及器件在未连接上拉/器件的 I2C 总线下运行。 理想解决方案涉及到 I2C 传输失败、但控制返回到应用程序。

我们观察到没有 I2C 超时功能、因此我们实施了自己的。 遗憾的是、Semaphore_pend 不会出现超时。 在调试器中暂停代码时、我们发现代码悬挂在以下函数的第16行(在 i2c.c 中)。

bool I2C_masterSendMultiByteFinish (uint32_t moduleInstance、uint8_t txData)
{
//如果未使用中断,则轮询标志
IF (!BITBAND_PERI (EUSCI_B_CMSIS (模量)->IE、EUSCI_B_IE_TXIE0_OFS))
{
//轮询发送中断标志。
while (!BITBAND_peri (EUSCI_B_CMSIS (模态)->IFG、
EUSCI_B_IFG_TXIFG0_OFS))
;
}

//发送单字节数据。
EUSCI_B_CMSIS (模量)->TXBUF = txData;

//轮询发送中断标志。
while (!BITBAND_peri (EUSCI_B_CMSIS (模态)->IFG、
EUSCI_B_IFG_TXIFG0_OFS)
&&!BITBAND_PERI (EUSCI_B_CMSIS (模态)->IFG、
EUSCI_B_IFG_NACKIFG_OFS))
;
if (BITBAND_peri (EUSCI_B_CMSIS (模量)->IFG、EUSCI_B_IFG_NACKIFG_OFS)))
返回 false;

//发送停止条件。
BITBAND_PERI (EUSCI_B_CMSIS (模量)->CTLW0、EUSCI_B_CTLW0_TXSTP_OFS)=
1;

返回 true;
} 




突出显示的行是用于保护 I2C 传输和(理想情况下)产生超时的信标。

我们发现在 Semaphore_pend 超时之后/之后没有断点被到达、并且随机暂停调试器会显示它始终位于上面的第16行。 我们的 I2C 包装程序具有以下代码来实现超时。

//等待回调以发布 I2C 或超时的状态
if (Semaphore_pend (SEM_i2cTimeout、100)= 0){
//传输失败
I2C_CANCEL (句柄);
返回 false;
} 

我们将回叫函数设置为:

空 I2C:::ManageI2cTimeout (I2C_Handle handle、I2C_Transaction * i2c_transaction、
bool 成功){
if (i2c_transaction->arg!= NULL){
Semaphore_post ((semaphore_handle)(i2c_transaction->arg));
}
} 

但是、也未达到此函数中的断点。
对于如何在未连接总线或上拉电阻器时成功实现 I2C 超时、您有什么建议或建议吗?

提前感谢您、
Anthony

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

    最简单的方法是在 I2C 事务之前、将 GPIO 感测为逻辑电平1或0。 如果 SCL 和 SDA IO 都处于低电平、则表示没有上拉电阻。 至于没有从器件的情况、如果上拉电阻正确、那么一个传输将是 NAK'ed/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好、非常感谢您的回答和建议。
    我们当前在启动时初始化 I2C 外设一次、然后保持并重复使用对其的引用以运行时。 我认为 SCL/SDA 上的感应需要关闭总线、感应、然后针对每个事务重新打开。 这是正确的、如果是、频繁关闭/打开是否有任何缺点?

    是否有一种机制可以使总线保持断开状态并仍然执行所需的电压检测、或者这可能会导致未定义的行为?

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

    I2C 并不意味着即插即用、我从未见过这样的要求。 在系统启动时、客户最多可能希望测试一次总线、然后假设总线将保持电气连接。 您最多可以做的是、有一个周期性任务、该任务会转而设置信标以阻止 I2C 读取/写入、将 IO 更改为 GPIO 输入以进行检测、检测和检查、回调 IO 并解除对 I2C 任务的阻断。 但再说一次、I2C 不是即插即用的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Amit、所有都很好。 遗憾的是、我们处于总线故障的概率*严重程度足够大的情况下、我们需要尝试围绕其进行设计。 我认为、这足以让我们现在继续并继续我们的设计工作。

    再次感谢您抽出宝贵的时间提出建议;我们打算执行这些建议。
    Anthony