I2C协议学习总结

 

一、I2C基础

1、  I2C定义:Inter IC,双向两线总线,实现有效的IC之间的控制。这个总线就称为I2C总线。

2、  I2C总线特征:

2.1 只要求两条总线线路一条串行数据线(SDA)一条串行时钟线(SCL)。同时SDA和SCL都是双向线路,分别通过上拉电阻连接到正的电源电压。

2 .2 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主机发送器或主机接收器。

2.3 它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据被破坏。

2.4 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s。快速模式下可达400kbit/s。高速模式下可达3.4Mbit/s。

2.5 片上的滤波器可以滤去总线数据线上的毛刺波,保证数据完整。

2.6 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。

3、  主机和从机的定义:

主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。终止发送。

任何被寻址的器件都被认为是从机。

4、  I2C总线的位传输方式:

数据有效性:SDA线上的数据必须在SCL时钟的高电平周期内保持稳定,电平变化只能在SCL的低电平时才能改变。

起始条件:在SCL为高电平时,SDA线从高电平向低电平切换,这时为起始条件。

终止条件:在SCL为高电平时,SDA线从低电平向高电平切换,这时为终止条件。

                       

图1 起始和结束标识

 

图2 数据有效位置

数据有效位置:在SCL为高电平时,SDA有效。

数据可变化位置:在SCL为低电平时,SDA可以变化。

5、  I2C总线的数据传输:

字节格式:8bit一个字节,每个字节后必须跟一个响应位。数据由MSB开始传输。

响应:响应的时钟脉冲由主机产生。在响应的脉冲期间,发送器释放SDA线(高),接收器将SDA线拉低。

 

图3 数据传输

I2C总线是串行总线,主机和从机交互的只有SCL和SDA两根线,当主机发送数据给从机后(8bit,即在SDA上串行打出8bit的0、1值,此8bit只有在SCL为高电平时有效),从机会在SCL第9个高电平时将SDA拉低,通知主机数据已接到,可以继续发送。

 

情况分析:一、当从机处于忙碌状态,不能响应从机地址时,从机使数据线保持高电平,也就是说不会启动开始状态。二、从机接收器响应了从机地址后,不能再继续接收数据时,需要从机在接下来的第一个字节后不产生ACK来表示。即在ACK时钟周期内将SDA线置高。三、当主机为接收机时,需要在从机不产生时钟的最后一个字节,不产生ACK,向从机发送器通知数据结束。从机发送器释放数据线,允许主机产生一个停止或者重复起始条件。

 

6、  从机地址格式

从机有两种地址格式:7bit地址和10bit两种。如图1-9和图1-10所示。

 

图4 7bit地址格式

从机地址在7bit格式时,主机产生起始条件,然后在SDA上发出A6、A5…A0(从机地址),接着是读写使能位,图中R/W信号,高读低写。然后等待从机应答。

 

图5 10bit地址

从机地址为10bit格式时,主机产生起始条件,然后在SDA上发出11110(10bit从机时的固定值),其后面是A9、A8地址值,A8后面1bit是读写使能位。从机给出应答后,主机会将A7…A0发给从机。这样10bit的从机地址就都发给从机了。

7、  读写访问格式

 

图6 I2C读写访问格式

8、  典型应用

典型应用如图7所示:i2c总线只有两根信号SDA、SCL,这两个管脚一般要接上拉电阻(一般为3.3k),在总线空闲时,这两个信号为高电平。

 

图7 I2C典型应用电路原理图

 附加:

I2C通过两根线进行串行通信,一个是数据线,一个是时钟线。传输时必须遵循几个原则:1,数据传输必须在总线空闲时传输  2 数据传输过程中SCL为高电平时,SDA必须保持稳定。否则将被视为是start信号或者是stop信号;各状态:若SCL和SDA信号都为高,则为空闲状态;若SCL为高,SDA由高变低,则为起始位;若SCL为高,SDA由低变为高,则为停止位;在start信号和stop信号之间,SCL信号由低变为高的过程中,SDA信号保持稳定,则数据位有效。

通信过程的控制  

数据交互过程中,数据的接收者没收到一个信号都会给一个应答信号。    当主设备在向从设备写数据时,从设备每接到一个数据就会发生ACK信号。主设备读数据时,发生地址和控制字节后,从设备要返回ACK信号。从设备返回数据后,主设备要返回ACK。当主设备接收到最后一个字节后要返回给从设备Nack信号,从设备接收到NACK信号后是否SDA控制器,主设备发生STOP信号,完成通信。     

 

传输数据—字节格式

发送在SDA线上的数据必须输8位,但是发送的字节数没有限制。每个字节后面都要跟一个响应位。首先数据传输的的是最高位(MSB)。

 

仲裁和时钟发生

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

                       

2 SDA仲裁

SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线

3 仲裁过程

                        

 

两个主节点的仲裁过程

上图是以两个节点为例的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉SDA线上的数据。因此在仲裁过程中数据没有丢失。

7位地址格式:在起始位“s”后,发送从机地址。这个地址共有7位,紧接着的第8位是数据方向位,0表示数据发送,1表示请求数据。停止位由主机发送,当然主机也可以选择不发送而发送起始位和从机地址接着传送数据。

第一个字节的位定义:当发一个地址后,连接的每一个器件都会在起始位后将7位地址与自己的地址比较,如果相同就会认为主机在寻址自己。至于是主机是发送器还是接收器是通过第8位标示的。从机地址的7位中有一部分是固定地址,另一部分是可编程地址,可编程地址决定了系统中可连接多少个同样的器件。可编程地址位的数量是由可使用管脚决定。

 

