主题中讨论的其他器件:MSP-EXP430F5529LP、
工具/软件:TI-RTOS
您好!
当我使用 RTOS I2C 驱动程序时、如果 I2C 器件未连接、程序将会阻止。 如果我 的计算机的 i2c 设备出现故障、计算机将挂起、因为 i2c 驱动程序块。 不能接受。
是否有任何具有超时示例的 RTOS I2C 驱动程序?
tirtos_msp43x_2_20_00_06和 BIOS_6_46_00_23
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.
工具/软件:TI-RTOS
您好!
当我使用 RTOS I2C 驱动程序时、如果 I2C 器件未连接、程序将会阻止。 如果我 的计算机的 i2c 设备出现故障、计算机将挂起、因为 i2c 驱动程序块。 不能接受。
是否有任何具有超时示例的 RTOS I2C 驱动程序?
tirtos_msp43x_2_20_00_06和 BIOS_6_46_00_23
您好!
您可以在阻塞模式或回调模式下使用 I2C 驱动程序。 您可以在 此处找到有关 I2C 驱动程序及其使用方法的完整说明。 此外、您可以通过以下链接找到有关所有 TI RTOS 驱动程序的信息:
此致、
Caleb Overbay
您好、 Caleb
我使用示例 I2C_TMP006、使用 MSP-EXP430F5529LP。
如果我不连接 I2C 器件、程序将会阻止。
在 I2CUSCIB_TRANSFER ()函数、 Semaphore_pend (Semaphore_handle (&(object->transferComplete))、BIOS_wait_forever)上阻止程序、如下所示:
/* * I2CUSCIB_primeTransfer 是一个更长的过程 *需要对 I2C 中断进行保护 * USCI_B_I2C_DisableInterrupt (hwAttrs->baseAddr、all_interrupts); I2CUSCIB_primeTransfer (object、hwAttrs、transaction); USCI_B_I2C_enableInterrupt (hwAttrs->baseAddr、all_interrupts); if (object->transferMode =I2C_mode_blocking){ Log_Print1 (Diags_User1、"I2C:(%p) Pending on transferComplete Semaphore"、 hwAttrs->baseAddr); /* *在此处等待传输完成。 *可以从这里阻止、因为 I2C 的 Hwi 将解除阻止 *出错时 * Semaphore_pend (Semaphore_handle (&(object->transferComplete)))、 BIOS_wait_forever); Log_Print1 (Diags_User1、"I2C:(%p)事务已完成"、 hwAttrs->baseAddr); /* Hwi 句柄已发布错误的"传输完成"检查*/ if (object->mode =I2CUSCIB_IDLE_MODE){ log_Print1 (Diags_User1、"I2C:(%p)传输确定"、hwAttrs->baseAddr); RET = true; } } 否则{ 如果处于异步模式,则/*始终返回 true */ RET = true; }
您好!
如前所述、您可以在阻塞模式或回调模式下使用 I2C 驱动程序。 您可以在您发布的代码中看到此检查:
if (object->transferMode =I2C_mode_blocking){
您提到的示例是在阻塞模式下使用驱动程序。 因此、在打开 I2C 驱动程序之前、您需要重新配置 I2C 参数、如我之前提供的链接中所述。 以下是在回调模式下设置驱动程序的链接中提供的示例:
I2C_Handle 句柄;
I2C_Params params;
I2C_Transaction i2cTransaction;
I2C_Params_init (¶ms);
params.transferMode = I2C_MODE_callback;
params.transferCallbackFxn = someI2CCallbackFunction;
Handle = I2C_open (someI2C_configIndexValue、¶ms);
if (!handle){
System_printf ("I2C 未打开");
}
此致、
Caleb Overbay
您好!
我按照该程序并找到位于红线以下的阻塞位置 while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG):
void USCI_B_I2C_masterSendMultiByteFinish (uint16_t baseAddress、
uint8_t txData)
{
//如果未使用中断,则轮询标志
if (!(HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE))
{
//轮询发送中断标志。
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
;
}
}
//发送单字节数据。
HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData;
//轮询发送中断标志。
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
;
}
//发送停止条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTXSTP;
}
在 I2CUSCIB_transfer 中(...) 函数
USCI_B_I2C_DisableInterrupt (hwAttrs->baseAddr、all_interrupts); I2CUSCIB_primeTransfer (object、hwAttrs、transaction); USCI_B_I2C_enableInterrupt (hwAttrs->baseAddr、all_interrupts);
将转到中断进程
void I2CUSCIB_hwiIntFxn (UArg 索引) { unsigned int 密钥; uint8_t intStatus; I2CUSCIB_Object *object =(&I2C_CONFIG[index]-->对象; I2CUSCIB_HWAttrs const *hwAttrs =(&I2C_CONFIG[index])->hwAttrs; /*获取 I2C 控制器的中断状态*/ intStatus = USCI_B_I2C_getInterruptStatus (hwAttrs->baseAddr、all_interrupts); Log_Print1 (Diags_User2、"状态寄存器:0x%x"、intStatus); /*清除中断源*/ USCI_B_I2C_clearInterrupt (hwAttrs->baseAddr、all_interrupts); 。
一 返回; }
intStatus 只获取 UCTXIFG、UCNACKIFG 将被忽略、因此程序将以粗体显示在 USCI_B_I2C_masterSendMultiByteFinish()函数上。
如果我在 intStatus = USCI_B_I2C_getInterruptStatus (hwAttrs->baseAddr、ALL_INTERRUPTS)行上使用断点、那么进入下一句、intStatus 将获得 UCTXIFG 和 UCNACKIFG。 从设置 I2C 开始到中断处理获取 intStatus 的时间不足以获取 UCNACKIFG。