嵌入式 - IIC被锁死的问题处理

I2C其实不是一个很稳定的通讯协议。

一方面,它是一个多设备通讯协议,各个通讯节点都在操作总线,只是各自设备的I2C地址不同。整个总线的状态和各个总线上的设备都是有关的。

当一个设备出现问题,就有可能影响到整个总线,使总线出问题,严重会导致整个总线通讯失败。

另一方面,使用I2C处理的通讯,大多是外设芯片的寄存器读写操作(比如charge IC,NFC芯片,EEPROM等),这种应用层通讯协议较为简单,关键是没有对数据帧进行校验,发出的数据被接收后就生效了。

而在物理通讯层,I2C只有ACK机制,也没有数据有效性的验证功能,一旦传输波形受到影响,就会造成数据错误,但发送和接收方都不知道。

也就是说,I2C总线通讯是很容易被干扰的。常见的情况,就是如果I2C的引脚暴露在外,比如接到连接器(connector)上,然后连接器的频繁插拔操作,就可能造成I2C总线通讯据错误;还有产品做ESD测试时,也会造成I2C总线通讯错误。

可能出现的错误包括,I2C控制器电路错误、I2C驱动程序错误、软件应用层错误等。而软件应用层错误可能是外设芯片工作状态异常,也可能是主控芯片工作状态异常。

比如我就遇到过I2C控制的charger IC,和主控芯片之间的连接,是通过一个底座上的connector。当设备频繁在底座上插拔,触发充电和停充时,就容易出现问题。因为SCL和SDA接触不是同时断开或接上,这两个pin放在了两排,这两排顶针不是平的,放下或抠开时,会一个先接触或断开,一个后接触或断开。尤其是断开连接时,可能对正在进行的I2C通信造成影响,出现充电错误。

对这个问题,后来降低了I2C通信的数据量,并在通信中加了保护,数据发送前先判断连接稳定性,发送中出现错误立刻停止发送。

还有一个问题,也是I2C连接charger、gauge IC的问题,这个是没有断开连接,而是在drop test中,因为震动,造成了I2C总线出现错误,SDA一直被拉低,无法通讯,影响充电功能。

当出现问题时,也尝试进行了一些恢复操作,比如使用GPIO拉高SDA,没有效果。后来根据其他项目出过类似的问题,发现是因为电池里使用了美信 gauge IC,由于机械震动、连接不良等导致I2C传输被中断, SDA会被一直拉低。就借鉴了过来。

===分割线===

I2C总线出问题的解决方案

I2C协议就是NXP的前身Philip发明的。

在I2C总线通信出现错误时,I2C SDA被锁定,强制拉低,

查看I2C Spec: https://www.nxp.com/docs/en/user-guide/UM10204.pdf

章节:

3.1.16 Bus clear

In the unlikely event where the clock (SCL) is stuck LOW, the preferential  procedure is to reset the bus using the HW reset signal if your I2C devices have HW reset inputs. If the I2C devices do not have HW reset inputs, cycle power to the devices to  activate the mandatory internal Power-On Reset (POR) circuit.

If the data line (SDA) is stuck LOW, the controller should send nine clock pulses. The device that held the bus LOW should release it sometime within those nine clocks.  If not, then use the HW reset or cycle power to clear the bus.

3.1.16 总线复位

在不太可能发生的情况下,clock(SCL)信号被卡在低电平,如果你的I2C设备有HW复位输入,最好的方法是使用HW复位信号来复位总线。如果I2C设备没有HW复位输入,对设备进行断电再上电的操作,来激活强制性的内部上电复位(Power-On Reset / POR)电路。

如果数据线(SDA)被卡在低电平,I2C主控制器应该发送9个时钟脉冲。把SDA信号拉低的设备,就应该在这9个时钟内的某个时间释放SDA信号。 如果没有,则使用HW复位或电源掉电上电来清除总线错误。

所以,当I2C的SDA被某个设备强制拉低了,就可以使用上面的办法,通过I2C master 设备,发送9个时钟周期,来清除I2C总线错误。

