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/TM4C1294NCZAD:I2C 挂起问题

Guru**** 2458510 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/648781/ccs-tm4c1294nczad-i2c-hanging-issue

器件型号:TM4C1294NCZAD

工具/软件:Code Composer Studio

下午好!

我正在使用 Tiva 的 I2C 总线与电路板上的一组不同插件传感器模块进行通信。  它工作得很好。  我遇到的问题是、在某些情况下、其中一个传感器可能缺失(未插电)。  发生这种情况时、我的代码卡在 I2C 例程中。  在这种情况下、有人能建议一种合适的方法来逃离并返回0或 FF 吗?  我更愿意避免使用计时器。  是否有一个标志可供我检查、以查看从器件是否未响应?

谢谢!

uint32_t I2C3Receive1 (uint32_t slave_addr、uint8_t reg)

//指定我们要向写入(寄存器地址)
//从器件
I2CMasterSlaveAddrSet (I2C3_base、slave_addr、false);

//指定要读取的寄存器
I2CMasterDataPut (I2C3_base、reg);

//将控制字节和寄存器地址字节发送到从器件
I2CMasterControl (I2C3_base、I2C_MASTER_CMD_BURST_SEND_START);

//等待 MCU 完成事务
while (!I2CMasterBusy (I2C3_base));
while (I2CMasterBusy (I2C3_base));

//指定我们将从从从器件读取
I2CMasterSlaveAddrSet (I2C3_base、slave_addr、true);

//发送控制字节并从我们的寄存器中读取
//specified
I2CMasterControl (I2C3_base、I2C_MASTER_CMD_SINGLE_Receive);

//等待 MCU 完成事务
while (!I2CMasterBusy (I2C3_base));
while (I2CMasterBusy (I2C3_base));

//返回从指定寄存器提取的数据
返回 I2CMasterDataGet (I2C3_base);

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

    很抱歉帖子。  忘记包含代码标签。

    uint32_t I2C3Receive1 (uint32_t slave_addr、uint8_t reg)
    {
    
    //指定我们要向写入(寄存器地址)
    //从器件
    I2CMasterSlaveAddrSet (I2C3_base、slave_addr、false);
    
    //指定要读取的寄存器
    I2CMasterDataPut (I2C3_base、reg);
    
    //将控制字节和寄存器地址字节发送到从器件
    I2CMasterControl (I2C3_base、I2C_MASTER_CMD_BURST_SEND_START);
    
    //等待 MCU 完成事务
    while (!I2CMasterBusy (I2C3_base));
    while (I2CMasterBusy (I2C3_base));
    
    //指定我们将从从从器件读取
    I2CMasterSlaveAddrSet (I2C3_base、slave_addr、true);
    
    //发送控制字节并从我们的寄存器中读取
    //specified
    I2CMasterControl (I2C3_base、I2C_MASTER_CMD_SINGLE_Receive);
    
    //等待 MCU 完成事务
    while (!I2CMasterBusy (I2C3_base));
    while (I2CMasterBusy (I2C3_base));
    
    //返回从指定寄存器提取的数据
    返回 I2CMasterDataGet (I2C3_base);
    } 

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

    建议在移除 I2C 传感器后代码失败。 这是一个值得关注的问题。 然而、如果您生成"不正确的 I2C 地址"(或通过噪声突发产生"干扰"的地址)、则未提及的情况-那么会发生什么情况?

    您不应该寻求(两种)问题的解决方案?    这种"更广泛的解决方案"是否不可能证明是一种卓越的解决方案?

    FiRM /我不使用 TivaWare -您是否搜索了可满足(两者)需求的 I2C 功能?    (没有任何迹象表明您已经这样做了...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    错误地址应具有与缺失传感器完全相同的响应。 另一方面、干扰传感器可能是一个大得多的问题、因为它可能会保持 clk 或数据低电平。 规划这种可能性需要采用不同的方法(在大多数情况下、对传感器进行循环通电)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我添加到我的(之前)过帐-您对 I2C API 的"搜索"是否显示"无此类失败地址"函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Benjamin、
    您的代码应检查主 I2C 中的确认和错误标志。 如果已拔出寻址从器件、则在地址和数据周期期间它不会确认主器件发出的命令。

    请注意、即使 I2C 从设备仍在总线上、由于 CB1所述的各种原因、主设备也可能无法检测到从设备的确认。 例如、SDA 的高电压或低电压电平未达到从器件的输入阈值、或者从器件将噪声尖峰解释为 SCL 周期。 在这种情况下、如果可以通过外部连接器访问 I2C 总线、请确保您具有足够的串联电阻器。 CB1可能有其他建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Benjamin Bhawkon"]它运行得很好。  …  我遇到的问题是...

    不知怎么说——“工作做得很好”——紧接着是“我遇到的问题”——注册为“不一致!

    海报的守则显示,这种"伟大的工作"是在"最有利、最宽容"的条件下发生的(仅限于)。     (因此,"伟大"证明了"过分的声明"-希望/梦想-它不是吗?)

    您(真的)是否希望获得更高和更强大的性能-您不应该"检查错误?"    存在"无/零"错误检查- 显示在任何地方-在您的代码中!    这是早些时候"暗示的"----只得到了一个(争论/感激的)回应----作为回报。

    如前所述-最新的 API 包括"I2C 错误测试/检查"。   "合理"的摘要如下:

    下面介绍了相关的详细信息-扩展了-但可能(完全)不符合"所有用户"的期望:

    我们是否可以注意到、此海报的"用例"很少有各种 I2C 传感器(插入/拔出)。    更普遍的做法是、"(永久)在(相同) PCB 上安装(永久)多个 I2C 器件。    (I2C 毕竟是"短距离"通信)   为了节能并降低 I2C 总线负载、这些 I2C 器件中的许多/大多数都可能处于"待机"状态、甚至处于"断电"状态。    而且-这会产生(更大)确定"I2C 总线上仍有(或保持)谁?"的需求。

    过去、在 StellarisWare 9453下、我们设计了这样一种方案、使我们能够"记录并了解"哪些"I2C"器件处于"运行中"状态。   然后、我们可以在需要时启用其他器件、并且这种选择性(仅启用了"所需"的器件)可降低总线负载并确保"识别和验证电路板"I2C 库存"中包含的所有器件...

    相信此处提供的详细信息-可能会添加一些"基础"-使用户(实际上)意识到"工作出色!"