转自: https://juejin.cn/post/7016706907779891214
Video: 4分钟看懂!I2C通讯协议 最简单的总线通讯!
I2C 是很常见的一种总线协议,I2C 是 NXP 公司设计的,I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),由于不接上拉电阻的时候这两个引脚为悬空状态,而悬空状态引脚的电平是无法确定的,所以这两条数据线需要接上拉电阻,一般是4.7K,总线空闲的时候SCL和SDA都处于高电平。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的,I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备 了,一个 I2C 总线连接多个 I2C 设备,如图
I2C开始通信的标志,主机通过这个标志告诉从机要开始进行通信了,当SCL为高电平时,SDA出现下将沿时表示起始位
I2C通信结束的标志,当SCL为高电平时,SDA出现上升沿时表示停止位
I2C数据总线传输要保证在SCL为高电平时,SDA数据保持稳定,所以SDA上数据变化只能在SCL为低电平时
地址帧:这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作
读/写位:0:低电平,主设备向从设备写数据,1:高电平,主设备向从设备读数据
ACK:消息的每一个帧都有一个确认位,如果设备接收到了地址帧或者数据帧,都会给发送设备返回一个ACK
当IIC总线的数据线SDA和时钟线SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节; 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功
接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平,发送一个ACK信号, 如果接收器是主机端,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主机端发送一个停止信号P
主机向从机写,红色部分表示主机发送,蓝色部分表示从机发送。A表示应答,NA表示非应答(高电平)。S表示起始信号,P表示终止信号
1. 开始信号:在SCL从高电平切换为低电平之前,主设备通过将SDA从高电平切换到低电平,启动信号与停止信号始终是由主设备控制产生的
2. 主设备向每个从设备发送要与之通信的从设备的7位或10位地址,通过发送具体的设备地址来决定要访问哪个I2C设备,这是一个8位的数据,其中高7位是设备地址,最后1位是读写位,1表示读操作,0表示写操作
3. 每一个从设备会根据主设备发过来的地址与自身的地址做比较,如果地址匹配,那么从设备会将SDA拉低来返回ACK应答信号,地址不匹配时,从设备会将SDA拉高,在从设备没有将SDA拉低会将Master视为超时,将放弃数据传送,发送“Stop”
4. 重新发送开始信号
5. 主机发送要写入的丛机的寄存器地址
6. 从机发送ACK信号
7. 发送要写入寄存器的数据帧,传输完每个数据帧后,即8位数据,主机将SDA拉高,等待从机将SDA拉低,即返回ACK,以确认已成功接收到该帧
9. 结束信号:主设备将SCL切换为高电平,再将SDA切换为高电平,从而向从设备发送停止信号
读时序主要分为四个大步骤:1.发送设备地址,2.发送要读取的寄存器值,3.重新发送设备地址,4.I2C 从设备输出要读取的寄存器值
1. 主机发送起始信号
2. 主机发送要读写的从设备地址
3. 读写控制位,因为是向 I2C 从设备发送数据,因此是写信号
4. 从机发送 ACK 应答信号
5. 重新发送start信号
6. 主机发送要读取的寄存器地址
7. 从机发送的 ACK 应答信号
8. 重新发送 START 信号
9. 重新发送要读取的 I2C 从设备地址
10. 读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据
11. 从机发送的 ACK 应答信号
12. 从 I2C 器件里面读取数据
13. 在读到最后8位数据时,主机要将SDA置1,主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了
14. 主机发出 STOP 信号,停止 I2C 通信
注意:SCL一直由主机端控制,SDA依照数据传送的方向,读数据时由从机控制SDA,写数据时由主机控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反
优点:仅使用两根信号线,支持多个主设备和多个从设备,ACK / NACK位用于确认每个帧都已成功传输,硬件没有UART复杂
缺点:数据传输速率比SPI慢,数据帧的大小限制为8位,硬件设计比SPI复杂