浅谈基于I2C总线的多MCU系统设计发展论文
引 言
随着微电子技术的发展和MCU价格的降低,常常在实际应用中使用多片MCU来协同完成系统功能,以实现更高的性能。在这些系统中多片MCU通过某种方式实现数据交换,其中使用双口或多口E2PROM是一种常见的方法[1?2]。这种电路结构复杂、成本高,需要软、硬件解决多MCU访问的竞争问题,更重要的是目前许多MCU不支持外部总线,不能扩展外部E2PROM,因此无法使用这种方法。I2C总线是由Philips公司推出的芯片间串行传输总线。它以规范严谨、使用简单灵活、支持的外围器件繁多等特点而被广泛应用。I2C总线具有十分完善的总线协议,在协议的支持下,可以自动处理总线上出现的多MCU访问的竞争。目前的文献通常是介绍I2C总线在单MCU系统中的应用[3?4],本文介绍一种利用I2C总线实现多片MCU访问E2PROM,从而实现数据交换的方法。
1 I2C总线工作原理
I2C总线是一种“二线”结构,分别使用“SDA”和“SCL”信号线实现数据传输。I2C总线对与其相连的设备采用软件寻址。每一种器件都有一个特定的7位I2C地址,以便主机了解当前正与其进行通信的器件。这个7位地址的前4位固定,用来指明器件所属类别,如1010表明是串行E2PROM器件。后3位(如A2,A1和A0)通过硬件管脚进行设置来修改器件的I2C地址。表示地址字节的最低1位(R/W)用来指明主控制器向从机发送(写,R/W=0)还是接收(读,R/W=1)来自从机的数据。每个传输过程都是以起始条件开始,停止或重新开始条件结束。每一次数据传送都是由主控制器发起的,如果某一时刻总线上有多个主控器,并且都请求控制总线,这时就要进行总线仲裁处理。一旦一个主控器获得总线控制权,其他主控器必须等待此主控器发送完一个停止条件并将总线释放为“空闲”状态方可重新控制总线。在系统中主控制器通常都由MCU担任。
2 多MCU系统下的I2C总线
I2C总线软、硬件协议十分巧妙,它可以用于构成多MCU系统。当系统中有多个I2C总线接口单片机时,会出现多MCU竞争的复杂状态。I2C总线软、硬件协议以及I2C总线单片机中的SFR保证了多MCU竞争时的协调管理。I2C总线提供的状态处理软件能自动处理总线上出现的26种状态。在使用I2C总线时将这些软件工具在程序存储器中定位,利用这些软件编制出归一化操作命令,用于I2C总线应用程序设计十分简单、方便。
2.1 多MCU竟争仲裁
主机只能在总线空闲的时侯启动传输。两个或多个主机可能在起始条件的最小持续时间内产生一个起始条件,结果在总线上产生一个规定的起始条件。当SCL线是高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同,仲裁可以持续多位。它的第一个阶段是比较地址位。如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机—发送器),或者比较响应位(如果是主机—接收器)。因为I2C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息[5]。
2.2 主系统的数据传送过程
考虑以下实际应用,系统中有两片单片机,MCU A进行数据采集,并将数据存入E2PROM,MCU B不定时地从E2PROM取出数据(如图1所示)。传输数据的过程如下:
(1) 假设MCU A要发送信息到E2PROM
① MCU A(主机)寻址接收器E2PROM;
② MCU A(主机)发送器发送数据到接收器E2PROM;
③ MCU A终止传输。
(2) 如果MCU B想从器件E2PROM中接收信息
① MCU B(主机)寻址E2PROM(从器件);
② MCU B(主机)从E2PROM(从器件)读数据;
③ MCU B终止传输。
(3) 以上两种情况同时发生时,I2C总线起动总线的竞争仲裁功能
① MCU A或MCU B赢得总线的控制权,掌管总线,竞争失败的微控制器退出总线;
② 赢得总线的控制权的微控制器寻址E2PROM(从器件),并进行数据传输;
③ 赢得总线的控制权的微控制器终止数据传输,竞争失败的微控制器试图掌控总线,从器件寻址,并进行数据传输;
④ 数据传送完毕,总线进入空闲状态。
由上可知,在多MCU系统下的数据传送过程要比单主机系统下复杂得多。但I2C总线软、硬件协议能进行协调管理,保证数据的可靠传输。
3 多MCU系统的具体实现
本应用中选用了两片P89LPC932单片机及一片24系列的E2PROM。P89LPC932中I/O口P1.3和P1.2为复用端口,在用作I2C通信时,P1.3为SDA,P1.2为SCL,在程序中应该设置为开漏方式。电路中[R1、][R2]为I2C总线的上拉电阻,在具体电路中应适当调整。选择上拉电阻要考虑的因素主要为供电电源、总线上的电容 值和连接器件数。在《I2C总线协议》中规定,在供电电压大于2 V,灌电流为3 mA时,输出低电平不高于0.4 V。在本电路中供电电压为(3±0.3) V。,因而上拉电阻的最小值为[(3.3-0.4)0.003=967 ]Ω。上拉电阻的取值不能过大,因为上拉电阻R与总线上的电容值C构成的RC电路的时间常数,影响了总线从高电平到低电平的过渡时间,因而影响了通信速率。在快速模式中,SDA,SCL信号从低到高的过渡时间应该不大于300 ns,P89LPC932端口输出电容为15 pF,因而上拉电阻的最大值为[300 ns(0.7×15 pF×3)=9.5 ]kΩ。在电路中[R1,][R2]取值为5 kΩ。
由于P89LPC932单片机中带有内部RC振荡源,在电路中省略了一般51单片机所需要的晶振,因而电路比较简单。其硬件电路如图2所示。
4 多MCU系统下的软件设计
I2C总线的通信都是由主机发起的。具体为主机发送起始条件,然后发送要操作的从机地址和读写命令。在收到从机应答后,进行相应操作。软件设计主要包括主机的寄存器的设置及读写子程序的设计。
4.1 P89LPC932单片机I2C寄存器的设置
LPC932单片机微功耗51内核,内部集成了I2C总线,支持400K高速模式,既可作I2C总线上的主控器件,也可作I2C总线上的从器件[6]。LPC900单片机的I2C总线通过以下6个特殊功能寄存器实现接口:I2CON(I2C控制寄存器?0D8H)、I2DAT(数据寄存器?0DAH)、I2STAT(状态寄存器?0D9H)、I2ADR(地址寄存器?0DBH)、I2SCLH(占空比寄存器高字节?0DDH)、I2SCLLSCL(占空比寄存器低字节?0DCH)。
I2C地址寄存器在处于主模式时,该寄存器的内容无效。I2C状态寄存器是一个8位只读寄存器,它包含了I2C接口的状态代码,最低3位总是为0,I2C一共有26种可能的状态。
4.2 多MCU系统下的程序设计
按照I2C总线的规范,I2C总线数据传送可分为主发送、主接收、从发送、从接收4种方式。在多MCU模式下有主发送、主接收2种方式。每种方式都有典型的传送过程,这些数据传送都是由一些状态码标记的总线状态处理过程组成,因此I2C总线上的一个完整的数据传送是由多个I2C中断状态处理程序来完成的。每出现一个新的状态,就会产生一次I2C中断,然后进入该总线的中断处理程序,处理完毕中断返回再等待一次新的中断及状态处理直至结束。注意以下所说的主机可以是两片MCU中的任一片,而从机指的是I2C器件。
I2C总线的数据操作过程及总线状态处理是在标准软件包的支持下完成,无须用户介入,用户可以通过查询I2C总线的状态寄存器就可了解总线的处理状态,从而做相应的处理。程序设计流程图如图3所示。
I2C通信程序设计要点如下:
(1) 每次通信的起始条件和停止条件均由主机发起,从机只是负责监听主机信号。起始条件和停止条件是通过置位I2CON中的STA和STO位达到的。
(2) 当主机获得总线,成功发送启动条件后,地址和数据的发送是通过写数据寄存器I2DAT达到的。
(3) 每次发送地址和数据后应该查询状态寄存器I2STAT检查数据发送状态以进行下一步动作。
(4) 每次通信完毕后主机和从机均应该释放总线。
程序设计过程中值得注意的是:读写过程中从器件的地址是变化的,写过程中E2PROM的地址是0A0H,读过程中E2PROM的地址是0A1H。
5 结 语
本应用以两片MCU通过I2C总线共享一个存储器,实现了I2C总线多MCU机应用系统的设计,电路设计简单,易于扩展,具有较强的实用性。虽然本文是以MCS51内核单片机LPC932为例实现的,并且系统中仅两片MCU,但实际上任何带有I2C总线接口的多片MCU都可使用该方法。
本文标签:
[!--temp.ykpl--]