首页/文章/ 详情

I2C“死锁”原因

2小时前浏览12

             

                 

                 

一、什么是I2C协议      

I2C协议是一个允许一主多从进行通讯的协议。它就像串行外设接口(SPI)一样,只能用于短距离通信。又像异步串行接口(如RS232或UART), 只需要两根信号线来交换信息。

实现I2C需要两根信号线完成信息交换,SCL时钟信号线,SDA数据输入/输出线。它属于同步通信,由于输入输出数据均使用一根线,因此通信方向为半双工。

总结:短距离、一主多从、半双工、两根线、同步通讯



             

                 

                 

二、名词解释                


                 

                 

             

什么是半双工呢?什么是同步通讯?什么是异步通讯?

1 什么是半双工?

数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。

单工通信:是指消息只能单方向传输的工作方式。例如遥控、遥测(一部分),就是单工通信方式。单工通信信道是单向信道,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。

半双工:是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。半双工方式要求收发两端都有发送和接收能力。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。

全双工:是指在通信的任意时刻,线路上可以同时存在A到B和B到A的双向信号传输。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。比如,电话机则是一种全双工设备,其通话双方可以同时进行对话。


2.2 什么是同步通讯

同步通信:发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如:在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大家的约定,接收数据。如:I2C、SPI等有时钟信号的协议,都属于这种通信方式。

异步通信:接收方并不知道数据什么时候会到达,收发双方可以有各自自己的时钟。发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。这种传输通常是很小的分组,比如:一个字符为一组,数据组配备起始位和结束位。所以这种传输方式的效率是比较低的,因为额外加入了很多的辅助位作为负载,常用在低速的传输中。

同步通信与异步通信区别:

(1)同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

(2)同步通信效率高,异步通信效率较低。

(3)同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。

(4)同步通信可用于点对多点;异步通信只适用于点对点。



             

                 

                 

三、I2C的功能特点                


                 

                 

             

I2C最重要的功能包括:

  • 只需要两条总线;

  • 没有严格的波特率要求,例如使用RS232,主设备生成总线时钟;

  • 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;

  • I²C是真正的多主设备总线,可提供仲裁和冲突检测;

  • 传输速度:

    • 标准模式:Standard Mode = 100 Kbps

    • 快速模式:Fast Mode = 400 Kbps

    • 高速模式:High speed mode = 3.4 Mbps

    • 超快速模式:Ultra fast mode = 5 Mbps

  • 最大主设备数:无限制;

  • 最大从机数:理论上是127;



             

                 

                 

四、I2C的高阻态                


                 

                 

             

漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻

高阻状态:高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。电路分析时高阻态可做开路理解。

我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,那么这时候其余的空闲设备可能会受到总线干扰,或者干扰到总线,怎么办呢?

为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。



             

                 

                 

五、数据传输协议   

主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。串行数据序列的结构可以分为:

1 起始位

当主设备决定开始通讯时,需要发送开始信号,并且执行以下过程:

  • 将SDA线由高电平切换成低电平;

  • 将SCL线由高电平切换成低电平;

在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。

2 地址位

地址位支持7bit、10bit,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址,故地址为主要用来辨识不同设备。

地址位由主机发送,从设备负责接受并识别该地址是否位自己地址。

3 读写位

由于I2C是半双工通讯,所以设备需要确定数据传输的方向,故引入了读写位。

  • 如果主设备需要将数据发送到从设备,则该位设置为 0;

  • 如果主设备需要往从设备接收数据,则将其设置为 1 ;

读写位由主机发送;1表示读操作,0表示写操作。

4 应答位

I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。

应答信号:出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。

非应答信号:当第9个SCL时钟周期时,SDA保持高电平,表示非应答信号。

非应答信号可能是主机产生也可能是从机产生,产生非应答信号的情况主要有以下几种:

  • I2C总线上没有主机所指定地址的从机设备;

  • 从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯;

  • 主机发送的一些控制命令,从机不支持;

  • 主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了;


5 数据位

I2C数据总线传输要保证在SCL为高电平时,SDA数据稳定,所以SDA上数据变化只能在SCL为低电平时

一次传输的数据总共有8位,由发送方设置,它需要将数据位传输到接收方。

发送之后会紧跟一个ACK / NACK位,如果接收器成功接收到数据,则从机发送ACK。否则,从机发送NACK。

