I2C协议:
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、 CAN 等通讯协议的外部收发设备,所以被广泛使用。
I2C物理层:
-
是一个支持设备的总线。在 一个i2c设备总线中,可以连接多个i2c设备,支持多个i2c主机和多个i2c通讯从机。
-
一个I2C总线只是用两个总线线路,一条串行数据总线(SDA),用于表示数据;一条串行时钟线(SCL),用于收发数据的同步。
-
每个连接总线的设备都有其独立的从设备地址,主机可以通过这个地址进行选择连接总线的设备与其通信。
-
总线通过上拉电阻接到电源(开漏)。当I2C空闲时,输出高阻态,当所有I2C设备都输出高阻态时,上拉电阻将总线置为高电平。
-
多个主机同时使用总线的时候,通过 仲裁方式 来避免多个设备发送数据冲突的情况,合理选择由哪个设备占用总线。
-
具有三种传输模式:标准100 Kb/s、快速400 KB/s、高速3.4 Mb/s
-
连接到相同总线的IC数量受到总线的电容限制,400μF。
仲裁:SDA线的仲裁也是建立在总线具有线“与”逻辑功能(线与逻辑,即两个以上的输出端直接互连就可以实现“AND”的逻辑功能。两个一出一,一个一出零、没有一出零)的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,进行比较,输出低电平进行发送,输出高电平退出。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线
I2C总线协议原理:
SDA串行数据线、SCL串行时钟线。必须都接上上拉电阻,在空闲时间时保持高电平。
I2C协议相关术语:
1.起始位:SCL高电平时,SDA下降沿
2.停止位:SCL高电平时,SDA上升沿
3.数据传输:
i2c总线在数据传输时要保证SCL高电平期间,SDA的数据传输稳定,因此SDA的数据变化只能在SCL低电平时发生。
4.应答信号:当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
5、I2C写时序:
写时序的具体步骤:三步:1.需要操作的从设备地址 2 .需要写入的寄存器 3.需要写入寄存器的数据
(1)Start信号,表示开始
(2)需要操作的设备地址,高7位表示设备地址,末位表示读写,因为写时时序,所以是0;
(3)ACK应答信号,由从机发来的应答信号,0表示成功
(4)start起始位
(5)需要写入的寄存器地址,8位
(6)从机发来的应答信号ACK
(7)要写入的数据,8位
(8)从机发来的应答信号
(9)结束位
6、I2C读时许:
读时序的步骤:
四步:1.需要操作的从设备地址 2.将需要读取的寄存器发送给从设备所以是写 3. 需要读取的从设备地址
-
从设备向主机发送读取的寄存器中的数据。
(1)start信号,起始位
(2)需要操作的从设备地址,高7位为设备地址,最后一位为读写操作,0为写,1为读,此处为写所以为0;
(3)ACK从机发来的应答信号
(4)start信号
(5)指定要读取的寄存器,8位
(6)ACK从机发来的应答信号
(7)start信号
(8)再次确认需要操作的从设备地址,高7位设备地址,最后一位为读写操作,这里是读取操作所以是1
(9)ACK应答信号
(10)从I2C器件中读取的数据
(11)主机发出NO ACK信号,表示读取完成,不需要从机发出ACK信号了
(12)STOP停止信号
读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号,
写数据方向时, SDA 由主机控制,从机接收信号。切记,不要混淆。
7、I2C 多字节读写时序
有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。