请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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
