关于IIC从机设备在MCU复位后无法正常通信,重新上电后恢复正常通信的问题/IIC挂死/SDA挂死

今天刷手机刷到一个没听过的名词叫IIC挂死,好奇一搜发现我之前还真遇到过且因为重新上电不影响使用故一直没想找原因。记录一下不然下次遇到又忘了。

先来复习一下IIC(加粗部分后文会提到)。

1.1.IIC综述

IIC(I2C)即集成电路总线,是一种两线式串行导线。IIC总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据也可用于接收数据,是一种半双工协议。总线上主设备与从设备之间以八位字节为单位进行双向数据传输。

1.2.IIC时序
1.2.1 IIC空闲状态

因为IIC器件一般采用开漏模式与总线相连,SCL和SDA均需接上拉电阻,所以规定IIC总线的SDA和SCL同时处于高电平状态为总线的空闲状态。

1.2.2 起始信号

IIC总线起始信号:SCL保持高电平期间,拉低SDA电平。

起始信号由主机主动建立,标志着一次数据传输的开始。(建立该信号之前IIC总线必须处于空闲状态)

1.2.3 数据传输

IIC总线上传送的每一位数据都有一个时钟脉冲对应(或同步控制),在SDA上逐位串行传送每位数据(高位优先)。

数据传输时,SCL高电平期间,SDA电平必须稳定,只有SCL低电平期间才允许改变SDA上电平状态

传输一字节数据后,主机释放SDA以使从机应答,第九个时钟周期SCL为高电平时,若SDA非低电平则视为非应答(NACK),表明此次传输失败;若SDA为低电平,则为应答(ACK),传输数据成功,可由主机决定要不要继续。第九个时钟周期末,从机释放SDA,若主机发送停止信号,则传输结束,若主机继续传输数据,内部寄存器地址自动加一。

1.2.4 停止信号

IIC总线停止信号:SCL保持高电平期间,SDA被释放返回高电平。

停止信号由主机主动建立,标志着一次数据传输的终止。(建立停止信号后IIC总线返回空闲状态)

2.1.IIC挂死介绍

常见的IIC挂死有两种,一种是SDA挂死,一种是SCL挂死,SCL挂死暂时没遇到。

2.2.SDA挂死产生原因

因为IIC规范要求SDA和SCL是双向开漏结构以实现线与功能……不说专业术语就是将信号线比作一根挂在天花板上的弹簧,你往下拉他就是低电平,你要是松手了不拉了,就弹回高电平,除非你或者别人再往下拉。但是要是已经有人拉着不放,你也不能强行把弹簧往上推。

现在看回IIC,简单来说如果有从机一直拉着SDA不放,主机拿它没办法,那就是挂死了。

那什么情况从机会一直拉着SDA不放呢?

首先知道一点,从机有机会拉低SDA有两种情况:①ACK拉低,②传输数据过程中传输“0”。

然后再记住一点:从机不允许在SCL高电平的时候改变SDA。正常情况下从机拉低SDA后是会在该放手的时候放手的,但是根据IIC规范,从机不允许在SCL高电平的时候改变SDA,如果SCL一直是高电平,那从机只能一直拽着SDA不放了。

什么原因会导致SCL一直为高电平?

众所周知MCU有复位,但是大部分IIC设备没有啊,且MCU复位也不会通知IIC从机设备的。如果在SCL为高的时候按下复位键,SCL一直为高,从机一直拽着SDA,在开漏模式下主机想改变SDA重新发送开始信号通信也是做不到的。

SCL挂死遇到了再说吧。

作者:gu_gu_gugugugu

物联沃分享整理
物联沃-IOTWORD物联网 » 关于IIC从机设备在MCU复位后无法正常通信,重新上电后恢复正常通信的问题/IIC挂死/SDA挂死

发表回复