I2C协议总结.docx
《I2C协议总结.docx》由会员分享,可在线阅读,更多相关《I2C协议总结.docx(22页珍藏版)》请在冰豆网上搜索。
I2C协议总结
I2C协议总结
串行总线I2C由数据线SDA和时钟线SCL构成,可实现完善的双工同步数据传输,能方便的构成多机系统和外围器件扩展系统,I2C采用器件地址的硬件设置方法,通过软件进行寻址。
I2C总线系统中,以共同挂接的I2C总线作为通信手段的每个器件均构成I2C总线的一个器件节点。
根据节点是否带有智能,可将这些节点分为主器件节点和外围器件节点。
主器件节点可作为主控器,用来对总线进行主动控制。
在一次通信过程中,由主控器负责向总线上发送启动信号、同步时钟信号、被控器件地址码、重启动信号和停止信号等。
而被控器(即受控器件)可分别由这两种节点充当
。
如果在系统中同时存在2个或2个以上的主器件节点企图控制总线,则形成总线冲突状态。
由于I2C引入了同步时钟和总线仲裁机制,即使出现总线冲突也不会造成信息丢失。
发生总线冲突时,为了避免信息丢失,需要进行总线仲裁以决定谁是主控器。
总线仲裁是通过裁定SDA线上的控制权来解决的。
时钟同步是连接到SCL线上的所有器件进行“线与”实现的。
只要有一个器件向SCL输出低电平,SCL就为低电平。
因此SCL线的低电平时间由时钟低电平期最长的器件决定,而高电平时间由时钟高电平期最短的器件决定,由此形成了时钟的同步。
下图所示为一次完整的通信过程的时序。
图1i2c总线数据传送时序
(注:
图中,SCL线上1~7位为7位地址码,第8位为读写位R\~D,第9位为ACK应答位,紧接着的为第一个数据字节,然后是一位应答位,后面继续第2个数据字节。
)
如图所示,主控器在检测到总线空闲(数据线SDA和时钟线SCL同时处于高电平状态)时,首先发送一个启动信号S(在时钟线SCL保持高电平期间,数据线SDA上电平被拉低),它标志着一次数据传输的开始。
之后主控器发送一个地址字节包括7位地址码和一个读写位。
被控器收到地址字节后反馈一个应答信号ACK=0,主控器接收到ACK后开始发送第一个数据字节,被控器接收到第一个数据字节后,由反馈一个应答信号ACK=0。
主控器收到应答信号后开始传送第二个数据字节。
依次循环,主控器发送完数据后,就发送一个停止信号P(SCL保持高电平期间,SDA被释放,返回高电平),并释放总线,使得总线返回空闲状态。
在通信过程应注意以下6点:
1进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。
并且每个字节传送时都是高位在前。
2对于应答信号,ACK=0时为有效应答位,说明接收器已经成功接收到该字节,若为1则说明接受不成功。
3如果被控器需要延迟下一个下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主控器进入等待状态。
4主控器完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号Sr。
它既作为前一次数据传输的结束,又作为后一次传输的开始。
5总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件。
6在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为挂接在总线上的任一器件将SCL锁定在低电平即可。
什么是I2C协议?
什么是I2C协议?
I2C协议是单片机与其它芯片常用的通讯协议,由于只需要两根线,所以很好使用。
1.I2C总线的特点
(1)只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL
(2)每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主发送器或主机接收器
(3)它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
(4)串行的8位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达400kbit/s高速模式下可达.4Mbit/s
(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
(6)连接到相同总线的IC数量只受到总线的最大电容400pF限制
2.I2C总线术语的定义
3.I2C协议总线信号时序分析
3.1数据的有效性:
SDA线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。
如图3.1I2C总线的位传输所示。
图3.1I2C总线的位传输
3.2起始和停止条件
当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件。
当SCL线是高电平时,SDA线由低电平向高电平切换表示停止条件。
如图3.2I2C起始和停止条件所示。
图3.2起始和停止条件
3.3总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
3.4数据传输与应答信号ACK
发送到SDA线上的数据必须是8位的。
每次传输可以发送的数据不受限制。
每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
如图3.3I2C总线响应。
图3.3I2C总线响应
首先传输的是数据的最高位(MSB)。
如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。
当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
如图3.4I2C总线数据传输所示。
图3.4I2C总线数据传输
4.地址格式
数据的传输遵循如图4.1完整的数据传送所示,在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/—W),0-表示发送数据(写),1-表示接收数据(读)。
数据传输一般由主机产生的停止位(P)终止。
但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。
在这种传输中,可能有不同的读/写格式结合。
如图3.5I2C总线完整的数据传输。
图3.5I2C总线完整的数据传输
I2C协议
在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括
"一些智能控制通常是一个单片的微控制器
"通用电路例如LCD驱动器远程I/O口RAMEEPROM或数据转换器
"面向应用的电路譬如收音机和视频系统的数字调谐和信号处理电路或者是音频拨号电话的DTMF发生器
为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips开发了一个简单的双向两线总线实现有效的IC之间控制这个总线就称为InterIC或I2C总线现在Philips包括超过150种CMOS和双极性兼容I2C总线的IC可以执行前面提到的三种类型的功能所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C总线通讯这个设计概念解决了很多在设计数字控制电路时遇到的接口问题。
下面是I2C总线的一些特征
"只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL
"每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器
"它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
"串行的8位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达400kbit/s高速模式下可达3.4Mbit/s
"片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
"连接到相同总线的IC数量只受到总线的最大电容400pF限制.
符合I2C总线的IC不只帮助了设计者它们也使设备厂商得到很多益处因为
"简单的两线串行I2C总线将互联减到最小因此IC的管脚更少而且PCB的线路也减少结果使PCB更小和更便宜
"完全完整的I2C总线协议不需要地址译码器和其他胶合逻辑
"I2C总线的多主机功能允许通过外部连接到生产线快速测试和调整最终用户的设备
"符合I2C总线的IC提供小型和超小型以及DIL封装,甚至减少了IC的空间要求.这些只是一些益处.另外兼容I2C总线的IC通过允许简单地构造设备变量和保持设计是最新的简易升级功能增加了系统设计的灵活性.这样整个装置系列可以围绕一个基本的模型开发新设备的升级或者功能增强的模型,即扩展的存储器远程控制等等,可以简单地通过剪贴相应的IC到总线上产生,如果需要更大的ROM只需要从我们广泛的IC中选择一个有更大ROM的微控制器就可以了.由于新的IC要取代旧的增加新功能到装置或者提升它的性能,只要简单地从总线上移去过时的IC然后换上它的后续IC
就可以了.
I2C总线规范
对于面向8位的数字控制应用譬如那些要求用微控制器的,要建立一些设计标准:
"一个完整的系统通常由至少一个微控制器和其他外围器件例如存储器和I/O扩展器组成
"系统中不同器件的连接成本必须最小
"执行控制功能的系统不要求高速的数据传输
"总的效益由选择的器件和互连总线结构的种类决定
产生一个满足这些标准的系统需要一个串行的总线结构,尽管串行总线没有并行总线的数据吞吐能力,但它们只要很少的配线和IC连接管脚.
总线不仅仅是互连的线,还包含系统通讯的所有格式和过程,串行总线的器件间通讯必须有某种形式的协议,避免所有混乱数据丢失和妨碍信息的可能性.快速器件必须可以和慢速器件通讯,系统必须不能基于所连接的器件,否则不可能进行修改或改进,应当设计一个过程决定哪些器件何时可以控制总线,而且如果有不同时钟速度的器件连接到总线必须定义总线的时钟源.所有这些标准都在I2C总线的规范中.
术语 描述
发送器 发送数据到总线的器件
接收器 从总线接收数据的器件
主机 初始化发送产生时钟信号和终止发送的器件
从机 被主机寻址的器件
多主机 同时有多于一个主机尝试控制总线但不破坏报文
仲裁 多主机同时尝试控制总线但只允许其一个控制总线并使报文不被破坏的过程
同步 两个或多个器件同步时钟信号的过程
SDA和SCL都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压,当总线空闲时这两条线路都是高电平.连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能.I2C总线上数据的传输速率在标准模式下可达100kbit/s在快速模式下可达400kbit/s在高速模式下可达3.4Mbit/s连接到总线的接口数量只由总线电容是400pF的限制决定。
SDA线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变.
起始和停止条件
在I2C总线中唯一出现的是被定义为起始S和停止P条件的情况
其中一种情况是在SCL线是高电平时SDA线从高电平向低电平切换这个情况表示起始条件;当SCL是高电平时SDA线由低电平向高电平切换表示停止条件.起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后总线被认为再次处于空闲状态.
如果产生重复起始条件,而不产生停止条件总线会一直处于忙的状态.此时的起始条件和重复起始条件在功能上是一样的,如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便.但是没有这种接口的微控制器,在每个时钟周期至少要采样SDA线两次来判别有没有发生电平切换。
传输数据笔记
字节格式
发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制.每个字节后必须跟一个响应位,首先传输的是数据的最高位MSB.
如果从机要完成一些其他功能后,例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态.当从机准备好接收下一个数据字节,并释放时钟线SCL后数据传输继续.
在一些情况下可以用与I2C总线格式不一样的格式.例如兼容CBUS的器件,甚至在传输一个字节时,用这样的地址起始的报文可以通过产生停止条件来终止.此时不会产生响应.
响应
数据传输必须带响应,相关的响应时钟脉冲由主机产生.在响应的时钟脉冲期间发送器释放SDA线,在响应的时钟脉冲期间,接收器必须将SDA线拉低.使它在这个时钟脉冲的高电平期间保持稳定的低电平.
当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送.从机必须使数据线保持高电平主机,然后产生一个停止条件终止传输或者产生重复起始条件,开始新的传输.如果从机接收器,响应了从机地址,但是在传输了一段时间后不能接收更多数据字节.主机必须再一次终止传输.这个情况用从机在第一个字节后没有产生响应,来表示从机使数据线保持高电平.
主机产生一个停止或重复起始条件,如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应向从机发送器通知数据结束.从机发送器必须释放数据线。
同步
所有主机在SCL线上产生它们自己的时钟来传输I2C总线上的报文,数据只在时钟的高电平周期有效.因此需要一个确定的时钟进行逐位仲裁.
时钟同步通过线与连接I2C接口到SCL线来执行这就是说,SCL线的高到低切换会使器件开始数它们的低电平周期.而且一旦器件的时钟变低,电平它会使SCL线保持这种状态.直到到达时钟的高电.但是如果另一个时钟仍处于低电平周期,这个时钟的低到高切换不会改变SCL线的状态.因此,SCL线被有最长低电平周期的器件保持低电平,此时低电平周期短的器件会进入高电平的等待状态.
当所有有关的器件数完了它们的低电平周期后,时钟线被释放.并变成高电平之后器件时钟和SCL线的状态没有差别,而且所有器件会开始数它们的高电平周期,首先完成高电平周期的器件会再次将SCL线拉低,这样产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件决定而高电平周期由高电平时钟周期最短的器件决定.
用时钟同步机制作为握手
时钟同步机制除了在仲裁过程中使用外,还可以用于使能接收器处理字节级或位级的快速数据传输。
在字节级的快速传输中,器件可以快速接收数据字节,但需要更多时间保存接收到的字节或准备另一个要发送的字节,然后从机以一种握手过程在接收和响应一个字节后使SCL线保持低电平,迫使主机进入等待状态,直到从机准备好下一个要传输的字节。
在位级的快速传输中,器件例如对I2C总线有或没有限制的微控制器可以通过延长每个时钟的低电平周期减慢总线时钟,从而任何主机的速度都可以适配这个器件的内部操作速率。
7位的地址格式
数据的传输格式在起始条件后发送了一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位R/W,0表示发送,1表示请求数据。
数据传输一般由主机产生的停止位终止,但是如果主机仍希望在总线上通讯,它可以产生重复起始条件和寻址另一个从机,而不是首先产生一个停止条件。
在这种传输中可能有不同的读写格式。
可能的数据传输格式有
"主机发送器发送到从机接收器,传输的方向不会改变;
"在第一个字节后主机立即读从机,在第一次响应时,主机发送器变成主机接收器,从机接收器变成从机发送器。
第一次响应仍由从机产生之前,发送了一个不响应信号的主机产生停止条件
"复合格式。
传输改变方向的时侯起始条件和从机地址都会被重复,但R/W位取反。
如果主机接收器发送一个重复起始条件,它之前应该发送了一个不响应信号。
7位寻址
I2C总线的寻址过程是通常在起始条件后的第一个字节决定了主机选择哪一个从机,例外的情况是可以寻址所有器件的广播呼叫地址。
使用这个地址时,理论上所有器件都会发出一个响应,但是也可以使器件忽略这个地址广播呼叫。
地址的第二个字节定义了要采取的行动。
(1)第一个字节的位定义
第一个字节的头7位组成了从机地址,最低位LSB是第8位,它决定了报文的方向;第一个字节的最低位是0表示主机会写信息到被选中的从机;1表示主机会向从机读信息。
当发送了一个地址后,系统中的每个器件都在起始条件后将头7位与它自己的地址比较;如果一样器件会认为它被主机寻址;至于是从机接收器还是从机发送器都由R/W位决定
(2)从机地址
由一个固定和一个可编程的部分构成,由于很可能在一个系统中有几个同样的器件;从机地址的可编程部分使最大数量的这些器件可以连接到I2C总线上器件。
可编程地址位的数量由它可使用的管脚决定,例如如果器件有4个固定的和3个可编程的地址位,那么相同的总线上共可以连接8个相同的器件。
I2C总线委员会协调I2C地址的分配,进一步的信息可以从最后列出的Philips代理商处获得。
保留的两组8位地址0000XXX和1111XXX的自有用途。
我最近刚刚用I2C协议完成了两个芯片的通信,觉得有一点东西可以说,就写写吧。
这次做的是单片机和外围芯片的通信,其中时钟芯片PCF8563和EEPROM24C01A都是以I2C
协议进行通信,因此单片机必须编写软件模拟I2C协议。
编写调试时注意以下几点:
1、I2C协议规定时钟和信号线的高电平、低电平以及启动、停止条件都必须维持一段时间
,一般的单片机很容易就满足,但是对于PIC系列等频率较高的单片机就必须注意,必要时
加入软件延时。
例如I2C的停止条件必须大于4μS(不同的芯片数据略有不同),如果工作
在20几兆的频率上,就很容易不满足这个条件。
2、I2C协议规定,任何一次通信都从它开始的启动信号到最后的停止信号,都必须在1s内
完成。
这就给调试带来麻烦了。
调试的时候一般总是要中断,停下来观察相应的数据是否
正确,如果单片机在对外围芯片进行写入操作,就有可能在一个字节发送完毕后得不到来
自外围芯片的确认信号。
建议在观察时钟信号管脚SCL和信号线管脚SDA电平的时候可以采
取中断方式调试,但是最终要看写入是否成功,就必须运行。
3、有的芯片可以容忍一点对上位机I2C协议模拟软件的错误,有的就不行。
这次我对PCF8
563的通信模拟软件编写完成后,需要编写对24C01A的通信模拟软件,二者都是用I2C协议
,因此我就照搬了PCF8563的软件,然后把管脚改了一下,结果就是不行。
后来发现我原来编写PCF8563的软件里面的停止条件子函数有错误,两个信号的时序顺序错了,但是这不会影响对PCF8563的读写。
因为在停止通信之前PCF8563的读写是即时的,每一个字节读好了就好了,写好了就是写好了,停止条件不会对其有影响。
而EEPROM24C01A就不一样了:
只有在接收到正确的I2C停止条件以后,它才会将接收到的数据烧入EEPROM。
如果协议有误,那么根本就无法写入数据,读出来的数据自然也就不正确了。
4、总体感觉,编写I2C协议模拟软件,只要细心,把时序弄清楚,应该就没有什么问题了
。
本人还只是单片机的初学者,以上只是我的一点心得,很多不足,请大家指出!
I2C协议
2011-03-3116:
37
一、总述:
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
I2C总线只有两根双向信号线。
一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
每个接到I2C总线上的器件都有唯一的地址。
主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。
由总线上接收数据的器件则为接收器。
在多主机系统中,可能同时有几个主机企图启动总线传送数据。
为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。
二、数据传送:
1、规定:
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
2、起始信号和终止信号:
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。
接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。
直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。
3、数据传送格式:
(1)、字节传送与应答:
每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。
如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。
当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。
这个信号是由对从机的“应答”来实现的。
然后,从机释放SDA线,以允许主机产生终止信号。
(2)、数据帧的格式:
I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
每次数据传送总是由主机产生的终止信号结束。
但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传送过程中,可以有以下几种组合方式:
a、主