I2C 是由 Philips 公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称
SCL)和 SerialData(简称 SDA)。I2C 是总线结构,1 个 Master,1 个或多个 Slave,各 Slave
设备以 7 位地址区分,地址后面再跟 1 位读写位,表示读(=1)或者写(=0),所以我们
有时也可看到 8 位形式的设备地址,此时每个设备有读、写两个地址,高 7 位地址其实是
相同的。
I2C 数据格式如下:
无数据:SCL=1,SDA=1;
开始位(Start):当 SCL=1 时,SDA 由 1 向 0 跳变;
停止位(Stop):当 SCL=1 时,SDA 由 0 向 1 跳变;
数据位:当 SCL 由 0 向 1 跳变时,由发送方控制 SDA,此时 SDA 为有效数据,不可随意改变
SDA;
当 SCL 保持为 0 时,SDA 上的数据可随意改变;
地址位:定义同数据位,但只由 Master 发给 Slave;
应答位(ACK):当发送方传送完 8 位时,发送方释放 SDA,由接收方控制 SDA,且
SDA=0;
否应答位(NACK):当发送方传送完 8 位时,发送方释放 SDA,由接收方控制 SDA,且
SDA=1。
当数据为单字节传送时,格式为:
开始位,8 位地址位(含 1 位读写位),应答,8 位数据,应答,停止位。
当数据为一串字节传送时,格式为:
开始位,8 位地址位(含 1 位读写位),应答,8 位数据,应答,8 位数据,应答,……,8
位数据,应答,停止位。
需要注意的是:
1,SCL 一直由 Master 控制,SDA 依照数据传送的方向,读数据时由 Slave 控制 SDA,写数
据时由 Master 控制 SDA。当 8 位数据传送完毕之后,应答位或者否应答位的 SDA 控制权与
数据位传送时相反。
2,开始位“Start”和停止位“Stop”,只能由 Master 来发出。
3,地址的 8 位传送完毕后,成功配置地址的 Slave 设备必须发送“ACK”。否则否则一定时间
之后 Master 视为超时,将放弃数据传送,发送“Stop”。
4,当写数据的时候,Master 每发送完 8 个数据位,Slave 设备如果还有空间接受下一个字
节应该回答“ACK”,Slave 设备如果没有空间接受更多的字节应该回答“ NACK”,Master 当收
到“NACK”或者一定时间之后没收到任何数据将视为超时,此时 Master 放弃数据传送,发送
“Stop”。
5,当读数据的时候,Slave 设备每发送完 8 个数据位,如果 Master 希望继续读下一个字节,
Master 应该回答“ACK”以提示 Slave 准备下一个数据,如果 Master 不希望读取更多字节,
Master 应该回答“NACK”以提示 Slave 设备准备接收 Stop 信号。
6,当 Master 速度过快 Slave 端来不及处理时,Slave 设备可以拉低 SCL 不放(SCL=0 将发生
“线与”)以阻止 Master 发送更多的数据。此时 Master 将视情况减慢或结束数据传送。
在实际应用中,并没有强制规定数据接收方必须对于发送的 8 位数据做出回应,尤其是在