I2C协议解析

I2C协议解析

I2C有两条线:一条SCL时钟线,一条SDA数据线,具有双向传输的特性。一个I2C控制器可以和多个从设备通讯,通过不同的通信地址来区分它们,这一点和SPI不同,SPI是通过片选信号来区分的,所以线路上I2C更为简单。
I2C协议解析
图中表示I2C主机和从设备的连接方式

I2C状态的解析

I2C协议解析
1、空闲状态
SCL:高
SDA:高

2、开始信号:
SCL:高
SDA:高->低(跳变信号)

3、停止信号:
SCL:高
SDA:低->高(跳变信号)

4、ACK信号:
在传输完一个字节后的第九个时钟
SCL:高
SDA:低

5、NACK信号:
在传输完一个字节后的第九个时钟
SCL:高
SDA:高

数据的有效性

当开始传输数据的时候,I2C是在SCL为高电平的时候采样,所以在SCL为高电平的时候必须要保证SDA稳定,否则会导致通信失败,SDA改变电平只能在SCL为低电平的时候。

ACK/NACK的说明

1、主机向从机发送数据,从机无法接收或者无法识别解析数据时,会发送NACK
2、从机向主机发送数据,主机不想接收了,主机会发送NACK信号,这时从机就会释放SDA总线,好让主机接下来发送停止信号。

发起通信的流程

首先主机会线拉低SDA总线,标志我要开始通信了,接下来主机会发送 7bit的地址+1bit的读写位 如果某个从设备地址和主机发的地址吻合,就会发出一个ACK信号,通信就此建立。之后的读写操作,要具体看从设备的通讯规范,比如读一个寄存器可能要如下操作:
I2C协议解析
图中,灰色表示主机发送,白色表示从机发送。主机之所以如此发送数据,是根据从机的通信手册来的,并不是标准的I2C协议规定的,主机并不知道这些数据的意义,只有从机知道。

又比如写一个寄存器写一个寄存器:
I2C协议解析
文中的图片来源于https://blog.****.net/bleauchat/article/details/84975456?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158484350319725211909777%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158484350319725211909777&biz_id=0&utm_source=distribute.pc_search_result.none-task