大家好,又见面了,我是你们的朋友全栈君。
一、基本概念。
I2C总线(I2C bus,Inter-IC bus)是一个双向的两线连接总线,提供集成电路之间的通信线路。I2C属于一种串行扩展技术,广泛应用于电视、录像机、音频设备。I2C的意思是“完成集成电路或者功能单元之间信息交换的规范或协议”,采用一条数据线(SDA)和一条时钟线(SCL)来完成数据的传输以及外围器件的扩展。
通信的原理是控制SCL和SDA的时序,时期满足总线协议从而进行数据的传输。
I2C总线上每一个设备都可以作为主机或者从机,而且每一个设备都会对应一个唯一的地址(地址可以从器件手册得知)。主从设备之间通过这个地址来确定与哪个器件进行通信。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。主设备与从设备之间以字节(8位)位单位进行双向的数据传输。
二、时序介绍。
整体时序图如下:
协议时序状态说明:
(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字节地址段器件单字节写时序图。
根据时序图,从主机的角度分析一次写入单字节数据过程如下;
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字节地址段器件单字节数据读操作:
从主机角度描述一次读取数据过程:
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、连续读时序(页读取)
连续读是主机连续从从机读取多个字节数据,这个和单字节读操作类似。如下:
具体时序分析类似于单字节读取。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129600.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...