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.

[参考译文] I2C_TRANSFORT()阻止任务和如何恢复

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/616357/i2c_transfer-block-the-task-and-how-to-recover

你(们)好

   我正在与MSP432合作。 使用 simplelink_msp432_sdk_1_30_00_40中提供的I2C驱动程序时,我发现一旦i2c传输异常,该任务将被阻止。  

我跟踪代码,代码在 I2C_TRANSFORT()中被阻止。  

  因此我想知道如何从异常状态恢复i2c,因为没有超时方法,也没有取消初始化驱动程序接口,我在SDK中找不到这种方法。  

  确实需要您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在I2CMSP432.c文件中,我找到I2CMSP432_TRANSFORT(),它最终被I2C_TRANSFORT()调用。

    <code I2CMSP432_transfer()>
    如果(object->transferMode == I2C_MODE_blocking){
    DebugP_log1 ("I2C:(%p) Pending on transferComplete semaphore",
    hwAttrs->baseAddr);
    /*
    *在此处等待传输完成。
    *可以从这里阻止,因为I2C的Hwi将取消阻止
    *出错时
    */
    SemaphoreP_Pend(object->transferComplete, SemaphoreP_wait_forever);

    DebugP_log1 ("I2C:(%p) Transaction completed",hwAttrs->baseAddr);

    /* Hwi句柄已发布'transferComplete'错误检查*/
    如果(object->mode == I2CMSP432_IDLE_MODE){
    DebugP_log1 ("I2C:(%p) Transfer OK",hwAttrs->baseAddr);
    RET =真;
    }
    }


    SemaphoreP_Pend(object->transferComplete, SemaphoreP_wait_forever)将在没有transferComplete信号POST时永久阻止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人回答我的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我对拖延的类型。 输入问题时,请确保输入正确的MSP432部件号。

    正如您已经指出的,目前I2C API中没有内置超时机制。 如果i2c挂起,我建议使用计时器或watch dog超时。

    此致,
    Chris