I2C接口控制器之协议解析

I2C总线使用多主从架构,一般在小数据量场合使用,传输距离短。

I2C协议解析

接口一共需要两条总线路,即SCL(串行时钟线)、SDA(串行数据线),I2C总线式半双工的,所以任意时刻只能有一个主机,每个I2C的器件都有一个唯一的器件地址。总线上的主设备和从设备之间以字节为单位进行双向的数据传输。

I2C协议规定

  1. 在SCL为高电平的时,数据总线(SDA)必须保持稳定,所以数据总线(SDA)只有在低电平的时候才可以改变。如下图所示
    在这里插入图片描述

  2. 在时钟为高电平的时候,数据总线由高到低的跳变为总线的起始信号,而数据总线从低到高的跳变为总线的停止信号。
    在这里插入图片描述

  3. 应答,当I2C主机将8位数据或命令传出后,会将数据总线(SDA)释放,即设置为输入状态,然后等待从机应答,若应答信号为低电平0则表示应答,高电平1则表示非应答,但是此时的时钟仍然是主机提供的。
    在这里插入图片描述
    数据帧的格式, I2C通讯的时候,首先是发送“起始信号”,紧接着就是七位期间地址,第八位是数据传送方向位,其中0代表的写,1代表的是读,后面就是等待从机的应答。整个传送结束后,终止信号由主机产生。此外需要注意的是,发送数据的时候是高位先发送。

I2C器件地址

每个 I2C 器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改(例如 OV7670 器件地址为固定的 0x42),有的确定了几位,剩下几位由硬件确定(比如常见的 I2C 接口的 EEPROM 存储器,留有 3 个控地址的引脚,由用户自己在硬件设计时确定)。
严格讲,主机不是直接向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向总线发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
I2C协议在进行数据传输的时候,主机需要首先向总线上发出控制指令,其中控制命令就包括了从机器器件地址和读写控制,然后等待从机响应。控制命令传输的数据格式如下:
在这里插入图片描述
I2C传输时,按照从高到低的位序进行传输,控制字节的最低位位读写控制位,为0时表示主机对从机进行写操作,当该位为1时,表示主机对从机进行读操作。

I2C存储器地址

每个支持 I2C 协议的器件,内部总会有一些可供读写的寄存器或存储器,例如,EEPROM 存储器,内部就是顺序编址的一系列存储单元;型号为 OV7670 的 CMOS 摄像头(OV7670 的该接口叫 SCCB 接口,其实质也是一种特殊的 I2C 协议,可以直接兼容 I2C协议),其内部就是一系列编址的可供读写的寄存器。因此,我们要对一个器件中的存储单元(寄存器和存储器,以下简称存储单元)进行读写,就必须要能够指定存储单元的地址。

I2C写时序

在这里插入图片描述
单字节地址写单字节数据过程:
1、主机设置SDA为输出;
2、主机发起始信号;
3、主机传输器件地址字节,其中最低位为0,表明写操作;
4、主机设置SDA为三态门输入,读取从机的应答信号;
5、读取应答信号为成功,主机设置SDA为输出,传输1字节地址数据。
6、主机设置SDA为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA为输出,传输待写入的数据;
8、主机设置SDA为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机产生STOP位,终止传输。
在这里插入图片描述
连续写时序
连续写(也称页写,需要注意的是 I2C 连续写时序仅部分器件支持)是主机连续写多个字节数据到从机,这个和单字节写操作类似,连续多字节写操作也是分为 1 字节地址段器件和 2 字节地址段器件的写操作。
在这里插入图片描述

I2C读时序

在这里插入图片描述
单字节地址读取单字节数据过程:
1、主机设置SDA为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA为输出,传输一字节地址数据;
6、主机设置SDA为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为1,表示读操作;
9、设置SDA为三态门输入,读取从机应答信号;
10、读取应答信号成功,主机设置SDA为三态门输入,读取SDA总线上的一个字节的数据;
11、产生无应答信号即高电平(无需设置为输出高电平,因为总线会被自动拉高);
11、主机产生停止位,终止传输;
在这里插入图片描述
连续读时序
连续读是主机连续从从机读取多个字节数据,这个和单字节读操作类似,连续多字节读操作也是分为 1 字节地址段器件和 2 字节地址段器件的读操作。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45614076/article/details/126472442