我们在使用 TMS320F28034的生产单元中看到了一个问题、其中症状是 I2C 总线挂起(从器件将 SDA 保持在低电平)。 复位 TMS320F28034不能清除这个问题、但是关闭整个电路板的电源、然后再为其备份供电。 这个应用中的 I2C 总线只有3个部分- TMS320F28034 (主器件)和2个从器件(I2C EEPROM 和一个 I2C 加速计)。 I2C 总线的所有相关参数均为标称值(上拉电阻器(6.8k)、总线电容(30-40pF) SCL 时钟速度(161kHz)、主器件、从器件和 I2C 的电源电压(3.3V)、SCL 和 SDA 上的上升时间、I2C 高电平(~3.3V)、I2C 低电平(~0V)等 我们可以找到一些 TI 文档(I2C 提示 http:/processors.wiki.ti.com/index.php/I2C_Tips),这些文档指明了 I2C 主设备是否在从 I2C 上的从设备发送数据的过程中被复位,然后它可能会挂起总线。 TMS320F28034复位引脚(/XRS)有一个1k 上拉至3.3V 和一个0.1uF 电容至 GND。 我们能够通过在 I2C 通信过程中触发复位来手动使 I2C 总线挂起、串行 I2C EEPROM 在其中读取其整个存储器。 (如果在从器件读出"0"且时钟消失时发生复位、则从器件保持 SDA 线为低电平。) TMS320F28034预计电源电压为3.3V +/- 10%、而 I2C 从器件将在低至1.9V 的5.5V 电源电压下运行。 3.3V 电源上的毛刺脉冲可能会导致 TMS320F28034执行 POR/BOR 复位、但 I2C 从器件会继续正常运行。 电路板布局不能为主器件提供一种对 I2C 从器件进行上电复位的方法。
在尝试调试和/或重现此问题时、我们设法在读取 I2C EEPROM 存储器转储的过程中手动触发 TMS320F28034的复位、并且我们在发送"0"的过程中捕获了 EEPROM。 结果是 I2C 总线挂起、从器件将 SDA 线保持在低电平。
我们可以考虑"正常"发生此问题的唯一方法是 POR/BOR 复位、看门狗复位、NMI 复位(尝试写入受保护的存储器等)、或者通过 I2C 控制寄存器写入存储器泄漏或错误指针
是否有任何方法可以从病理上操作 I2C 主设备、使其挂起 I2C 总线? 如果 I2C 外设在 I2C 读取过程中被禁用、这是否可以模仿微控制器被复位并挂起总线? (I2CMDR (I2C 模式寄存器)中的 IRS 位在 I2C 外设正在从从器件读取数据时写入"0"。) I2C 寄存器不受写保护、因此错误软件可能会覆盖它们。
POR/BOR 复位将涉及电源电压输入上的毛刺脉冲。 这似乎不太可能、因为电源看起来很干净、干扰需要使3.3V 稳压器的压降足以使 TMS320F28034执行 POR/BOR、但压降不足以执行从器件的上电复位、这必须发生在的中间 从器件发送"0"时的 I2C 读取。 我们无法通过 EMI 触发复位(我们使用变速直流电钻、您可以观察电刷)。 看门狗复位或 NMI 类型的复位似乎是错误软件的症状--内存泄漏或错误指针。 所有这些似乎并不经常发生、不足以有很好的机会在悬挂 I2C 总线所需的神奇点实际发生。 如果错误指针或内存泄漏被设法写入 I2C 模式寄存器并先挂起 I2C 总线、最终导致看门狗复位或 NMI 类型的复位、 复位本身可能不是我们所看到问题的实际原因、而只是巧合。
欢迎提出任何意见和建议。 请告诉我这些猜测是否是不是很专业。 我们正在尝试确定问题的根源是硬件还是软件、以便集中精力。

