I2C协议理解
I2C总线(Inter-Integrated Circuit)
一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线连接图
I2C硬件结构
- I2C总线通过上拉电阻接正电源.
- 当总线空闲时,两根线均为高电平,连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
I2C总线的构成
- 只有两根双向信号线
- 一根是数据线(SDA):串行数据线,传输通信数据
- 一根是时钟线(SCL):串行时钟线,传输CLK信号,一般是主设备向从设备提供
主设备与从设备
- 主端主要用来驱动SCL line、 从设备对主设备产生响应;
- 二者都可以传输数据,但是从设备不能发起传输,且传输是受到主设备控制的。
I2C总线的作用
- 可发送和接收数据
- 各种被控制电路均并联在这条总线上,每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
I2C总线协议
- I2C总线在传送数据过程中共有三种类型信号,它们分别是:起始信号、终止信号和应答信号。(这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。)
- 起始信号(S):当SCL为高电平期间,SDA由高到低的跳变
- 终止信号§:当SCL为高电平期间,SDA由低到高的跳变
- 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
- 任何时候时钟信号都是由主控器件产生。
数据的有效性
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;时钟信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
数据传输格式与应答
I2C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。
应答信号
- 应答信号的时钟是由主设备产生的
- 主机写从机时,每写完一个字节,如果正确,从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。
- 主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出认可信号,告诉从机所发数据已经收妥
- 字节传送与应答每一个字节必须保证8位长度,数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位ACK(即一帧共有9位)
数据传送组合方式
当SDA从1变动到0,而SCL还是1时,表示开始数据传输,接下来的7位,就是设备的地址,紧接着的是读写标志,其为1时是读取,为0则是写
注:阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送. A表示应答,A表示非应答(高电平)
- List item
写操作:主机向从机发送数据,数据传送方向在整个传送过程中不变
读操作:主机在第一个字节后,立即由从机读数据
- 在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生 一次,但两次读/写方向位正好相反
- 在传输期间,如果从设备来不及处理主设备发送的数据,从设备会保持SCL线为低电平,强迫主设备等待从设备释放SCL线,直到从设备处理完后,释放SCL线,接着进行数据传输
总线的寻址
寻址字节的位定义
- D7~D1位组成从机的地址。
- D0位是数据传送方向位,为“0”时表示主机向从机写数据为“1”时表示主机由从机读数据
- I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
- 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。
I2C的读写流程
写寄存器的标准流程
1.Master发起START
2.Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
3.Slave发送ACK
4.Master发送reg addr(8bit),等待ACK
5.Slave发送ACK
6.Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7.Slave发送ACK
8.第6步和第7步可以重复多次,即顺序写多个寄存器
9.Master发起STOP
读寄存器的标准流程
1.Master发起START
2.Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
3.Slave发送ACK
4.Master发送reg addr(8bit),等待ACK
5.Slave发送ACK
6.Master发起START
7.Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
8.Slave发送ACK
9.Slave发送data(8bit),即寄存器里的值
10.Master发送ACK
11.第9步和第10步可以重复多次,即顺序读多个寄存器
12.Master发起STOP