二、I2C协议GPIO实现分析

CBB中通过I2C_CBB_Api.h中定义的对外接口:

结构体

成员

I2C_DRV_STRU

S32   bValid;  /*驱动是否安装或者初始化标志*/

I2C_DRV_FUNCS_STRU   strI2cDrvFuncs;  /*总线驱动对外提供的接口函数指针*/

I2C_DRV_FUNCS_STRU

U32 (*_I2C_Init)    (U32 ulChipId, void *pTLV);

S32 (*_I2C_UnLoad)(U32 ulChipId);

S32 (*_I2C_Write) (U32 ulChipId,U32 ulLen,U8*   pucCmdAndData);

S32 (*_I2C_WriteWithoutStop) (U32 ulChipId,U32   ulLen,U8* pucCmdAndData);

S32 (*_I2C_Read)    (U32 ulChipId,U32 ulLen,U8* pucCmdAndData,U8* pucData);

U32 (*_I2C_ReadWithoutStop)(U32 ulChipId,U8   *pWrBuf,U32 ulWrlength,U8*pRdBuf,U32 ulRdLength);

 

I2C_DRV_PROPERTY_STRU

U32 ulExistFlag;       /*I2C总线在位标志*/

U32 ulBusType;              /*I2C总线类型*/

U32 ulBusIdInType;         /*同种类芯片中的ID*/

S32 (*_I2C_Install )(I2C_DRV_STRU* pstrI2cDrvStru);   /*I2c驱动安装函数指针*/

I2C_DRV_IO_PROPERTY_STRU

U32 ulBusIndex;          /*I2C总线索引*/

U32 ulIoOutputType;      /*IO输出方式*/

U32 ulSdaPort;         /*SDA总线使用的PORT*/

U32 ulSdaPin;           /*SDA总线使用的PIN*/

U32 ulSclPort;       /*SCL总线使用的PORT*/

U32 ulSclPin;            /*SCL总线使用的PIN*/

U32 ulAckDelayTime;    /*单位:us。对于慢速的器件可以配置*/ 

U32 ulWorkMode;    /*0:延时方式(默认);1:检测scl方式,timeout为500us*/

 

U32 I2C_UnLoad(U32 ulDrvIndex);

U32 I2C_Write(U32 ulDrvIndex,U32 ulLen,U8* pucCmdAndData);

U32 I2C_WriteWithoutStop(U32 ulDrvIndex,U32 ulLen,U8* pucCmdAndData);

U32 I2C_Read(U32 ulDrvIndex,U32 ulLen,U8* pucCmdAndData,U8* pucData);

U32 I2C_ReadWithoutStop(U32 ulDrvIndex,U8 *pWrBuf,U32 ulWrlength,U8*pRdBuf,U32 ulRdLength);

 

部分调用关系流程:

                 

     

三、I2C和SMBus异同分析

1.1 传输速率

I2C:工作频率可以在0Khz至3.4Mhz,常用的有三种,在标准模式下可达 100kbit/s   在快速模式下可达 400kbit/s   在高速模式下可达 3.4Mbit/s

SMBUS:协议规定其最高的传输速率为100Khz。因此,理论上来讲,如果总线中既有I2C器件,又有SMbus器件,其能够相互兼容的速率为10Khz和100Khz之间。

                       

注:在实际应用中,也发现不少SMbus器件也支持超过100Khz的工作频率,如下图。因此实际使用时需要仔细阅读器件资料,确认能够工作的频率,不能想当然的认为I2C和SMbus是完全兼容的。

 

1.2 Timeout功能

SMBUS在clock信号拉低后35ms会复位总线,标准I2C协议是没有这个要求的。

1.3 数据保持时间

SMBUS要求从数据信号有效到clk信号下降沿有300ns的保持时间,但I2C协议中没有对该参数的强制要求。

1.4 上升下降时间

SMBUS对信号的上升时间及下降时间都有要求,而I2C没有作要求。

1.5  ACK和NACK用法

在I2C中,即便从器件不对主器件发送的地址作出响应,主器件仍然可以继续进行读写操作。例如,适用于从器件正在进行其他实时任务,无法响应主器件的情况。SMBUS总是要求器件对其自身的地址作出响应,该方法可以用以检测可移除的器件是否还挂在总线上。

I2C协议规定,一个曾经响应过自身地址的从器件,在后续的数据传输时仍可以通过产生NACK信号的方式来决定自身不再继续接收数据。

SMBUS的NACK除了表示从器件正处于busy模式,还可以表示接收到了一个错误的数据或指令,这要求SMBUS器件在每个byte结束后,整个传输结束前能够产生NACK信号。

1.6 电气差异性

I2C的Hi/Lo电平标准有两种判定方法:相对值与绝对值,相对认定是依据Vdd的电压来决定,Hi为0.7 Vdd,Lo为0.3 Vdd,绝对认定则与TTL准位认定相同,直接指定Hi/Li电压,Hi为3.0V,Lo为1.5V。SMBus只有绝对认定,且准位与I2C有异,Hi为2.1V,Lo为0.8V,与I2C有部分交集。请参考下图。

另一个不同之处是SMBus是低功耗型总线。只需100uA就能维持工作,而I2C却要3mA,同样在漏电流(Leakage Current)的要求上,I2C最大的漏电流为10uA,SMBus为 5uA。

1.7 总结

总的来讲,I2C和SMbus有较多相同之处,兼容性较多,多数时候直连也能正确工作,但两个在不少方面还是存在有细微的差异,我们在使用时需多关注不同点,以防埋下可靠性应用的地雷。

 

版权声明:本文为liyang3226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liyang3226/p/11175745.html