数据可以重复发送多个,直到接收到停止位为止。

6 停止位

当主设备决定结束通讯时,需要发送结束信号,需要执行以下动作:

  • 先将SDA线从低电压电平切换到高电压电平;

  • 再将SCL线从高电平拉到低电平;

总结,写寄存器的标准流程为:

1. Master发起START

2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

3. Slave发送ACK

4. Master发送reg addr(8bit),等待ACK

5. Slave发送ACK

6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7. Slave发送ACK

8. 第6步和第7步可以重复多次,即顺序写多个寄存器

9. Master发起STOP

读寄存器的标准流程为:

1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK

2. Slave发送ACK

3. Master发送reg addr(8bit),等待ACK

4. Slave发送ACK

5. Master发起START

6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK

7. Slave发送ACK

8. Slave发送data(8bit),即寄存器里的值

9. Master发送ACK

10. 第8步和第9步可以重复多次,即顺序读多个寄存器



             

                 

                 

六、仲裁机制                


                 

                 

             

在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。

但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I2C总线上的仲裁。

I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。

1 SCL线的同步

SCL同步是由于总线具有线 “与” 的逻辑功能(开漏输出),即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号,这就是SCL的同步原理。

2 SDA线的仲裁

总线仲裁是为了解决多设备同时竞争中线控制权的问题,通过一定的裸机来决定哪个设备能够获得最终的总线控制权。

SDA线的仲裁也是建立在总线具有线与逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致(类似于CAN总线的回读机制)。

  • 是,继续发送;

  • 否则,退出竞争;


I2C总线的控制逻辑:低电平优先

SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失,总线系统通过仲裁只允许一个主节点可以继续占据总线。

上图过程分析:

第一个周期:所有设备发送1,做与运算后的结果为1,与自己发送的数据相同,继续发送;

第二个周期:所有设备发送1,做与运算后的结果为1,与自己发送的数据相同,继续发送;

第三个周期:所有设备发送0,做与运算后的结果为0,与自己发送的数据相同,继续发送;

第四个周期:AB设备发送1,C设备发送0,做与运算后结果为0,与AB发送的数据不同,则AB退出竞争,节点C获胜;

注:若AB两个设备发送0,C设备发送1,这最后与运算结果为0,与AB数据格式相同,与C数据格式不同,则C退出,AB继续发送,直至AB中有一个退出。

SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。



             

                 

                 

七、I2C死锁                


                 

                 

             

在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。


在I2C主设备进行读写操作的过程中,主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。

如果这个时候主设备异常复位,SCL就会被释放为高电平。此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。

而对于I2C主设备来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。

这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。

同样,当I2C进行读操作,I2C从设备应答后输出数据,如果在这个时刻I2C主设备异常复位而此时I2C从设备输出的数据位正好为0,也会导致I2C总线进入死锁状态。

声明:


 
声明:本号对所有原创、转载文章的陈述与观点均保持中立,推送文章仅供读者学习和交流。文章、图片等版权归原作者享有,如有侵权,联系删除。  


来源:硬件笔记本
电路电子通信理论控制SCLFAST
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-11-11
最近编辑:2小时前
硬件笔记本
本科 一点一滴,厚积薄发。
获赞 156粉丝 45文章 526课程 0
点赞
收藏
作者推荐

最接地气的PCB设计指南

