一、硬件连接
从芯片引出SDA,SCL两条线,在一条I2C总线上可以接很多个设备,理论上可以接127个设备,另在两条数据线上加上拉电阻。
为什么要接上拉电阻?
I2C两个引脚是开漏输出。接上拉电阻是因为I2C通信需要输出高电平的能力。一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换。
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。
二、传输格式(先高位后低位)
1.写操作
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
主设备发送一个字节数据给从设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
2.读操作
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
从设备发送一个字节数据给主设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
当主机接收到最后一个数据的时候,发送NAK信号,告诉从机已经接收完成,并且发出停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
设备地址(7位)和读写方向(1位)合成一个1字节的数据。
三、传输信号
I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
-
开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
-
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
-
响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
-
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
示例: