一、I2C的两条总线
I2C 总线是一个半双工通信协议,I2C上有两条总线,一条为时钟线(SCL),一条为数据线(SDA),这两条线默认被拉高。原因是I2C的设计者设计的原理就让这两条线只能被拉低,而不能被拉高。
二、通讯方式
在 I2C 协议中有四种信号:起始信号、应答信号、非应答信号和结束信号。当 SDA 和 SCL 同时为高电平时,总线处于空闲状态。
I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。其实说这么多我们只需要知道他是怎么工作的就好了。
我们按照步骤来:
- 首先要找到从机的地址(起始信号)
- 从机应答(应答信号、非应答信号)
- 对从机的地址进行操作
- 结束通讯(结束信号)
2.1 I2C的通讯启止
起始信号:在 SCL 为高电平时,SDA 从高电平变为低电平。
停止信号:在 SCL 为高电平时,SDA 从低电平变为高电平。
2.2 I2C的应答信号和非应答信号
数据发送方每发送一个字节(8位),需要接收方反馈一个应答信号或非应答信号。非应答信号一般会在数据接收失败或主机数据接收完成回复一个非应答信号。
应答信号(ACK):第 9 个脉冲带来之前将 SDA 设置低电平,并且在时钟线为高电平期间保持 SDA 为低电平。
非应答信号(NACK):第 9 个脉冲带来之前将 SDA 设置高电平,并且在时钟线为高电平期间保持 SDA 为高电平。
2.3 数据的有效性
- I2C在进行数据传送时,SCL为高电平时,SDA上的数据必须稳定。
- 只有SCL为低电平时,SDA上的数据才允许变化。
2.4 数据的传输
I2C在进行数据传输时的一般规则如下:
- 发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制,第八位为读写位。
- 首先传输的是数据的最高位(MSB),每个字节后必须跟一个响应位,所以,一帧数据共有9位,也就是说第九位为应答位。
- 如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。
2.5 完整的通讯信号图
这是通过i2ctool命令获取eeprom的地址上的一个值的波形图:
我自己画了一个简图:
从图上可以看出从机地址(需要有移一位,所以 从机地址位 0101 0000 转为16进制就是 0x50 )
至于后面16位地址是记不住多少了,但是可以通过波形看出来,后面的数据也可以看出来,我画的图不一定准确,所以你们可以自己试一试。