IIC死锁的产生原因和解决办法


前言

本文简单介绍了关于I2C在实际使用中死锁产生的原因、 导致的后果以及如何解决死锁问题。


一、IIC死锁是怎么产生的?

I2C死锁产生的机理是当Slave输出应答信号或者输出数据0时,Master发生异常复位,此时SCL会保持或被释放为高电平,但因为Slave没有复位,就会继续应答,保持SDA为低电平,直到SCL变为低电平;Master复位后,检测到SCL为高,SDA为低,则认为I2C总线被占用,然后一直等待总线被释放(SCL、SDA均为高);最终Master和Slave相互等待,形成I2C死锁现象。
在这里插入图片描述
I2C死锁问题无法从根本上避免,除了Master异常复位导致I2C死锁,Slave在正常通信过程中也有可能异常拉低SDA导致死锁。

二、IIC死锁的常见解决办法

(1)Master检测到SDA被拉低超过一段时间后,主动复位Slave,使其释放SDA;但这种方法需要Slave有复位引脚,且Master可以控制Slave的复位引脚使之复位。
(2)Master检测到SDA被拉低超过一段时间后,推送9个Clock到SCL总线上(当死锁发生在Slave发送的第1位数据上时,最多需要9个时钟周期才能结束通讯),使Slave释放SDA为高电平。

单片机软件模拟IIC通信协议时,防止死锁主要有以下几个方面的措施: 1. 合理设计通信流程:在单片机软件模拟IIC通信时,需要确保主从设备的通信流程设计合理。主设备和从设备之间需要进行时间的同步,确保在通信过程中没有死锁现象的发生。可以使用适当的延时函数、状态机等手段,控制通信的时序。 2. 保证通信时序的可靠性:在软件模拟IIC通信中,通常使用GPIO口进行时序控制。为了防止死锁的发生,需要严格按照IIC通信协议规定的时序要求进行通信时序操作。主设备和从设备之间的读写操作需要严格按照规定的顺序进行,避免因操作顺序错误导致的死锁。 3. 合理处理异常情况:在通信过程中,可能会出现异常情况,如通信中断、通信超时等。为了防止死锁的发生,需要在软件中合理处理这些异常情况。可以设置适当的超时时间,当通信超时时及时进行错误处理,避免占用资源导致死锁。 4. 确保通信资源的正确释放:在软件模拟IIC通信中,需要确保通信资源的正确释放,避免资源占用导致死锁的发生。在通信完成后,及时释放相关资源,如GPIO口、缓冲区等,以确保后续的通信能够正常进行。 通过上述措施的综合应用,可以有效地防止单片机软件模拟IIC通信中的死锁问题的发生。在设计和开发过程中,需要仔细考虑通信流程、时序控制、异常处理以及资源释放等因素,确保通信的稳定可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值