文章目录
一、I2C总线介绍
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线(SDA和SCL)即可在连接于总线上的器件之间传送信息。
使用两个微控制器的 I2C 总线配置举例:
I2C总线是一种主从结构(Master/Slave)总线,I2C总线上每一个设备都可以作为主设备或从设备,但一个总线上一般只有一个主设备,可以带多个从设备。其中主设备用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU;而从设备只能被动响应主设备发起的通信请求,所以各种I2C接口芯片将作为从设备使用。
I2C具有以下特点:
①两线制:I2C总线由两根线组成,即SDA(串行数据线)和SCL(串行时钟线)。SDA线用于数据传输,SCL线用于同步数据传输。
②多主从结构:I2C总线支持多个主设备和多个从设备之间的通信。一个主设备控制总线并发起通信,而多个从设备响应主设备的指令。
③半双工通信:I2C总线上的数据传输是半双工的,即SDA线只能在一个方向上传输数据,要么是主设备发送数据到从设备,要么是从设备发送数据到主设备。
④冲突检测:I2C总线具有冲突检测机制,当两个设备同时尝试在总线上发送数据时,总线能够检测到冲突并采取相应的措施解决冲突。
⑤低速传输:I2C总线的传输速度较慢,通常分为标准模式、快速模式和高速模式。标准模式下,传输速率为100 kbps;快速模式下,传输速率为400 kbps;高速模式下,传输速率为3.4 Mbps。
关于I2C总线的传输速度分类,通常有以下几种:
①标准模式(Standard Mode):传输速率为100 kbps。
②快速模式(Fast Mode):传输速率为400 kbps。
③快速模式加(Fast Mode Plus):传输速率为1 Mbps。
④高速模式(High-Speed Mode):传输速率为3.4 Mbps。
需要注意的是,实际的传输速度可能会受到外部电路和设备的限制,因此在使用I2C总线进行通信时,需要根据具体的设备和要求选择适当的传输速度。
二、I2C从机地址
I2C总线有7位寻址和十位寻址两种模式,通常我们使用7位寻址模式。这就使得I2C总线上理论上寻址模式的最大节点数位2^7个或2 ^10个。但I2C有如下图所示的16个保留地址,所以最多有2 ^
7 /2^10 - 16g个从机设备。
1.7位地址格式
在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。
从机地址为7位长,其次是读/写位。任何I2C设备都必须遵循这个标准,USB2XXX传输的从机地址即为这7bit地址,不包含读写位。
一些厂商在提供从机地址的时候说的是包含了读写位的8bit地址,比如他说写地址为0x92,读地址为0x93,如下图所示:
这种情况下,你只需要将这个地址的前7bit提取出来,然后传入USB2XXX的接口函数即可,比如为0x49。
还有一种方式可以判断厂商提供的地址是7bit模式地址还是8bit地址模式的地址,7bit地址模式下,地址的取值范围在0x07到0x78之间,若超过了这个范围,那么这个地址可能就是8bit地址。
2.10位地址格式
I2C总线的10bit寻址和7bit寻址是兼容的,这样就可以在同一个总线上同时使用7bit地址和10bit地址模式的设备,在进行10bit地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是10bit地址。
三、I2C总线时序
1.传输位
由于连接到 I2C 总线的器件有不同种类的工艺(CMOS、NMOS、双极性),逻辑 ‘0’ (低 )和‘1’
(高)的电平不是固定的,它由 VDD 的相关电平决定 ,每传输一个数据位就产生一个时钟脉冲
(1)数据的有效性
SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在 SCL 线的时钟
信号是低电平时才能改变,如下图所示
(2)起始和停止信号
起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后
总线被认为再次处于空闲状态。
如图所示,起始信号和终止信号定义如下:
起始信号:在SCL线位于高电平时,SDA线由高电平变为低电平
终止信号:在SCL线位于高电平时,SDA线由低电平变为高电平
2.传输数据
(1)字节格式
发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB)(如下图)。如果从机要完成一些功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从主机准备好接收下一个数据字节并释放时钟SCL后,数据传输继续。
在一些情况下,可以用与I2C总线格式不一样的格式(例如兼容CBUS的器件)。甚至在传输一个字节时,用这样的地址起始的报文可以通过产生停止条件来终止。此时不会产生响应。
(2)响应(ACK与NACK)
·ACK(Acknowlegement): 在ACK/NACK时钟周期内,SDA线为低电平表示ACK信号,它用来通知对方有数据接收;
**·NACK(Negative Acknowledgement): **在ACK/NACK时钟周期内,SDA线为高电平表示NACK信号,它来通知对方本次通信结束;
数据传输必须带响应。相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间,发送器释放SDA线(高)。
在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(如图)。当然,必须考虑建立和保持时间。
当从机不能响应从机地址时,从机必须使数据线保持高电平。主机然后产生一个停止信号终止传输或产生重复其实条件开始新的传输。
(3)写从设备时序
如图所示,为主设备写数据到从设备的流程:
①主设备发送S信号开始本次通信
②访问从机地址
③发送’0‘代表写入数据到从设备
④在ACK/NACK周期,会有两种情况:
·如果总线上没有该设备,在下一个周期总线保持高电平(1)为ACK,这样主设备就知道从设备不在,然后发送停止信号终止本次通信;
·如果总线上有从设备匹配到了这个地址,则此从设备将会回复一个ACK信号,主设备收到该信号将会继续给此设备通信
⑤如果主设备收到了ACK信号,接下来它将会发送数据给从设备
⑥从设备收到这个数据后,将会给主设备回复ACK信号
⑦主设备在发送完这个字节数据后将发送S信号结束本次通信
(4)读从设备时序
如图所示,为主设备读数据到从设备的流程:
读从设备数据与写类似,暂不做过多描述