APP下载

I2C总线设计技术及其死锁的探讨

2018-08-06李荫珑丘珊珊

家电科技 2018年7期
关键词:低电平高电平时序

李荫珑 丘珊珊

LI Yinlong QIU Shanshan

珠海格力电器股份有限公司 广东珠海 519070

Gree Electric Appliances, Inc. of Zhuhai Zhuhai 519070

1 I2C总线概述

I2C总线是PHILIPS公司推出的一种在电子通信控制领域常用的串行通信总线,是一种简单、双向通信、二线制、同步的串行总线,具有连接线少、控制简单、通信速率高等优点。用数据线SDA和时钟线SCL构成通信线路,各器件可并联到总线上实现数据收发,器件间彼此独立,通过唯一的总线地址区分。

除了发送器和接收器外,在执行数据传输时,器件也可以被看作主器件(主机)或从器件(从机)。主器件是用于启动总线传送数据,并产生时钟的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系取决于此时的数据传送方向,而不是恒定的。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。[1]

I2C总线具有简单性和有效性,只要求2条双向通信线路SDA(串行数据)和SCL(串行时钟)。I2C总线支持多主控, 其中任何能够进行发送和接收的器件都可以成为主机,一个主控能够控制信号的传输和时钟频率,但在任何时间点上只能有一个主控。连接到相同总线上的器件数量受总线最大电容400pF限制,I2C总线上的串行8位双向数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。

2 I2C总线接口设计

I2C总线是两条双向的串行线,其中一条是数据串行线SDA,另一条是时钟串行线SCL。时钟串行线SCL用于产生时钟脉冲,数据串行线SDA通过SCL产生的时钟脉冲进行读取或是写入数据。I2C总线上可以连接多个设备,每一个设备的数据串行线SDA的端口连接到一块,且每一个设备的时钟串行线SCL的端口连接到一块。通过由数据串行线SDA和时钟串行线SCL构成的I2C总线可以发送数据到总线上,以及接收总线上的数据。I2C总线接口应用示意图如图1所示。

I2C总线上其SDA线以及SCL线的接口电路均是双向的,SDA线向总线上发送数据,也可在总线上读取数据,I2C总线上的设备可以分为主机和从机,其作为总线上的主机还是从机,主要取决于其在总线上所担任的角色。主机点名从机,首先需要控制SCL以产生时钟脉冲,并读取或是发送数据到总线SDA上,以完成主机的工作,作为总线上的从机,需要回复主机的点名以及发送数据、应答ACK信号或是输出低电平到总线上以延长主机的SCL信号,完成从机的工作。

I2C总线的接口均为集电极开路(OC)或漏极开路(OD)的形式输出,其主要是为防止I2C总线上的信号混乱,I2C总线上的输出端没有安装上拉电阻时,只能输出低电平,如果需要保证I2C总线正常工作,就需要在I2C总线的输出端加上拉电阻R1和R2。图1中,所有I2C设备的SDA或是SCL的端口连接到一块,如果任意一个I2C设备输出低电平都将控制I2C总线(即总线处于“忙”状态),即各I2C设备的时钟串行线SCL是线“与”的关系,各I2C设备的数据串行线SDA也是线“与”的关系。

I2C总线主要有以下几个方面的特点:[2]

(1)总线驱动能力强。I2C总线外围扩展设备都是CMOS型的,功率极低,因而总线上扩展的节点数不是由电流负载能力决定的,而是由电容负载确定的。通常I2C总线负载能力为400PF,据此可以计算出总线长度及所带设备的数量,总线上扩展的设备数量主要受设备地址的限制。

图1 I2C总线应用示意图

图2 I2C总线数据有效性图示

图3 I2C总线起始时序及停止时序图

(2)任何一个I2C总线接口的外围设备,不论其功能差别有多大,都是通过数据串行线SDA和时钟串行线SCL连接到I2C总线上。应用者只需要将I2C设备的SDA口和SCL口连接至I2C总线上,对设备进行单独电路设计便可,给使用者带了便利性,也简化了整个I2C系统设计的复杂性,可提高整个I2C系统的抗干扰能力,利于EMC实验等。

(3)只有一个I2C主机的应用系统当中,每一个I2C设备都有一个与其他I2C设备不一样的设备地址,从机设备之间是互不干涉的,其只与主机进行通信,不与其他从机设备进行数据通信,主机与各从机之间的通信是通过I2C设备的独一无二的设备地址进行通信的。

(4)I2C总线其在制定时便规定相应的规范,如I2C总线的通信时序、通信接口、数据/信号传输的特征、定义等等,此类规范决定了应用者在编写I2C总线程序时的一致性。

3 I2C总线的时序

I2C为同步串行通讯方式, SDA为数据信号(数据口)、SCL为时钟信号(高电平有效)。SCL作为同步信号, 因此I2C具有非常严格的时序关系。I2C总线进行数据传输时,时钟信号SCL为高电平期间,数据信号SDA上的数据必须保持稳定,只有在时钟信号SCL为低电平期间,数据信号SDA上的高电平或低电平状态才允许变化,如图2所示。I2C总线时序包括数据传送的起始与停止时序、数据传送时序。

