一、基本概念。
IIC(I2C)协议是一种串行通信协议,用于连接微控制器和外围设备。IIC协议只需要两根信号线(时钟线SCL和数据线SDA)就能完成设备之间的通信;支持多主机和多从机通信,通过设备地址区分不同的设备;标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s;具有应答机制,可以检测数据的正确性和设备的存在性。
I2C通信协议使用两根线(串行数据线SDA和串行时钟线SCL)进行通信,其中SDA用于传输数据,SCL用于传输时钟信号;支持多主设备和多从设备的通信,通过地址来识别不同的设备,并支持数据的读取和写入操作。
I2C通信协议在很多嵌入式系统和电子设备中被广泛应用,例如传感器、存储器、显示屏等设备之间的通信;由于其简单的硬件连接和灵活的设备支持,I2C通信协议在许多应用中都具有很好的适用性。
物理拓扑结构图
通信的原理是控制SCL和SDA的时序,时期满足总线协议从而进行数据的传输。
I2C总线上每一个设备都可以作为主机或者从机,而且每一个设备都会对应一个唯一的地址(地址可以从器件手册得知)。主从设备之间通过这个地址来确定与哪个器件进行通信。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。主设备与从设备之间以字节(8位)位单位进行双向的数据传输。
二、时序介绍。 整体时序图如下:
I2C协议整体时序图
协议时序状态说明: (1)总线空闲状态:SDA为高电平,SCL为高电平。 (2)I2C协议起始位:SCL为高电平,SDA出现下降沿,产生一个起始位。
(3)I2C协议结束位:SCL为高电平,SDA出现上升沿,产生一个结束位。
(4)I2C读写数据状态:主要包括数据的串行输入输出和数据接受方对数据发送方的响应信号。具体的时序如图:
读写数据具体时序
当主机向从机写入数据时,SDA上的数据在SCL的高电平期间被写入从机中。从主机的角度看,需要在SCL低电平期间改变要写入的数据。而当主机读从机中的数据时,从机在SCL低电平期间改变要写入的数据,在SCL的高电平期间数据保持稳定,从主机角度看,需要在SCL的高电平期间将SDA上的数据读取存储。
数据传输过程:每当一个字节的数据或命令传输完成时,数据接受方会发送一位应答位,在响应应答位时,数据发出方将SDA总线设置为三态输入,由于总线上都有上拉电阻吗,因此此时总线默认为高电平,若数据接受方正确接受数据,则数据接受方将SDA总线拉低,表示此次的数据或命令接受成功。所以,主机将一字节的数据或命令传出后,会将SDA信号设置为三态输入,等待从机应答,即SDA被从机拉为低电平,若应答正确,表明可以结束或开始下一个数据或命令的传输,否则表明当前的数据或命令传输失败,主机就可以放弃写入或者重新发起写入。
三、I2C器件地址。 每个I2C器件都有一个器件地址,有的器件地址在出厂就设置好,无需更改,有的留下几个控制地址的引脚,由用户自己在硬件设计时确定。
一般情况下主机和从机的角色是确定的,主机向总线上发送地址信息,这条总线上所有的从机都会接收到总线上发来的地址,并与从机本身的地址做比较,如果一致,则匹配成功,相应的从机向总线上发送一位应答位,表示此次通信建立起来了,主机没有收到应答信号则表示寻址失败。
I2C协议在进行数据传输时,主机首先需要向总线上发出控制命令,其中,包括从机的器件地址和读写控制,然后等待相应的从机响应。如图:
控制命令传输数据格式
I2C 传输时,按照从高到低的位序进行传输。控制字节的最低位为读写控制位,当该位为 0 时表示主机对从机进行写操作,当该位为 1
时表示主机对从机进行读操作。例如,当需要对片选地址为 3’b100 的器件 发起写操作,则控制字节应该为 1010_100_0。若进行读操作,则控制字节应该为
1010_100_1。
四、I2C存储器地址。
每个支持I2C协议的器件,内部总会有一些可供读写的寄存器或存储器,因此,我们需要对一个器件的存储单元进行读写,就必须要能够指定存储器单元的地址。I2C协议设计了有从机存储器单元寻址地址段,该地址段为一个字节或两个字节长度,在主机确认收到从机返回的控制字节响应后由主机发出,地址长度因器件类型不同。以下是一个字节和两个字节的示意图:
一个存储器字节地址
存储器两个字节地址
五、I2C写时序。 1、单字节写时序:不同器件地址字节不同,所以对于写时序会有差别,图示为1字节地址段器件单字节写时序图。
iic通信协议原理(https协议原理)
根据时序图,从主机的角度分析一次写入单字节数据过程如下; a、主机设置SDA为输出; b、主机发出起始信号;
c、主机传输器件地址字节,其中最低位为0,表明为写操作; d、主机设置SDA为三态输入,等待读取从机应答信号;
e、读取应答位信号成功,主机设置SDA为输出,传输1字节地址数据; f、主机设置SDA为三态输入,读取应答信号;
g、读取应答信号成功,对于两字节地址段器件,传输地址数据低字节,对于1字节地址段器件,主机设置为输出,开始传输待写入的数据;
h、设置SDA为三态输入,读取应答信号,对于两字节地址段器件,接着发送一次低字节位地址信息,并读取应答信号;
i、读取应答信号成功,主机产生STOP位,终止传输。 2、I2C连续写时序(页写时序)
连续写也称页写,但不是所有的器件都支持连续写时序,连续写是主机连续写多个字节数据到从机,和单字节写操作类似,下图为连续写时序:
页写时序
六、I2C读时序。 1、单字节读时序。
单字节读操作分为1字节地址段器件单字节数据读操作和2字节地址段器件单字节数据读操作。以下为1字节地址段器件单字节数据读操作:
1字节地址段器件
从主机角度描述一次读取数据过程: a、主机设置SDA为输出; b、主机发起起始信号; c、主机传输器件地址字节,其中最低位为0,表明为写操作;
d、主机设置SDA为三态输入,读取从机应答信号; e、读取英达信号成功,主机设置SDA为输出,传输1字节地址数据;
f、主机设置SDA为三态输入,读取从机应答信号;
g、读取应答信号成功,主机设置SDA为输出,对于两字节的地址段器件,接着传输低字节地址数据,对于1字节地址段器件跳过次步骤; h、主机发起起始信号;
i、主机传输器件地址字节,其中最低位为1,表明为读操作; j、设置SDA为三态输入,读取从机应答位信号;
k、读取应答位信号成功,主机设置SDA为三态输入,读取SDA总线上的一个字节的数据;
l、产生无应答信号(高电平),无需设置为输出高电平,由于上拉电阻的原因,总线会被自动拉高。 m、主机产生STOP位,终止传输。 2、连续读时序(页读取)
连续读是主机连续从从机读取多个字节数据,这个和单字节读操作类似。如下:
连续读时序
具体时序分析类似于单字节读取。