# I2C协议 ## 硬件连接 I2C在硬件上的接法如下所示,主控芯片引出两条线SCL、SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻。 ![](media/005_i2c_hardware_connect.png) ## IIC传输数据的格式 ### 写操作 流程如下: * 主芯片要发出一个start信号 * 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读) * 从设备回应(用来确定这个设备是否存在),然后就可以传输数据 * 主设备发送一个字节数据给从设备,并等待回应 * 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。 * 数据发送完之后,主芯片就会发送一个停止信号。 下图:白色背景表示"主→从",灰色背景表示"从→主" ![](media/007_i2c_write.png) ### 读操作 流程如下: * 主芯片要发出一个start信号 * 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读) * 从设备回应(用来确定这个设备是否存在),然后就可以传输数据 * 从设备发送一个字节数据给主设备,并等待回应 * 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。 * 数据发送完之后,主芯片就会发送一个停止信号。 下图:白色背景表示"主→从",灰色背景表示"从→主" ![](media/008_i2c_read.png) ### I2C信号 I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。 * 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。 * 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 * 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA * SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化 I2C协议信号如下: ![image-20210220151524099](media/009_i2c_signal.png)