I2C总线数据通信需要有起始位(S)和停止位(P)。建立起始信号(S)之前,I2C总线必须处于空闲状态,在时钟线SCL高电平期间,数据线SDA由高电平向低电平跳变,此定义为I2C总线起始信号(S),代表开始传送数据,起始信号是由主机主动建立的,从机无法产生该信号。主机需要产生停止信号以结束通信时,其在时钟线SCL高电平期间,将数据线SDA由低电平向高电平跳变,此便产生停止信号(P),代表结束向总线传送数据,此停止信号(P)是由主机主动建立的,从机无法产生该信号,建立停止信号后,由主机控制的I2C总线将被释放至空闲状态,其它I2C设备可根据功能进行控制总线。起始时序及停止时序如图3所示。

I2C总线进行传输数据时,规定了一定的通信时序,但这种时序并不是完全规定死的,它可以根据主机、从机特定的功能要求进行改动,但整体的时序特性、通信特征是不变的(如起始位、停止位)。如可根据特定的功能规定协议,设备地址、寄存器地址的设置,以及是否可进行页读/写操作等。I2C总线在传送数据时,是一个一个数据位传送的,每一个数据位都有一个时钟脉冲相对应。在总线空闲状态下,主机控制总线,产生起始信号(S),紧接着便需要传送设备地址(即点名从机),设备地址的高七位一般为从机的地址位,最低位为读操作(1)位(或写操作位(0))。主机发送完设备地址后,从机需要对号进行回复(被点名的从机进行回复,未被点名的从机不回复),从机向主机发送应答ACK信号(低电平),主机在接受到应答ACK信号后,根据实际功能确定是否进一步操作,如需要继续通信传输数据,则主机进行传送或是接收数据,直到主机产生停止信号(P)结束该通信,并释放I2C总线。完整I2C总线数据传输如图4所示。另外,I2C总线协议中主从机必须根据自己的要求约定好通信规则:command的定义和位置、address的位数和位置,以便可以正常通信。

4 I2C总线死锁以及其解决办法

4.1 I2C总线死锁的原因

各I2C设备的时钟串行线SCL是线“与”的关系,各I2C设备的数据串行线SDA也是线“与”的关系。在正常情况下,I2C总线协议能保证总线正常的读/写操作,但是只要总线上任何一个设备拉低了数据串行线SDA或者时钟线串行SCL(控制总线),其他设备都无法拉高它们,如果有I2C设备不释放总线,则整个总线上的通信都被暂停,总线被占用。

在使用I2C总线时,产生其死锁最常见的情况便是主机在通信过程中产生了复位。在I2C通信过程中,如果主机在等待从机发送应答ACK信号期间,从机发送低电平的ACK信号,但此时I2C通信的时序被打乱(如I2C总线通信时被外界干扰或是主机复位从机未复位),从而导致时钟线SCL重新拉高至高点平,此时I2C总线的状态为从机在等待主机将时钟线SCL从高拉到低电平,以停止发送ACK应答信号,而主机检测到数据线为低电平,认为总线被占用,等待总线被释放。此情况下,无论是主机还是从机,均在等待,使得I2C总线处于死锁状态,无法控制I2C总线。I2C总线上的主机在进行读取数据时,也会产生同样的状况,导致总线处于死锁状态。以上情况是较为常见的使用软件I2C时,导致I2C处于死锁的状态,此外,如果芯片I2C的中断服务程序被屏蔽,其中断服务函数中有不必要的死循环以及芯片I2C系统被禁止等均有可能导致I2C总线进入死锁状态,即I2C总线被占用(总线忙)状态。

4.2 I2C总线死锁的解决办法

图5 I2C总线死锁恢复逻辑框图

I2C总线死锁主要出现于采用硬件I2C,如需要解决I2C死锁问题,最好用模拟I2C实现;或者将从机的电源设计为可控,如果在I2C总线发生死锁状态的时候,可以将从机进行复位;或者可以在从机的程序中加入监测功能,如果总线长时间被拉低则释放对总线的控制;如采用硬件I2C,出现I2C死锁,还可以在I2C主机中增加I2C总线死锁状态恢复程序,I2C总线死锁恢复程序逻辑框图如图5所示。

将硬件I2C更改为模拟I2C(软件I2C),并模拟输出9个连续的SCL时间脉冲信号(针对8位数据的情况),然后再产生一个停止信号,使I2C从死锁状态上恢复到正常状态,使总线能够正常工作,之后延时一小段时间,再将软件I2C口恢复到硬件I2C口。

5 总结

I2C总线协议非常受广大工程师喜爱,应用也非常广泛,在应用使用中,也会出现例如死锁等通信问题,本文根据实际的使用主要介绍了I2C总线基本结构、接口设计及其总线数据传输时序,并阐述I2C总线死锁的原因及其解决方案。

猜你喜欢

低电平高电平时序
清明
一种基于FPGA的PWM防错输出控制电路
基于不同建设时序的地铁互联互通方案分析
一种实用的电脑接口判断方法
TS-03C全固态PDM中波发射机开关机控制电路原理及故障分析
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
基于FPGA 的时序信号光纤传输系统
数字电子技术的应用
浅谈物理电路与数字电路
基于模体演化的时序链路预测方法