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.

[参考译文] MSPM0G3507:I2C NACK 控制器挂起

Guru**** 2394305 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1503883/mspm0g3507-i2c-nack-controller-hangs

器件型号:MSPM0G3507

工具/软件:

一旦将数据放入"DL_I2C_startControllerTransfer"过程中、并且 由于从器件 未响应、I2C 设置了 NACK。 因此、I2C 控制器将进一步挂起、无法 重新传输 数据。

while (DL_I2C_getControllerStatus (I2C_0_INST)& 
DL_I2C_CONTROLLER_STATUS_ERROR){

} 

发生错误后、这些 ERR、ADRACK、ARBLST 和 IDLE 标志都会被置位。

如何清除这些错误 标志并继续 I2C 主器件数据 再次重新传输。

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

    DL_I2C_startControllerTransfer()设置 stop、因此  I2C 单元已发出 Stop、事务已结束。 您可以继续操作、然后重新启动。

    我推荐:

    1)等待设置空闲、因为这不会立即发生[观察到的行为]

    2)在重新启动之前清空 TX 和/或 RX FIFO (根据需要)、因为这不会自动发生。

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

    尊敬的 Baskar:

    如果您调用"DL_I2C_startControllerTransfer"、它将自动生成 STOP 信号。

    通常、我们不会轮询错误状态来跟踪、看看 SDK 示例的作用:

        /* Poll until the Controller writes all bytes */
        while (DL_I2C_getControllerStatus(I2C_INST) &
               DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
            ;
    
        /* Trap if there was an error */
        if (DL_I2C_getControllerStatus(I2C_INST) &
            DL_I2C_CONTROLLER_STATUS_ERROR) {
            /* LED will remain high if there is an error */
            __BKPT(0);
        }
    
        /* Wait for I2C to be Idle */
        while (!(
            DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
            ;
    
    

    您可以在下面找到示例:

    I2C_CONTROLLER_RW_multibyte_fifo_poll.c

    B.R.

    Sal