先聊聊IIC接口,今天只聊聊IIC协议,后续会将IIC接口测试、研发中会遇到的故障分析一一分享给大家,欢迎拍砖,更欢迎一起交流学习。
1、I2C总线特征:
只要求两条总线线路:一条串行数据线SDA 一条串行时钟线SCL;每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主机发送器或主机接收器;
它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。
2、I2C总线术语的定义
发送器:发送数据到总线的器件;
接收器:从总线接受数据的器件;
主机:初始化发送、产生时钟信号和终止发送的器件;
从机:被主机寻址的器件;
多主机:同时有多个主机尝试控制总线,但不破坏报文;
仲裁:是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使报文不被破坏的过程;
同步:两个或多个器件同步时钟信号的过程。
3、位传输
SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变,如下图所示:
起始和停止条件:其中一种情况是在SCL 线是高电平时SDA 线从高电平向低电平切换这个情况表示起始条件。
当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件。如下图所示:
起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后总线被认为再次处于空闲状态。
4、数据传输
发送到SDA线上的数据必须是8位,每次传输发送的字节数不受限制,每个字节后必须跟一个响应位。
数据传输必须带响应,相关的响应时钟脉冲由主机产生,在响应的时钟脉冲期间发送器释放SDA线。
在响应的时钟脉冲期间接收器必须将SDA线拉低使它在这个时钟脉冲的高电平期间保持稳定的低电平。
当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
5、同步与仲裁
同步:时钟同步通过线与连接I2C 接口到SCL 线来执行,这就是说SCL 线的高到低切换会使器件开始数它们的低电平周期而且一旦器件的时钟变低电平它会使SCL 线保持这种状态直到到达时钟的高电平。但是如果另一个时钟仍处于低电平周期这个时钟的低到高切换不会改变SCL 线的状态。因此SCL 线被有最长低电平周期的器件保持低电平此时低电平周期短的器件会进入高电平的等待状态。
同理,当所有器件的低电平周期结束之后,SCL被拉高,那么器件开始数他们的高电平周期,首先完成高电平周期的器件会将SCL拉底。
那么,产生的同步SCL 时钟的低电平周期由低电平时钟周期最长的器件决定而高电平周期由高电平时钟周期最短的器件决定。
时钟同步图如下图所示:
仲裁:主机只能在总线空闲的时侯启动传输两个或多个主机可能在起始条件的最小持续时间tHD;STA 内产生一个起始条件结果在总线上产生一个规定的起始条件。
当SCL 线是高电平时仲裁在SDA 线发生这样在其他主机发送低电平时发送高电平的主机将断开它的数据输出级因为总线上的电平与它自己的电平不相同。
两个主机的仲裁过程如下图所示: