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/MSP430F5529:I2C 驱动器块

Guru**** 2589275 points
Other Parts Discussed in Thread: TMP006, MSP-EXP430F5529LP, MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/622524/rtos-msp430f5529-i2c-driver-block

器件型号:MSP430F5529
主题中讨论的其他器件:MSP-EXP430F5529LP

工具/软件: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 (&params);
    params.transferMode = I2C_MODE_callback;
    params.transferCallbackFxn = someI2CCallbackFunction;
    Handle = I2C_open (someI2C_configIndexValue、&params);
    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。

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

    只需确认一下、您是在回调模式下使用该驱动程序、但它仍会阻止您在上面指定的部分代码?

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

    您好!

    如果 没有器件连接到 I2C 总线、则回调和块模式将在部分阻止

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

    您好!  

    如果驱动程序在使用回调模式时仍处于阻塞状态、则需要为其阻塞的代码部分创建超时。 这可以使用 MSP430F5529定时器之一来完成、以便在指定的时间段内进行计数、然后在超时后从环路中中断。 如果您需要更多的帮助来实施这样的操作、请告诉我您需要帮助的地方、我们可以在那里工作。  

    此致、  
    Caleb Overbay