I2C简介
简介
I2C总线 (Inter IC BUS) 是由Philips公司于八十年代初开发的一种通用数据总线,主要用于近距离、低速的芯片之间通信;I2C总线硬件结构简单,简化了PCB布线,降低了系统成本,提高了系统可靠性,在各个领域得到了广泛应用。
I2C总线是一种多主机总线,总线具有极低的电流消耗,抗干扰能力强,串行的8位双向数据传输速率在标准模式下可以达到100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。
I2C的一些特性:
- I2C有两根通讯线:SCL(Serial Clock)、SDA(Serial Data)
- 同步、半双工
- 带数据应答
- 支持总线挂载多设备(一主多从、多主多从)
I2C 总线的硬件电路
所有的I2C设备,SCL相连,SDA相连
所有SCL和SDA设备均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为\(4.7 k\Omega\)左右。
I2C 通信过程
graph LR
A[主机发起始信号] -->|启用总线| B[主机发一字节];
B --> C[指明从机地址];
B --> D[后续字节传输方向];
C --> E[从机回复应答信号];
D --> E;
E --> F[主机发一字节];
F --> J[从机回复应答信号];
J -->|重复| A;
J -->|通信完成| K[主机发停止信号释放总线]
-
通信主机发送起始信号启用总线
-
主机发送一个字节数据指明从机地址以及后续字节传送方向
-
目标从机发送应答信号回复主机
-
主机发送一个字节
-
目标从机发送应答信号回复主机
-
步骤1到5被重复,通信完成后主机发送停止信号释放总线
寻址方式
在主机发送起始信号后,必须先发送一个字节数据用于寻址,高7位为从机地址,最低位位后续字节传送方向(0表示主机数据-->从机;1表示从机数据-->主机)
I2C时序基本单元
起始与停止条件
起始条件: SCL高电平期间,SDA从高电平切换到低电平
终止条件: SCL高点平期间,SDA从低电平切换到高电平
起始与终止信号均由,通信主机发出,起始信号产生后总线处于占用状态,停止信号产生后,总线被释放处于空闲状态,在空闲状态的时候总线SCL与SDA均为高电平。
其中,停止信号的发出有两种:
停止信号
- 主机停止发送,发停止信号
- 从机停止接收,未向主机发送应答信号;此时主机发送停止信号结束通信
字节传送
I2C 通信时每个字节长度为8个字节,数据传送的时候,先传最高位,后传低位(高位先行),在主机发送完毕一个字节后从机必须发送一位应答位回复主机,因此I2C 通信的一帧数据帧一共有9位。
传输一个字节
在SCL低电平期间,通信主机会将数据位依次放到SDA线上;然后释放SCL,从机就会在SCL高电平期间读取数据位。因此在SCL高电平期间,SDA不允许有数据变化;上述过程循环8次即可发送一个字节。
发送应答
主机在接收完1个字节后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。(主机在接收之前 需要释放SDA)。
时钟同步
在I2C 通信过程中若多个主机产生时钟信号,则只有所有时钟信号均为高电平的时候,SCL上才表现为高电平,否则都为低电平。
仲裁
当所有主机在SDA上都写1的时候,SDA上的数据才表现为1,否则SDA上的数据就为0。
一个主机每发送一个Bit的数据的时候,在SCL高电平的时候,检查SDA的数据电平与自己发送的数据是否一致,如果不一致则主机便知道自己输掉仲裁,即停止向SDA写数据,此种仲裁方式保证了主机发送信息的时候不会丢失数据。