当然,这是个治标的办法,从源头上,可以降低I2C通信频率,减少发送数据量,提高I2C电路的电气稳定性,用这些措施来降低I2C总线出问题的机率。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在STM32中,防止I2C总线锁死有几种方法。 首先,确保总线配置正确。首先,设置I2C的时钟频率,需要根据所连接的外设和总线负载来选择合适的频率。过高的频率可能导致通信错误,而过低的频率可能导致通信速度过慢。其次,确保总线上没有冲突的地址。每个I2C设备应该有一个独一无二的地址,确保没有地址冲突可以避免通信的错误。 其次,使用适当的超时机制。在进行I2C通信时,可以设置一个超时时间,如果超过这个时间还没有接收到回应信号,就可以中断通信,重新初始化总线,避免总线锁死。超时时间需要根据具体应用场景和通信速率来调整。 另外,保持总线始终处于正确的状态。在进行I2C通信过程中,需要根据具体情况来确认并处理可能出现的错误,如丢失ACK信号、总线冲突等。可以通过编写适当的错误处理代码,在出现错误时及时处理,避免导致总线锁死。 最后,合理设计系统中的并发操作。如果系统中存在多个任务同时使用I2C总线进行通信,需要合理设计任务的优先级和调度机制,避免出现同时访问总线的情况,从而避免总线锁死。可以使用信号量或互斥锁机制来进行任务的同步和互斥访问。 通过以上的方法,可以有效地防止STM32中的I2C总线锁死问题,保证系统的稳定性和可靠性。 ### 回答2: STM32的IIC总线锁死是指在使用IIC通信时出现的一种现象,即当IIC总线的通信协议发生异常或通信线路出现问题时,导致IIC总线无法正常通信。 防止STM32的IIC总线锁死,可以采取以下措施: 1. 总线复位:当发现IIC总线出现异常时,可以通过对总线进行复位来恢复通信。具体方法是通过对IIC控制器进行硬件复位或对总线引脚进行切换操作,使IIC总线重新初始化。 2. 超时机制:可以在IIC通信过程中设置超时机制,即设定一个最大的等待时间。如果在超过该时间后对方没有发送应答信号,就认为出现了异常,重新初始化IIC总线。 3. 错误处理:可以通过判断IIC通信过程中返回的错误标志位来处理异常情况。当发现错误标志位被置位时,可以进行相应的错误处理,例如重新初始化IIC总线。 4. 异常处理:当IIC总线出现锁死时,可以通过加入异常处理函数来进行处理。异常处理函数可以在IIC总线出现异常时进行复位操作,重新初始化IIC总线,并进行相应的错误处理。 5. 电源滤波和信号线布局:对于IIC总线来说,电源质量和信号线的布局都会影响通信的稳定性。因此,在设计电路板时应注重电源滤波和信号线的布局,以减小可能出现的通信故障。 综上所述,通过合理设置超时机制、错误处理、异常处理等方法,以及在硬件设计中注意电源滤波和信号线布局,可以有效地防止STM32的IIC总线锁死。 ### 回答3: 在STM32中,为了防止IIC总线锁死,我们可以采取以下措施: 1. 确保电源正常供应:IIC总线的正常工作需要稳定的电源供应。因此,我们需要确保电源电压在规定的范围内,并且电源稳定性良好,以避免造成IIC总线锁死。 2. 适当设置IIC总线时钟速度:IIC总线的通信速度需要根据实际应用需求进行适当设置。如果时钟速度过高,可能会导致总线锁死。因此,我们需要根据实际情况选取合适的时钟速度,避免过高或过低的速度。 3. 优化软件程序:在软件程序的设计和编写中,需要遵循一些原则来防止IIC总线锁死。例如,使用适当的延时函数,以确保总线上的数据能够正确传输和处理。此外,还需要处理错误状态和异常情况,及时采取相应的措施,避免总线锁死。 4. 使用适当的阻尼电路:在实际应用中,我们可以通过添加适当的阻尼电路来消除IIC总线上的反射和干扰。这样可以提高总线的稳定性,降低总线锁死的风险。 综上所述,为了防止STM32中的IIC总线锁死,我们需要确保电源供应正常,设置合适的时钟速度,优化软件程序,以及使用适当的阻尼电路等措施。通过这些方法可以提高总线的稳定性,从而减少IIC总线锁死的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值