1、I2C电气特性:最大输入低电平1.5V,最大输入高电平3V,具有固定输入电平的IIC总线器件,可以分别单独连接适合自己的电源电压(如VGA等接口)。由于外围器件是漏极开路,上拉电阻的大小在一定程度上影响外围器件的漏极开路,上拉电阻的大小在一定程度上影响外围器件信号传输的延迟时间,设计中一般常都选用的4.7K上拉电阻。
I2C总线只有两根双向信号线,一根数据线SDA,一根时钟线SCL。具有同步功能的串行总线。适合在器件之间进行近距离、非经常性的数据传输、I2C总线通过上拉电阻接到正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线”与”关系。 (基本上谁控制时钟线谁就是主设备)IIC的SCL必须由主机发送,否则大乱。从机收到(听到)自己的地址才能发送应答信号(必须应答)表示在线。
2、特点:每个连接到总线的设备都有唯一的地址,地址为7位,前四位鉴定器件类别,一般是固定的;后三位由器件本身的A0、A1、A2可以编程,故同类器件一般最多挂2的3次方8个。
工作速率:常见的有标准模式100Kbit/s和快速模式400Kbit/s两种,增强快速模式1Mbit/s和高速模式3.4Mbit/s,极速模式单向数据传输速率可达5Mbit/s。可以实现半双工通信。
3、I2C数据传输:I2C总线进行数据传输时,时钟信号位高电平期间,数据线上的数据必定保持稳定,只有时钟信号为低电平时,数据线上的电平才允许变化。
4起始信号和终止信号:SCL线为高电平期间,SDA线由高变低表示起始信号;启动信号是一种电平跳变时序信号,而不是一个电平信号;SCL线为高电平时,SDA线由低变高表示终止信号。停止信号也是一种电平跳变时序信号,而不是一个电平信号。起始信号和终止信号均是主机发出;起始信号产生后,总线处于被占用状态;终止信号产生后,总线处于空闲状态。
I2C主设备与从设备之间以字节(8位)为单位进行双向的数据传输。I2C总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
读写是站在主机立场上定义的。“读”是主机接收从机数据,“写”是主机发送数据给从机。当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出极。首先地址位比较,如果主器件寻找同一个从器件,则进入数据位比较.
上升沿采样,如果波形不能保证足够的建立时间和保持时间可以适当降低频率
数据的有效性:SDA线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低状态只有在SCL线的时钟信号是低电平才能改变。
1.起始位,主机先拉低SDA,过几us再拉低SCL (SCL为高电平时,SDA由高向低跳变)
- 结束信号,SCL为高电平期间,SDA由低电平向高电平跳变
- 应答信号:I2C总线上所有数据都是8位字节传送,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK),表示应答器接收到了该字节。
第九个时钟的高电平是应答信号。在时钟高电平时数据保持低电平,在响应的时钟脉冲期间,发送器释放SDA线(高),在响应时钟脉冲期间,接收器必须将SDA拉低,使他在这个时钟脉冲的高电平期间保持稳定的低电平。
每个通信周期都有由一个起始位开始通信,由一个结束位结束通信,中间部分是传递数据。
每个通信周期主设备会先发从设备地址(从设备地址由高七位的实际从设备地址和低1位的读/写标志位组成),主设备以广播的形式发送从设备地址,I2C总线上的所有从设备收到地址后,判断从设备地址是否匹配,不匹配的从设备继续等待,匹配的设备发出一个应答信号。从设备接收到主设备发来的信号及时发出应答信号。IIC数据以字节(8bits)为单位传输,每个字节传输完成后都会有一个ACK应答信号,应答信号的时钟由主设备产生。
应答(ACK):拉低SDA线,并在SCL为高电平期间保持SDA线为低电平。
非应答(NOACK):不要拉低SDA线(此时SDA线为高电平),并在SCL为高电平期间保持SDA线为高电平。
应答信号:
I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9周期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功接收到该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第九个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟在高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控制器发送一个停止信号P.
(因为一个SCL时钟周期只能传输1bit数据(并且只能在SCL的低电平期间进行SDA数据电平的变化),假若SCL的时钟频率是100kHZ,那么1s就能产生100K个时钟周期,也就是1s中可以传输100kbit的数据)
5、I2C多主控制机理:
5.1 I2C总线的仲裁机制
在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I2C总线上的仲裁。
I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。
5.2 SCL线的同步(时钟同步)
SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。这就是SCL的同步原理
5.3 SDA仲裁
SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线
5.4 仲裁过程
两个主节点的仲裁过程
上图是以两个节点为例的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉SDA线上的数据。因此在仲裁过程中数据没有丢失。
5.5 总结:SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。对I2C总线的时钟同步和总线仲裁的深入理解
每一个IIC总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器[1]。这种电路具有两个特点:
①由于SDA、SCL为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
②引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。
5.6 I2C总线接口内部结构
IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。基于IIC总线的设计,线路上不可能出现电平冲突现象。如果一设备发送逻辑0,其他发送逻辑1,那么线路看到的只有逻辑0。也就是说,如果出现电平冲突,发送逻辑0的始终是“赢家”。总线的物理接法允许主设备往总线写数据的同事读取数据。这样两主设备争总线的时候“赢家”并不知道竞争的发生,只有“输家”发 现了冲突——当写一个逻辑1,却读到了0——而退出竞争。
时钟同步
如果被控器希望主控器降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主控器,当主控器在准备下一次传送发现SCL的电平被拉低时就 进行等待,直至被控器完成操作并释放SCL线的控制控制权。这样以来,主控器实际上受到被控器的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长 的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步。
5.7 总线仲裁
假设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,他们就会继续占用总线。在这种情 况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总 线的控制权;因此主控器2就成为总线的唯一主宰者。 不难看出:
① 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
② 各个主控器没有对总线实施控制的优先级别;
③总线控制随即而定,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。
根据上面的描述,“时钟同步”与“总线仲裁”可以总结如下规律:
①主控器通过检测SCL上的电平来调节与从器件的速度同步问题——时钟同步;
②主控器通过检测SDA上自身发送的电平来判断是否发生总线“冲突”——总线仲裁。因此,I2C总线的“时钟同步”与“总线仲裁”是靠器件自身接口的特殊结构得以实现的。
[1]同相器:当输入高电平时输出也是高电平,输入低电平时输出也是低电平。主要要于需要缓冲的场合,就是只要输入很小的电流,可输出较大的电流,增加带载能力
6. I2C相关问题解答
6.1 I2C为什么需要上拉电阻?
- i2c标准协议总线空闲时,两根线必须为高
- I2c是OD门驱动,也就是因为是开漏的 所以需要上拉。
6.1 I2C时钟信号没输出
(1)可能是软件没初始化也可能复用不对。
6.3 I2C时钟信号输出异常
(1)检查I2C信号线上是否有其他信号被钳住。
6.4 I2C没信号,示波器量不到时钟信号
(1)检测板载是否有其他信号把I2C信号拉死。若检查无误,则可能是没复用对,或软件初始化等有问题。不管接不接I2C设备,SCL都应该有输出。
6.5 I2C读取数据错误
(1)量取I2C波形不能保证足够的建立时间和保持时间,可以适当降低频率