前言
i2c总线对于嵌入式开发人员来说是必不可少需要掌握的一种通讯方式,跟UART、SPI相比,I2C只需要使用两根线(SDA 、SCL线)就能完成数据通讯。
该笔记参考韦东山驱动大全
一、i2c主要特点
1、i2c采用主从模式,在一条i2c总线上一个主设备(主控设备)可以连接很多i2C从设备(以下简称设备),每个i2C设备都有一个对应的设备地址,用来确保数据主设备能够正确找到具体对象设备。
2、i2c设备地址为7位从机地址,第8位为“方向地址”(方向读/写,0表示读,1表示写)。
3、i2c设备理论上最多支持2^7个设备, 128个地址,0x00不用,所以理论上是127个设备。
4、i2c的读写只能是主设备发起,从设备始终被动状态。
i2c硬件连接图
二、i2c传输数据格式
2.1写操作
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
主设备发送一个字节数据给从设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
2.2,读操作
流程如下:
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
从设备发送一个字节数据给主设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
三、i2c信号
I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
-
开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
-
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
-
响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
-
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
例如主设备要往从设备中写入数据该怎样操作呢?
例如写入地址为0x0b 对应二进制为1010100 0
在SCL为低电平时改变SDA的值,并且SCL为高电平时SDA保持不变,其中前7bit为地址位,第8bit为读写位,0为写。当主设备写完后会释放i2c总线,这时上拉电阻会将总线拉高,如果存在该地址值的从设备,那么从设备就会返回一个回应信号将i2c总线拉低(第9位信号由从设备驱动),这样主设备就能判断从设备存在,然后再进行后面的数据传输,后面数据传输跟地址传输一样。