前言
I2C是最常见的串行通讯,广泛应用于芯片之间通讯。常见的有EEPROM,温度传感器,触摸屏等。本文力求简单明了把I2C通讯协议说清楚。后面文章会举一些I2C器件示例,让大家更深入理解I2C。
- I2C通讯规则
- 采用2条通讯线:时钟线SCL,数据线SDA。
- 主从方式通讯,一个主机(一般是单片机),可以多个从机(器件)。
- 不在通讯状态(总线空闲时),SCL和SDA都是高电平。
- 通讯说明
通讯的目的是主机把一个数据(8bit)传给从机或者读从机的一个数据。数据是一个bit一个bit传输,那么哪个是通信开始的第一个比特?I2C协议规定了一个起始信号。
起始信号:SCL高电平时,主机控制SDA从高->低。
主机发送给从机一个字节:
开始信号后,主机拉低SCL电平,然后主机输出bit7的SDA电平(bit7==1,SDA输出高,bit7==0,SDA输出低)。
主机拉高SCL电平,此时从机会检测SDA电平,从机就知道主机发送的bit7是0还是1?bit7发送完成。
主机再次拉低SCL电平,然后主机输出bit6的SDA电平(bit6==1,SDA输出高,bit6==0,SDA输出低)。
主机再次拉高SCL电平,此时从机会检测SDA电平,从机就知道主机发送的bit6是0还是1?bit6发送完成。
Bit5-bit0一样发送。
当发送完成bit0后,需要一个从机的应答信号。
从机应答信号:主机再次拉低SCL,此时SDA线主机释放(IO输入模式),如果从机正确收到了数据,从机拉低SDA电平,表示收到数据正确。如果不正确,从机不会拉低SDA线,SDA线是高电平。
主机拉高SCL线,然后检测SDA线电平,如果是低表示从机应答正确,继续发送下一个字节数据,如果SDA高,从机应答不正确,结束通讯。
结束信号:SCL高电平时,SDA从低->高。
总结:
1、虚线代表从机控制SDA总线,实线表示主机控制总线。
2、SCL高电平时,SDA电平变化代表开始信号或结束信号。所以在传输数据时,数据只能 在SCL低电平时改变。
3、SCL上升沿后,从机读取SDA电平,读取1bit数据。
4、第9个bit是从机应答(ACK)信号,如果是低说明从机正确接收(ACK),如果是高说明没 有正确接收或从机故障(NAK)。