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.

[参考译文] TM4C1294NCPDT:重置 I2C 通信时出现问题

Guru**** 2553450 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/954162/tm4c1294ncpdt-problems-resetting-i2c-communication

器件型号:TM4C1294NCPDT

大家好、我们有一个 Tiva TM4C1294NCPDT 与模拟器件 ADXL355加速计通信。 我看到一个问题、通信有时会中断、可能是由于噪音。 这会导致从 TivaWare Lib I2CMasterErr ()函数返回 I2C_MASTER_ERR_ARB_Lost 错误。

发生这种情况时、我无法重新启动与加速计的通信。 即使使用 SysCtlPeripheralDisable (SYSCTL_Periph_I2C0)在 I2C 外设上执行复位、然后使用 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0)重新初始化、我仍然会得到相同的 I2C_MASTER_ERR_ARB_Lost 错误、并且无法与加速计重新建立通信。

重新建立通信的唯一方法是使用 Tiva 的复位或下电上电、这对于我们的用例来说是非常不利的。  任何人都可以提供的有关使用 TivaWare 重新建立通信而无需重启或复位的任何信息都将非常有用。


谢谢、
Terence

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

    出现此错误时、SDA 线的状态是什么? 如果您得到的噪声会在 SCL 或 SDA 上产生额外的转换、则从器件和主器件将不同步。 解决方案是将 SCL 用作数字 I/O 并在从器件释放 SDA 之前将其置为低电平/高电平。 下面是一些有关 I2C 的信息、您可能会发现这些信息很有用。

    https://www.ti.com/lit/an/slva704/slva704.pdf

    https://www.ti.com/lit/an/slyt770/slyt770.pdf

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

    Bob 您好-感谢您的反馈。  我希望这样做而不是使用 Bit-Bang。  您确定不能以某种方式使用 TivaWare 函数吗? 例如,可能使用 I2CMasterTimeoutSet()?

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

    检查 SCL 和 SDA 线路。 如果从器件将 SDA 保持在低电平、使从器件脱离该状态的唯一方法是 SCL 上的边沿。 由于 I2C 模块将其视为另一个保留总线的主器件、因此它不会尝试驱动 SCL。 位拆裂是我知道的唯一解决方案。 复位模块或主器件超时不会改变从器件的状态。  

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

    嗯…  连接逻辑分析仪并重新出现问题后、我实际上看到 SDA 和 SCL 都无限期保持高电平。  我将不得不进行更深入的调查。  但是、我非常感谢确认位拆裂可能是唯一的恢复方法。

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

    Bob、您好、很抱歉耽误您的时间、我现在要回到这个问题。  我已经做了更多的调查。  由于所需的 I2C 线长、我们在 Tiva 和加速计之间使用 I2C 扩展器。  从具有 Tiva 的电路板到具有加速计的电路板的线路有以下线路:

    • VExt
    • 3.3VDC
    • SCL
    • SDA
    • IO_B (来自加速计的中断线路)
    • IO_A (来自加速计的附加中断线路)
    • 接地

    当我断开/重新连接时*只有* VEXT 是 Tiva 和加速计之间的通信停止时。  这是非常可重复的。  我连接了一个逻辑分析仪、以便在 VEXT 断开/重新连接时触发、从而捕获加速计和 Tiva 端的 SDA 和 SCL 线路。  以下是几个示例:

    从上面的逻辑分析仪图像可以看出、断开 VEXT 时、SDA 和 SCL 似乎会引入一些噪声。  请注意、在上述两种情况下(以及在我所检查的许多情况下)、SDA 和 SCL 线路在 VEXT 线路断开后如何无限期保持高电平。

    SDA 和 SCL 为高电平表示 I2C 总线空闲。  我感到困惑的是、Tiva 为什么不能重新建立 I2C 通信。  我尝试使用以下代码执行此操作、其中我会暂时禁用 I2C 外设、然后使用电路板启动时使用的相同初始化代码重新启用它:

    静态常量 uint32_t I2C_delay = 500...
    
    
    
    SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
    MAP_SysCtlDelay (I2C_DELAY);
    
    //启用外设
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    while (!SysCtl_SysCtlPeripheralReady (SYSCTL_IPBLE_GPIOPTB
    
    
    
    
    
    
    
    
    
    
    
    );//将 GPIOPTC_PIOSC_PIOSC_PIOSC_3引脚配置为 USBT_PIOSC_PH_PH_PH_PHIN (SYSCIP_PHIN_PHIN);SYSCIP_PHIN_PHIN_PHIN_PHIN3引脚)
    
    //配置数据引脚类型(无需配置 Clk -自动完成)
    GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_Strength _8mA、GPIO_PIN_TYPE_OD);
    
    MAP_I2CMasterInitExpClk (I2C0_BASE、 SysClock、true);// false = 100kbps true = 400kbps
    MAP_SysCtlDelay (I2C_DELAY);
    
    MAP_I2CMasterTimeoutSet (I2C0_BASE、0x7D);
    MAP_SysIntDelay (I2C_DELAY);
    
    //等到主控方未正忙于发送
    if (!TileSensorI2C_WaitOnBush
    
    
    
    (I2I2C_ICPSR);
    // I2Idr_I2Idr_I2Idr_I2Idr_I2Idr_I2Idr_返回(I2Idr_I2Idr_I2Idr_I2Idr_I2Idr_I2Idr_);(I2Idr_I2Idr_I2Idr_
    返回 false;//此处发生错误。 MAP_I2CMasterErr ()的返回值为 I2C_MASTER_ERR_ARB_Lost
    }
    
    返回 true; 

    如果您对此问题有任何想法或建议、我们将不胜感激。  谢谢你。

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

    [引用 USER="Terence Darwen"]我们在 Tiva 和加速计之间使用 I2C 扩展器

    通常、I2C 扩展器成对使用。 您的 I2C 扩展器电路是否有可能主动将 SCL 或 SDA 驱动为高电平? 这可能会导致仲裁错误丢失。

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

    [引用 user="Bob Crosby"]

    Terence Darwen
    我们在 Tiva 和加速计之间使用 I2C 扩展器

    通常、I2C 扩展器成对使用。 您的 I2C 扩展器电路是否有可能主动将 SCL 或 SDA 驱动为高电平? 这可能会导致仲裁错误丢失。

    [/报价]

    没错、我没有设计这个电路板、我只是负责固件的嵌入式软件工程师。  与我们的电气工程师讨论后、I2C 扩展器确实成对使用。  我们的定制板上有一个带有 Tiva、另一个位于加速计板上。

    [引用 user="Bob Crosby"]

    您的 I2C 扩展器电路是否有可能主动将 SCL 或 SDA 驱动为高电平? 这可能会导致仲裁错误丢失。

    [/报价]

    好建议。  根据 EE 同事的建议、我通过使电路板进入之前提到的"不良状态"来测试此情况、此时不再发生 I2C 通信、SDA 和 SCL 线在两侧(加速计和 Tiva)都无限期处于高电平。  然后、我向地面引入了一个4K 电阻器、如下图所示。

    执行此操作时、线路经常保持高电平。  这让我相信、不是延伸器将线路拉高。

    但是、这是我尝试的一个实验、结果我发现很有趣:

    我有一个 TM4C1294XL 开发板、就像 这个一样。  我将相同的 I2C 固件写入我们定制板上运行的内容、只要它在周期性 SysTick 中断期间查询加速计即可。  我仅将开发板上的 SDA 和 SCL 线连接到定制板和 加速计 板之间的 I2C 线、但让开发板断电。  然后、我将定制板和加速计之间的 I2C 通信设置为前面提到的"坏状态"。  然后、我打开开发板的电源、并且、对于开发板到加速计的通信以及我们自定义板到加速计的通信、I2C 通信立即正常工作。  之后、我甚至可以切断开发板的电源、I2C 通信将继续在我们的定制板和加速计之间进行。

    我不能完全确定从这个结论中得出的结论、除了什么都不会在处于"不良状态"时将 SDA 和 SCL 线路强制为高电平或低电平...  有什么想法吗?

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

    我的最佳猜测是、噪声会导致 I2C 模块认为它丢失了到另一个主器件的仲裁。 它一直保持该状态、直到看到有效的停止条件。 当您添加额外的 I2C 主设备时、它成功地进行了启动-停止组合、释放了总线。 不幸 的是、它看起来像 SysCtlPeripheralDisable (SYSCTL_Periph_I2C0)只是禁用到模块的时钟。 它不会复位模块。 您能否尝试将 SCL/SDA 线路更改为开漏 GPIO 输出。 然后使用 SDA 低电平、SCL 低电平、SCL 高电平、SDA 高电平来仿真一个停止条件。 我会自己尝试、但我还不知道如何使用硬件进入"锁定"状态。 您可能必须遵循数据表中有关从丢失仲裁中恢复的说明。

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

    Bob 大家好-正如您所建议的那样、先稍微敲一下头、然后再停下来、便完成了这一步。  每次都能正常工作。  非常感谢您对此的帮助!