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.

[参考译文] CCS/CCStudio:CSL I2C 读取/写入:NACK 和超时句柄

Guru**** 2587345 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635292/ccs-ccstudio-csl-i2c-read-write-nack-and-timeout-handle

器件型号:CCStudio

工具/软件:Code Composer Studio

根据"CSL_I2C_PollExample"、我正在使用 CSL I2C 写入和读取函数。

C5517器件、Ic55_CSL_3.04与 CCS5。

我注意到 CSL 函数处理开始和停止、但查看 CSL_i2c.c 文件中的代码、我觉得它会将 ICMDR 寄存器中的 START 和 STOP 位置为有效。 阅读 C5517参考手册、我了解一旦数据 I2C 数据寄存器为0 (传输所有数据)、就会发送停止位。

我的问题是:如果发生超时或 NACK (从器件无响应)、会发生什么情况? 如何处理超时/ NACK 条件? 我对此进行了测试、并使用示波器看到、一旦发生 NACK 或超时、SCL 保持低电平、BUSY 位= 1 (这是因为未发送停止条件!)。  

我需要使用 I2C 轮询模式。

谢谢、

Stefano

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

    这是 I2C 总线规范中的建议:
    '如果 SCL 或 SDA 线路一直处于低电平、则支持总线清零操作。 如果时钟线(SCL)一直处于低电平、则首选的步骤是在 I2C 器件具有硬件复位输入时使用硬件复位信号复位总线。 如果 I2C 器件没有硬件复位输入、则对器件循环供电以激活强制内部上电复位(POR)电路。 如果数据线(SDA)一直处于低电平、主器件应该发送九个时钟脉冲。 将总线保持在低电平的器件应在这九个时钟内的某个时间将其释放。 如果没有、请使用硬件复位或循环通电来清除总线。"

    您可以尝试此过程吗?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Yordan。
    我已经使用过这个解决方案、对我来说、这是脱离 SCL 低电平状态的唯一方法。 我希望 CSL 函数以某种方式处理它、但似乎用户必须在发生超时/ NACK 时手动复位 I2C。
    下面是我处理 NACK 和超时错误的方法:

    STATUS = I2C_WRITE (I2cWriteBuffer、Length、SlaveAddress、true、startStop、CSL_I2C_MAX_TIMEOUT);
    if (状态=I2C_NACK_ERR)

    ICMDR |= STP;
    ICSTR |= NACK;
    while (ICMDR&MST);
    error=-1;

    if (状态!= CSL_SOK)

    ICMDR &=~IRS;
    while (ICSTR&BB);
    ICMDR |= IRS;
    error=-1;


    您认为这是正确的处理方式吗?

    谢谢你

    此致、
    Stefano
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我记得、根据 I2C 总线规范、规则是等待9个时钟周期、然后查看接口是否会解决该问题、然后重置 i2c 总线。

    此致、
    Yordan