1、I2C版本介绍
自 Version 4 之后 I2C 支持下面几种模式:
* 双向总线:
* standard-mode(Sm): ≤100 Kbit/S
* Fast-Mode(Fm):≤400 Kbit/S
* Fast-mode Plus(Fm+):≤1Mbit/S
* High-speed mode (Hs-mode): ≤ 3.4 Mbit/s
* 单向总线:
* Ultra Fast-mode (UFm): ≤ 5 Mbit/s
2、IIC数据格式
IIC时序图如下:
byte format:
-
传输长度必须是一个字节(8 bit)
-
每次传输的字节不受限制
-
数据必须以 MSB 开头进行传输,也就是先传输最高位
-
从机可以将时钟线 SCL 保持在低位,迫使主机进入等待状态。
2.1、Start、Stop事件
SCL为高时,SDA由高跳变到低,表示启动事件
SCL为高时,SDA由低跳变成高,表示停止事件
2.2、数据有效性
SDA线上的数据必须在时钟的高周期保持稳定。数据状态的切换只能发生在时钟低电平期间。每个传输的数据位产生一个时钟脉冲。
2.3、ACK、NACK
在第九个时钟脉冲期间,主机释放总线权,SDA拉高,从机可将SDA拉低,表示响应。
在第九个时钟脉冲期间,SDA为高电平,表示NACK。之后主机可以发出停止位中止传输,或发送重复开始条件开始新的传输。
产生NACK的条件:
1、总线上没有报文地址的接收器
2、接收器没有准备好与主机进行通信
3、在传输过程中,接收器收到应用协议不理解的数据或命令
4、接收器无法接收更多有效的数据,如数据缓冲区满
5、主接收器用 NACK 通知从发送器结束传输。比如主设备已经接受到足够多的数据,不希望从设备发送更多的数据时,就可以 NACK 从设备,这样从设备就会停止发送
2.4、时钟同步与仲裁
2.4.1、时钟同步
两个主机可同时开始在空闲总线上进行传输,并且需要一种方法来确定控制总线并完成传输。这种方法是时钟同步和仲裁。在单主机系统中不需要时钟同步和仲裁。时钟同步是通过I2C接口中SCL信号的线与实现的。
所有主机在SCL线上产生自己的时钟来传输I2C总线上的报文。当SCL从高到低过度时,总线上的主机开始计数其低电平时间,且一旦主机时钟变低,会将SCL保持在低状态,直到变为高状态为止。如果clk2一直在低电平状态,则clk1时钟的由低到高的转变不会改变SCL线的状态。
当所有相关的主机计数完成低周期后,时钟线被释放为高电平。这样,主时钟和 SCL 线的状态之间就没有区别,所有主时钟都开始计数其高电平周期。第一个完成其高电平周期的主机将 SCL 线再次拉低。
2.4.2、数据仲裁
仲裁与同步类似,从机不参与仲裁过程。仅在多主机时使用。仲裁就是在多主机模式下,确定哪个主机可以获得访问权限传输IIC报文。
SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。
仲裁过程:
DATA1 和 DATA2 分别是两个主机向总线所发送的数据信号,SDA 为总线上所呈现的数据信号,SCL 是总线上所呈现的时钟信号。
主机 1、2 同时发送起始信号,在 clock1 ,两个主机都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。
第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。
在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉 SDA 线上的数据。因此在仲裁过程中数据没有丢失。
2.4.3、时钟延长
通过延长SCL的低电平状态来暂停事务,从机可通过将SCL拉低,强制主机进入等待模式。直到再次释放高电平,事务传输继续。时钟延长是可选的,大多数从设备无法延长时钟。在Hs mode,只能使用 byte level,也就是只能在传输完一个字节(8bits)后拉低 SCL 进行时钟延展。在 Standard-mode 和 Fast-mode,既可以 byte level 也可以 bit level,bit level 意思是哪怕你之传输了 2 bits ,从机也可以拉低 SCL 线进行时钟延展,临时暂停传输。
此时,从机可以在接收和确认字节后将 SCL 线保持为 LOW,以强制主机进入等待状态,直到从机为握手过程中的下一个字节传输做好准备。
3、地址及R/W位
a、7位地址
在起始条件S后,主机发送7位地址,第8位为数据方向('0'是发送、写,'1'是读数据),第9位为ACK。主机进行数据传输,从机接收数据产生ack,一般由P位停止,但如果主机依然想进行通讯,则会发送重复起始条件Sr,而非发送P停止位。
b、10位地址
10 位从机地址规定如下,其中 11110 为 10 位地址的指示信号,A9-A0 表示 10bits 地址:
3.1、读写操作
写操作:主机向从机进行单字节写操作。先写从机设备地址(7bit地址+‘0’),从机ACK1,再传输器件寄存器地址,从机ACK2,写入1byte数据,从机ACK,产生Stop位。
读操作:主机从从机单字节读操作。主机需先写入设备地址及寄存器地址;发送Sr,读设备地址,设备发送数据至主机,主机收到数据产生NACK,Stop。
3.2、第一个地址字节位定义
第一个字节头7位组成从机地址。最低位(LSB)是第8位,决定了报文的方向。LSB最低位是‘0’表示主机会写数据到从机;‘1’表示主机向从机读数据。当发送一个地址后,系统中的器件会将7位地址也自身地址比较,如果一样,器件会被主机寻址。
从机地址由一个固定和一个可编程的部分构成。若器件有4个固定和3个可编程地址位,则相同总线上最多挂载8个相同的器件。
3.3、广播寻址
若第一个字节地址为8bit0,则表示广播寻址。
通用广播地址用于同时寻址连接到 I2C 总线的所有设备。但是,如果设备不需要处理广播数据,则可以通过不发出 ACK 来忽略该地址。如果某设备需要来自通用广播地址的数据,它将发送 ACK 给该地址并充当从接收器。主机实际上不知道有一个或多个设备响应时确认了广播数据(不确定有多少个 ACK)。每个能够处理此数据的从机接收器都会确认第二个字节和随后的字节。无法处理这些字节的从机将不应答从而忽略广播呼叫地址的含意通常在第二个字节说明。
3.4、第2个地址字节位定义
3.4.1、当B为‘0’
* 0000 0110(06h):设备将复位以及设置地址的可编程部分。接收到这个 2 字节命令后,所有支持响应通用广播地址的设备将复位,并将其地址的可编程部分改写保存。
* 0000 0100 (04h):收到该命令后设备将通过硬件设置地址的可编程部分。(Write programmable part of slave address by hardware).
* 0000 0000 (00h): 不允许将此代码用作第二个字节
3.4. 2、当B为‘1’
这两个字节序列是一个‘硬件广播呼叫’。即序列由一个硬件主机发送,例如键盘扫描器,它们不能编程来发送一个期望的从机地址。由于硬件主机预先不知道报文要传输给哪个器件。它只能产生这个硬件广播呼叫和它自己的地址,让系统识别它。
第二个字节中剩下的 7 位是硬件主机的地址,这个地址被一个连接到总线的智能器件识别,例如微控制器,并指引硬件主机的信息。如果硬件主机也可以作为从机,它的从机地址和主机地址一样。
4、实测波形
4.1、单字节写
4.2、单字节读
5、电气特性
tsu,dat 和 thd,dat分别为数据信号data的建立和保持时间;由于IIC是高电平采样,保持时间为时钟下降沿到数据不变区间。
6、其他
6.1、写操作时ACK后存在SDA脉冲。
如上图写操作实测波形,在ACK后,有一小段SDA脉冲(在SCL低电平处,数据无效)。
可能的原因如下:总线控制权交换之间存在时间差。从机ACK完后,释放总线为高,此时主机获取总线控制权并需将总线拉低,但此时主机拉SDA晚了。故产生脉冲。
在读操作时,从机ack完后,从机要发送数据到主机,总线权依然在从机方。故一般sda脉冲出现在写操作期间。
6.2、总线复位方式
若SDA被异常拉低,可使用以下方式进行总线复位
1、若I2C设备具有硬件复位输入,可使用硬件复位信号来复位总线
2、若没有硬件复位信号,可采用重新上电方式以激活强制性的内部上电复位电路
3、主机发送 9 个时钟 SCL 脉冲。使总线保持低电平的设备应在这九个时钟内的某个时间释放总线。主设备初始化 I2C 总线时,可以冗余加 9 个 SCL 脉冲以复位 I2C 总线,或者检测到 SDA 长时间被拉低后,可以以控制 IO 高低翻转的方式控制 SCL 产生 9 个脉冲。