I2C总线的串行扩展技术
I2C总线(Inter IC BUS)是Philips公司推出的芯片间串行传输总线,仅用两根连线就可以实现完善的全双工同步数据传送,能够方便地构成多机系统和外围器件扩展系统。I2C总线的寻址采用纯软件的寻址方法,无需片选线的连接,这样就减少了总线数量。按照I2C总线规范,总线传输中的所有状态具有各自相对应的状态码,系统中的主机能够依照这些状态码自动地进行总线管理,用户只要在程序中装入这些标准处理模块,根据数据操作要求完成I2C总线的初始化、启动总线,就能自动完成规定的数据传送操作。
(一)I2C总线的应用范围及优势
在现代消费类产品、通信类产品、仪器仪表、工业测控系统中,逐渐形成了以一个或多个单片机为控制核心的智能系统。在单片机应用系统中推广I2C总线,将会大大改变单片机应用系统结构性能,对单片机的应用开发带来以下好处:
(1)可最大限度地简化结构。二线制的I2C串行总线使得各电路单元之间只需最简单的连接,而且因为总线接口都已集成在器件中,不需再另外附加总线接口电路。电路简化后省去了电路板上大量走线,减小电路板面积,提高了可靠性,降低了成本。同时,I2C总线可以实现电路系统的模块化、标准化设计。因为在I2C总线上各单元电路除了个别中断引线外,相互之间没有其他连线,用户常用的单元电路基本上与系统电路无关,容易形成用户自己的标准化、模块化设计。
(2)标准I2C总线模块的组合开发方式缩短了新产品的开发周期。
(3)I2C总线各节点具有各自独立的电气特性,各节点单元电路能在相互不受影响的情况下,甚至在系统带电情况下自由地接入或撤除。
(4)I2C总线系统构成具有最大的灵活性。在系统改型或对已加工好的电路板扩展功能时,可以只修改软件而不修改电路结构,对原有设计及电路板系统影响达到最小值。
(5)I2C总线系统可方便地对某一节点电路进行故障诊断与跟踪,有极好的可维护性。
图6-18为I2C总线外围扩展示意图。图中只表示出单片机应用系统中常用的I2C总线外围通用器件、外围设备模块、接口以及其他单片机节点。每个接到I2C总线上的器件都有唯一的地址。主机与其他器件间的数据传送,可由主机发送数据到其他器件,这时主机即为发送器,在总线上接收数据的器件则为接收器。在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。
图6-18 I2C总线外围扩展示意图
在单片机应用系统的串行总线扩展中,经常遇到以MCS-51系列单片机为主机,其他接口器件为从机的情况。
(二)I2C总线的基本原理
1.I2C总线的电气结构
I2C总线只有两根信号线:数据线SDA和时钟线SCL,它们都是双向传输线。I2C总线中的每个器件都可视为一个I2C总线接口电路,用于与I2C总线的SDA线和SCL线挂接。为了能使总线上所有电路的输出能实现线“与”的逻辑功能,各个I2C总线的接口电路输出端必须是漏极开路或集电极开路结构,如图6-19所示。输出端必须接上拉电阻。
图6-19 I2C总线接口电路
总线备用时SDA和SCL都必须保持高电平状态,只有关闭I2C总线时才使SCL钳位在低电平。在标准I2C模式下数据传送速率可达100Kbit/s,高速模式下可达3.4Mbit/s。总线的驱动能力受总线电容限制,不加驱动扩展时为400p F。
2.I2C总线信号定义
(1)总线上数据的有效性。I2C总线传输数据时,在时钟线高电平期间数据线上必须保持有稳定的逻辑电平状态,高电平为数据1,低电平为数据0。只有在时钟线为低电平时,才允许数据线上的电平状态变化,如图6-20所示。
图6-20 I2C总线信号的时序
(2)总线数据传送的起始与停止。I2C总线数据传送时有两种时序状态被分别定义为起始信号和终止信号,如图6-20所示。
1)起始信号:在时钟线SCL保持高电平期间,数据线SDA出现由高电平向低电平变化为总线的起始信号。
2)终止信号:在时钟线SCL保持高电平期间,数据线SDA上出现由低到高的电平变化时将停止I2C总线的数据传送,为I2C总线的终止信号。
起始信号与终止信号都是由主控制器产生。总线上带有总线接口的器件很容易检测到这些信号。但是对于不具备这些硬件接口的一些单片机来说,为了能准确地检测到这些信号,必须保证在总线的一个时钟周期内对数据线至少进行两次采样。
3.I2C总线数据传输协议
(1)I2C总线的寻址约定。为了省略I2C总线系统中主控器与被控器的地址选择线,最大限度地简化总线连接线,I2C总线采用了独特的寻址约定,规定了起始信号后的第一个字节为寻址字节,用来寻址被控器件,并规定数据的传送方向。
1)寻址字节中的位定义。在I2C总线标准寻址规约中,寻址字节由被控器的七位地址位(D7~D1)和一位方向位(D0)组成,如图6-21所示。方向位为“0”时表示主控器将数据写入被控器,为“1”时则表示主控器从被控器读取数据。
图6-21 寻址字节定义
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据位将自己确定为发送器或接收器。
从机的地址由固定部分和可编程部分组成,即由器件编号地址(高4位D7~D4)和引脚地址(低3位D3~D1)组成。例如,8位I/O扩展器件PCF8574,其器件编号地址为0110,引脚地址为A2、A1、A0。如果PCF8574地址引脚A2、A1、A0皆接地,则该器件的寻址字节为60 H(读取数据时地址为61 H)。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线的该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
2)寻址字节中的特殊地址。I2C总线地址统一由I2C总线委员会实行分配。其中两组编号地址0000和1111已被保留作特殊用途,见表6-3。I2C总线规约所给出的这些保留地址使得I2C总线能与其他规约混合使用,只有那些能够以这种格式和规约工作的I2C总线兼容器才允许对这些保留地址进行应答。
表6-3 I2C总线中的地址分配
(2)I2C总线上的数据传送格式。
1)I2C总线上的数据传送。I2C总线上传送的每一个字节均为8位。每启动一次I2C总线,其随后的数据传输字节数目是没有明确限制的。但是,每传送一个字节后都必须跟随一个应答位,并且最高数据位(MSB)被首先发送,在全部数据传送结束后由主控制器发送终止信号,如图6-22所示。
图6-22 I2C总线上的数据传送
2)数据传送时的总线控制。从图6-22中可以看到,SCL线为低电平时,SDA线上数据就被停止传送。SCL线的这一“线与”特征将使SCL在低电平时能够钳住总线。这种情况可以用于当接收器接收到一个字节数据后要进行一些其他工作而无法立即接收下一个数据时,迫使总线进入等待状态,直到接收器准备好接收新数据时,接收器再释放时钟线使数据传送得以继续正常进行。例如,当接收器件收到一个完整的数据字节后,有可能需要完成一些其他工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。
3)应答信号。I2C总线数据传送时,每传送一个字节数据后都必须有应答信号,但与应答信号相对应的时钟仍由主控器在SCL线上产生,因此主控发送器必须在被控接收器发送应答信号前,预先释放对SDA线的控制,以便主控器对SDA线上应答信号的检测。
如图6-23所示,应答信号在第9个时钟位上出现,接收器输出低电平为应答信号,输出高电平则为非应答信号。
图6-23 I2C总线上的应答信号
由于某种原因,如被控器正在进行其他处理而无法接收总线上的数据时,被控器可向SDA线输出一个非应答信号使SDA线保持高电平,主控器据此便可产生一个停止信号来终止SDA线上的数据传输。
当主控器接收数据时,接收到最后一个数据字节后,必须给被控发送器发送一个非应答位,使被控发送器释放数据线,以便主控制发送停止信号,从而终止数据传送。
I2C总线上的应答信号是比较重要的,在编制程序时应该着重考虑。
4)数据传送格式。I2C总线数据传输时必须遵循规定的数据传送格式,如图6-24所示为一次完整的数据传输格式。按照总线规约,起始信号表明一次数据传送的开始,其后为寻址字节,寻址字节由高7位地址和最低1位方向位组成,方向位表明主控器与被控器数据传送方向,方向位为“0”时表明主控器对被控器的写操作,为1时表明主控器对被控器的读操作。在寻址字节后是按指定读、写操作的数据字节与应答位。在数据传送完成后主控器都必须发送停止信号。总线上的数据传输有许多读、写组合方式。下面以简化的图解方式介绍三类数据传送格式。
图6-24 I2C总线一次完整的数据传输
a.主控器的写操作。主控器向被寻址的被控器发送n个数据字节,整个传输过程中数据传送方向不变。其数据传送格式如图6-25所示。
图6-25 写操作数据格式
A—应答信号;A—非应答信号;S—起始信号;P—停止信号;SLAVE ADDRESS—从机地址,寻址字节(写);DATA—写入被控器的n个数据字节
b.主控器的读操作。主控器从被控器中读出n个字节的操作,整个传输过程中除寻址字节外,都是被控器发送,主控器接收的过程。数据传送格式如图6-26所示。
图6-26 读操作数据传送格式
SLAVE ADDRESS—寻址字节(读);DATA—被主控器读出的n个字节
主控器发送停止信号前应发送非应答位,以向被控器表明读操作结束。
c.主控器的读写操作。在一次数据传输过程中需要改变传送方向的操作,这时,起始信号和寻址字节都会重复一次,但两次读、写方向正好相反。数据传送格式如图6-27所示。
图6-27 读/写操作数据传送格式
Sr—重复起始信号
无论采用何种方式,起始、停止、寻址字节都由主控器发送,数据字节的传送方向按照寻址字节中方向位(读写标志)而确定。每个器件(主控器或被控器)内部都有一个数据存储器RAM,RAM的地址是连续的,并能自动加/减1。n个被传送数据的RAM地址可由系统设计者规定,通常作为数据放在上述数据传输格式中,即第一个数据字节DATA 1。每个字节传送都必须有被控器的应答或非应答信号跟随以表明被控器(从机)是否收到。
(三)利用一般I/O口线模拟I2C操作
通常大多数单片机应用系统中只有一个CPU,这种系统如果采用I2C总线技术,则总线上只有单片机对I2C总线从器件的访问,没有总线的竞争等问题,这种情况下只需要模拟主发送和主接收时序。
对于单片机与带I2C串行总线的外围器件的接口,主机也可以采用不带I2C总线接口的单片机,如89C51、AT89C2051等单片机,利用软件实现I2C总线的数据传送,即软件与硬件结合的信号模拟。
用不带I2C接口的51单片机控制I2C总线时,硬件也非常简单,只需两个I/O口线,在软件中分别定义成SCL和SDA,与I2C总线的SCL和SDA直接相连,再加上上拉电阻即可。
在模拟主方式下的I2C总线时序时,选用如图6-28所示P1.6和P1.7作为时钟线SCL和数据线SDA,晶振采用6MHz。I2C总线数据传送时,有起始位(S)、终止位(P)、应答位(A)、非应答位(A)等信号。按照典型I2C总线传送速率的要求,这些信号及时序如图6-29所示。
图6-28 单片机与I2C总线的硬件连接
图6-29 I2C总线数据传送典型信号时序
对于I2C总线的典型信号,可以用指令操作来模拟其时序过程。起始(STA)、终止(STOP)、发送应答位(MACK)、发送非应答位(MNACK)的4个模拟子程序如下。
1.启动I2C总线子程序STA
2.停止I2C总线子程序STOP
3.发送应答位信号子程序MACK
4.发送非应答位信号子程序MNACK
在使用上述子程序时,如果单片机的主时钟不是6MHz,则应调整NOP指令个数,以满足时序要求。
从I2C总线的数据操作中可以看出,除了基本的启动(STA)、终止(STOP)、发送应答位(MACK)、发送非应答位(MNACK)外,还应有应答位检查(CACK)、发送一字节(WRBYT)、接收一字节(RDBYT)、发送N字节(WRNBYT)和接收N字节(RDNBYT),5个子程序。
5.应答位检查子程序
在应答位检查子程序(CACK)中,设置了标志位F0。当检查到正常应答位后,F0=0;否则F0=1。
6.发送一个字节数据(WRBYT)子程序
该子程序是向虚拟I2C总线的数据线SDA上发送一字节数据的操作。调用该子程序前,将要发送的数据送入A中。占用资源:R0,C。
7.从SDA上接收一个字节数据(RDBYT)子程序
该子程序用来从SDA上读取一字节数据,执行本程序后,从SDA上读取的一字节存放在R2或A中。占用资源:R0、R2和C。
8.向被控器发送n个字节数据(WRNBYT)子程序
在I2C总线数据传送中,主节点常常需要连续地向外围器件发送多个字节数据,本子程序是用来向SDA线上发送N字节数据的操作。该子程序的编写必须按照I2C总线规定的读/写操作格式进行。
主控器向I2C总线上某个外围器件连续发送N个字节数据时,其数据操作格式如图6-25所示,按照该操作格式所编写的发送N个字节数据的通用子程序(WRNBYT)清单如下:
在使用本子程序时,占用资源为R1和R3,但须调用STA、STOP、WRBYT和CACK子程序,而且使用了一些符号单元。
在使用这些符号单元时,应在片内RAM中分配好这些地址。这些符号单元有:
MTD主节点发送数据缓冲区首址;
SLA外围器件寻址字节存放单元;
NUMBYT发送数据字节数存放单元。
在调用本子程序之前,必须将要发送的N字节数据依次存放在以MTD为首地址的发送数据缓冲区中。调用本子程序后,N字节数据依次传送到外围器件内部相应的地址单元中。
9.从被控器件读取n个字节数据(RDNBYT)子程序
在I2C总线系统中,主控器按主接收方式从被控器件中读出n个字节数据的操作格式,如图6-26所示,按照该操作格式所编写的通用n字节接收子程序(RDNBYT)清单如下:
在使用RDNBYT子程序时,占用资源R1和R3,但须调用STA、STOP、WRBYT、RDBYT、CACK、MACK和MNACK等子程序并满足这些子程序的调用要求。RDNBYT子程序中使用了一些符号单元,除了在WRNDYT子程序中使用过的SLA、MTD和NUMBYT外,还有以下几个:
SLA:器件寻址(读)存放单元;
MRD:主节点中数据接收缓冲区首址。
在调用RDNBYT子程序后,从节点中所指定首地址中的N字节数据将被读入主节点片内以MRD为首址的数据缓冲器中。
10.主程序
在主程序初始化中,应有如下的语句: