I2C总线协议
http://dpinglee.blog.163.com/blog/static/14409775320112239374615/
https://blog.csdn.net/tingguan/article/details/81139939
https://blog.csdn.net/g_salamander/article/details/8016698
一、简介
I2C总线是由PHILIPS公司开发的两线式双向串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。
特点:
①接口简单
只有两条位宽为1的连接线:SDA-----------1-bit数据线
SCL-----------1-bit时钟线
②双向总线
SDA和SCL均为双向线路
③多种模式
支持三种传输模式:
标准模式:传输速度可达100Kbit/s
快速模式:传输速度可达400Kbit/s
高速模式:传输速度可达3.4Mbit/s
(慢,用于传感器,功耗很低)
④多主机自动仲裁
支持多个主机,主机之间的仲裁由各个主机内部自动完成,不需要总线上有额外的仲裁线路。(使用简单,只要往I2C上挂设备即可,无需考虑其是否冲突)
二、术语
主机初始化发送,产生时钟信号和终止发送的器件。
从机被主机寻址的器件,不能发起操作。
发送器发送数据到总线的器件。
接收器从总线接收数据的器件。
多主机同时有多于一个主机尝试控制总线 但不破坏报文,一种状态。
仲裁是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程,即选出一个主机控制总线。
同步两个或多个器件同步时钟信号的过程。
文章图片
--I2C总线就是SCL和SDA两根线,I2C上的一根线对应设备(device)中两根线。
SCLK IN=SCLK
SCLKN1 OUT=1时,SCLK输出为零,SCLKN1 OUT=0时,SCLK输出为1(断开,高阻)
(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑; 接口采用线与的方式,因此,任何一个端口输出为低电平,在总线上即表现为低电平。即SCL=SCLK1&SCLK2
(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。
四、通信格式
文章图片
总线空闲:SDA: 高电平
CLK: 高电平
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
结束时可以不发终止条件,继续发其实条件,即重复起始条件。
数据有效性:SCL为低时,SDA上的数据才能变,SCL为高时,SDA保持不变。
数据位:一般以1个Byte为单位,须为8的倍数。
响应:第九位为响应位,SDA为低表示有响应。由接收器产生。Master每发送完8bit数据后等待Slave的ACK。
五、从机寻址
文章图片
文章图片
I2C第一个字节中位的定义 七位寻址:
第一个字节内容十分重要:
头7位 - 从机地址
第8位 - 报文的方向:0~主机向从机写入数据;1~主机从从机读取数据。
从机在接收到第一个字节数据之后:
如果头七位不是特殊的格式 - 系统中的每个器件都在起始条件后将头七位与自己的地址比较,如果一样,器件会认为它被主机寻址。
是特殊的格式 - 根据不同的格式做出不同的反应。
十位寻址:
如果头七位是11110XX特殊的格式 - 从机会意识到主机正在进行10位寻址,如果从机支持10位寻址,那么会将XX与自己10位地址的高2位比较,如果相同,则会在第九拍给出相应,并且会接收接下来的第二个字节;如果不同,则不响应,不接收接下来的第二个字节。
文章图片
主机-发送器用10位地址寻址从机-接收器 六、接收器响应
【I2C总线协议】1、主机发送器-从机接收器
主机向从机发送数据。从机发送响应,主机在响应位期间将自己的SDA拉高。当主机的寻址地址发送完毕后,如果主机收到响应,主机就认为已寻址到目标从机,开始下发第一组8位数据,若主机收到此数据的响应,则继续下发下一组数据;若主机未收到响应,主机需终止本次写操作(不管主机的数据是否发完/)。
文章图片
主发从收 2、从机发送器-主机接收器
即主机从从机读取数据。主机发送响应,从机在响应位期间将自己的SDA拉高。主机接到从机发送的数据后,发出响应,从机在发送下一组数据。
由此看来,主机读取数据时,停止本次操作的条件是:当主机接收到最后一个字节的数据后,在响应位不再给出响应,以通知从机主机已经不再需要数据,响应位过后主机依然需要在总线上发起停止条件以结束本次操作。
寻址阶段:从机发响应
数据阶段:主机读完数据给响应
结束:主机不响应()
文章图片
主收从发 七、多主机的时钟同步和仲裁
1、SCL时钟同步
在空闲总线上两个主机可以同时开始传输,所以必须要有一个方法来决定哪个主机来控制总线并完成其数据传输.这个方法就是时钟同步和仲裁.在单主机系统中,时钟同步和仲裁不需要了.
文章图片
时钟同步通过使用I2C接口与SCL线的线与连接实现.意味着SCL线从高到低期间会引起主机开始计算它的低电平周期,一旦主机时钟变低,它会保持SCL线处于这种状态直到时钟到达高电平.然而,如果另一个时钟依旧是低电平,时钟的从低到高的变化并不会改变SCL线的状态.
当所有的主机的低电平周期都结束了,时钟线才回到高电平.这时主机时钟和SCL的状态一致,所有的主机开始计数他们的高电平周期.第一个结束高电平的主机将SCL线重新拉低.
同步的SCL时钟的低电平周期由所有主机中最长的低电平周期决定,高电平周期由最短的高电平周期决定.
2、SDA仲裁
SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线
文章图片
两个主节点的仲裁过程 上图是以两个节点为例的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉SDA线上的数据。因此在仲裁过程中数据没有丢失。
SDA的仲裁和SCL的时钟同步处理过程没有先后关系,而是同步进行的。
推荐阅读
- Vue组件之事件总线和消息发布订阅详解
- (八)签协议
- 计算机网络|计算机网络——DHCP协议详解
- javaEmail一(传输协议简介)
- SDP协议
- FTP创建
- Scheme跳转协议
- GD32VF103|GD32VF103 I2C 通讯
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
- 计算机网络之ARP协议