IIC死锁问题

        早上刚刚刷到一篇文章,刚好看见这个问题,IIC死锁,就是很简单的一个问题,一个计数器,通过IIC总线访问EEPROM,在测试过程中没有问题,但是在使用的时候出现无法计数的情况,必须得断电再上电才行,这个原因一直追踪不到。这就是IIC的死锁问题。简单的来说就是,主板和输出板都能各自运行,但之间IIC通信已经断开,此时用示波器测量时钟线(SCL)电平,发现SCL已被异常拉低,总线处于死锁状态。那为什么上电之后解决了呢,这个后面我会说这个问题。那言归正传,先简单讲一下IIC的通信机制,没有那么多废话,看来看去也不知道啥意思,就简单几句话。

1.IIC通信机制

起始信号:时钟线SCL在高电平的时候,数据线SDA由高电平变成低电平

结束信号:时钟线SCL在高电平的时候,数据线SDA由低电平变成高电平

通信信号:时钟线SCL在高电平的时候,数据线SDA保持稳定;时钟线SCL在低电平的时候,数据线SDA可以变化

记住这三句话就行了,然后根据时序图直接实现即可。

 2.IIC产生死锁的场景(SDA)

2.1 从机给主机发送数据bit"0"

这个如果通过逻辑分析仪是可以看见一直有信号产生的,但是就是没法接收到所需要的数据,那极大的可能性就是数据全为0,那就只能自己debug去具体问题具体分析了。

2.2 从机回复给主机应答ACK信号,此时主机意外复位或者断电重启。

主机重启后时钟线SCL会被拉高(开漏/上拉电阻),根据IIC协议通信信号规则,SCL在高电平时,数据线SDA保持稳定,因此,从机会一直将SDA保持拉低状态,直到识别到SCL拉低。 主机IIC硬件识别到SDA处于低电平状态,认为IIC总线处于busy状态,则会死等IIC总线空闲,因此产生了IIC死锁。这就不得不提我前面埋下的问题,为什么断电再上电就没问题了?将主板断电复位,死锁偶尔被解除,但有时现象仍然存在,因为SCL线被拉低,所以问题并没有彻底解决。这个就治标不治本了。

2.3 SDA的IIC死锁的解决方案

1.硬件电路上从机供电由主机IO控制,主机一旦识别到IIC死锁,复位从机。

这个方法是最简单直接的,也是比较容易想到的,确实也有用。

2.最多发送9个clock回复IIC总线法

主机识别到IIC死锁后,将SCL/SDA管脚配置成GPIO输出模式,一边输出高低电平(模拟IIC时钟),一边读取SDA的IO电平状态,一旦SDA的IO为高电平后,模拟IIC结束信号,通知从机结束通信。该方式称之为“最多发送9个clock回复IIC总线”,也是最常用的软件恢复机制。为啥是9个呢?因为应答信号在第9个时钟周期出现,此周期内发送器必须释放数据线(SDA),通过接收数据线上的低电平来产生应答信号,或接收高电平来产生非应答信号。所以,一个完整的字节数据传输需要9个时钟脉冲,所以是9。

3.直接买带看门狗的IIC器件

氪金玩家永远都还是又省时又省力的那批人……

3.IIC产生死锁的场景(SCL)

SDA能死锁,那SCL当然也有可能,反正就这两根线来回折腾呗……当主机和从机(从机IIC内部有接收数据FIFO)通信过程中,主机发送的数据过快或者过多,导致从机接收不过来的时候(从机接收数据FIFO满),从机会主动将SCL拉低(通常SCL由主机控制),以通知主机停止继续发送数据,从机收完数据后,又会释放SCL,以便主机继续发送数据,该方式称之为“IIC时钟延展”。

所以,一旦从机程序因为软件设计问题,导致无法读取接收数据FIFO时,此时就导致了IIC死锁之SCL死锁,有且仅有唯一解决方法,“复位从机”。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值