我们开始新设计时,因为将大部分时间都花在了电路设计和元件的选择上,在 PCB 布局布线阶段往往会因为经验不足,考虑不够周全。如果没有为 PCB 布局布线阶段的设计提供充足的时间和精力,可能会导致设计从数字领域转化为物理现实的时候,在制造阶段出现问题,或者在功能方面产生缺陷。那么设计一个在纸上和物理形式上都真实可靠的电路板的关键是什么?让我们探讨设计一个可制造,功能可靠的 PCB 时需要了解以下6个 PCB 设计指南。1. 微调你的元件布置PCB 布局过程的元件放置阶段既是科学又是艺术,需要对电路板上可用的主要元器件进行战略性考虑。虽然这个过程可能具有挑战性,但你放置电子元件的方式将决定你的电路板的制造难易程度,以及它如何满足你的原始设计要求。虽然存在元件放置的常规通用顺序,如按顺序依次放置连接器,印刷电路板的安装器件,电源电路,精密电路,关键电路等,但也有一些具体的指导方针需要牢记,包括:取向 - 确保将相似的元件定位在相同的方向上,这将有助于实现高效且无差错的焊接过程。布置 - 避免将较小元件放置在较大元件的后面,这样小元件有可能受大元件焊接的影响而产生装贴问题。组织 - 建议将所有表面贴装(SMT)元件放置在电路板的同一侧,并将所有通孔(TH)元件放置在电路板顶部,以尽量减少组装步骤。最后还要注意的一条 PCB 设计指南 - 即当使用混合技术元件(通孔和表面贴装元件)时,制造商可能需要额外的工艺来组装电路板,这将增加你的总体成本。良好的芯片元件方向(左)和不良的芯片元件方向(右)良好的元件布置(左)和不良元件布置(右)2.合适放置电源,接地和信号走线放置元件后,接下来可以放置电源,接地和信号走线,以确保你的信号具有干净无故障的通行路径。在布局过程的这个阶段,请记住以下一些准则:1)定位电源和接地平面层 始终建议将电源和接地平面层置于电路板内部,同时保持对称和居中。这有助于防止你的电路板弯曲,这也关系到你的元件是否正确定位。对于给 IC 供电,建议为每路电源使用公共通道,确保有坚固并且稳定的走线宽度,并且避免元件到元件之间的菊花链式电源连接。2)信号线走线连接 接下来,按照原理图中的设计情况连接信号线。建议在元件之间始终采取尽可能短的路径和直接的路径走线。如果你的元件需要毫无偏差地固定放置在水平方向,那么建议在电路板的元件出线的地方基本上水平走线,而出线之后再进行垂直走线。这样在焊接的时候随着焊料的迁徙,元件会固定在水平方向。如下图上半部分所示。而下图下半部分的信号走线方式,在焊接的时候随着焊料的流动,有可能会造成元件的偏转。建议的布线方式 (箭头指示焊料流动方向)不建议的布线方式 (箭头指示焊料流动方向) 3)定义网络宽度你的设计可能需要不同的网络,这些网络将承载各种电流,这将决定所需的网络宽度。考虑到这一基本要求,建议为低电流模拟和数字信号提供 0.010’’(10mil)宽度。当你的线路电流超过 0.3 安培时,它应该进行加宽。这里有一个免费的线路宽度计算器,使这个换算过程变得简单。3. 有效隔离你可能已经体验到电源电路中的大电压和电流尖峰如何干扰你的低压电流的控制电路。要尽量减少此类干扰问题,请遵循以下准则:隔离 - 确保每路电源都保持电源地和控制地分开。如果你必须将它们在 PCB 中连接在一起,请确保它尽可能地靠近电源路径的末端。布置 - 如果你已在中间层放置了地平面,请确保放置一个小阻抗路径,以降低任何电源电路干扰的风险,并帮助保护你的控制信号。可以遵循相同的准则,以保持你的数字和模拟的分开。耦合 - 为了减少由于放置了大的地平面以及在其上方和下方走线的电容耦合,请尝试仅通过模拟信号线路交叉模拟地。元件隔离示例(数字和模拟)4. 解决热量问题你是否曾因热量问题而导致电路性能的降低甚至电路板损坏?由于没有考虑散热,出现过很多问题困扰许多设计者。这里有一些指导要记住,以帮助解决散热问题:1)识别麻烦的元件 第一步是开始考虑哪些元件会耗散电路板上的最多热量。这可以通过首先在元件的数据表中找到“热阻”等级,然后按照建议的指导方针来转移产生的热量来实现。当然,可以添加散热器和冷却风扇以保持元件温度下降,并且还要记住使关键元件远离任何高热源。2)添加热风焊盘 添加热风焊盘对于生产可制造的电路板非常有用,它们对于高铜含量元件和多层电路板上的波峰焊接应用至关重要。由于难以保持工艺温度,因此始终建议在通孔元件上使用热风焊盘,以便通过减慢元件管脚处的散热速率,使焊接过程尽可能简单。作为一般准则,始终对连接到地平面或电源平面的任何通孔或过孔使用热风焊盘方式连接。除了热风焊盘外,你还可以在焊盘连接线的位置添加泪滴,以提供额外的铜箔/金属支撑。这将有助于减少机械应力和热应力。典型的热风焊盘连接方式5. 热风焊盘科普许多工厂内负责制程(Process)或是 SMT 技术的工程师经常会碰到电路板元件发生空焊(solder empty)、假焊(de-wetting)或冷焊(cold solder)等等这类焊不上锡(non-wetting)的不良问题,不论制程条件怎么改或是回流焊的炉温再怎么调,就是有一定焊不上锡的比率。这究竟是怎么回事?撇开元件及电路板氧化的问题,究其根因后发现有很大部分这类的焊接不良其实都来自于电路板的布线(layout)设计缺失,而最常见的就是在元件的某几个焊脚上连接到了大面积的铜皮,造成这些元件焊脚经过回流焊后发生焊接不良,有些手焊元件也可能因为相似情形而造成假焊或包焊的问题,有些甚至因为加热过久而把元件给焊坏掉。一般 PCB 在电路设计时经常需要铺设大面积的铜箔来当作电源(Vcc、Vdd 或 Vss)与接地(GND,Ground)之用。这些大面积的铜箔一般会直接连接到一些控制电路(IC)及电子元件的管脚。不幸的是如果我们想要将这些大面积的铜箔加热到融锡的温度时,比起独立的焊垫通常需要花比较多的时间(就是加热会比较慢),而且散热也比较快。当这样大面积的铜箔布线一端连接在小电阻、小电容这类 小元器件,而另一端不是时,就容易因为融锡及凝固的时间不一致而发生焊接问题;如果回流焊的温度曲线又调得不好,预热时间不足时,这些连接在大片铜箔的元件焊脚就容易因为达不到融锡温度而造成虚焊的问题。人工焊接(Hand Soldering)时,这些连接在大片铜箔的元件焊脚则会因为散热太快,而无法在规定时间内完成焊接。最常见到的不良现象就是包焊、虚焊,焊锡只有焊在元件的焊脚上而没有连接到电路板的焊盘。从外观看起来,整个焊点会形成一个球状;更甚者,作业员为了要把焊脚焊上电路板而不断调高烙铁的温度,或是加热过久,以致造成元件超过耐热温度而毁损而不自知。如下图所示。包焊、冷焊或虚焊既然知道了问题点就可以有解决的方法,一般我们都会要求采用所谓 Thermal Relief pad(热风焊垫)设计来解决这类因为大片铜箔连接元件焊脚所造成的焊接问题。如下图所示,左边的布线没有采用热风焊盘,而右边的布线则已经采用了热风焊盘的连接方式,可以看到焊盘与大片铜箔的接触面积只剩下几条细小的线路,这样就可以大大限制焊垫上温度的流失,达到较佳的焊接效果。采用 Thermal Relief pad(热风焊垫)对比6. 检查你的工作当你马不停蹄地哼哧哼哧地将所有的部分组合在一起进行制造时,很容易在设计项目结束时才发现问题,不堪重负。因此,在此阶段对你的设计工作进行双重和三重检查可能意味着制造是成功还是失败。为了帮助完成质量控制过程,我们始终建议你从电气规则检查(ERC)和设计规则检查(DRC)开始,以验证你的设计是否完全满足所有的规则及约束。使用这两个系统,你可以轻松进行间隙宽度,线宽,常见制造设置,高速要求和短路等等方面的检查。当你的 ERC 和 DRC 产生无差错的结果时,建议你检查每个信号的布线情况,从原理图到 PCB,一次检查一条信号线的方式仔细确认你没有遗漏任何信息。另外,使用你的设计工具的探测和屏蔽功能,以确保你的 PCB 布局材料与你的原理图相匹配。仔细检查你的设计,PCB 和约束规则7.结语当你掌握了PCB 设计师都需要知道的这几个设计指南,通过遵循这些建议,你将很快就能够得心应手地设计出功能强大且可制造的电路板,并拥有真正优质的印刷电路板。良好的 PCB 设计实践对于成功至关重要,这些设计规则为构建和巩固所有设计实践中持续改进的实践经验奠定了基础。声明: 声明:文章来源网络。本号对所有原创、转载文章的陈述与观点均保持中立,推送文章仅供读者学习和交流。文章、图片等版权归原作者享有,如有侵权,联系删除。 来源:硬件笔记本

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