时间:2024-05-04
李晶,吕肖晗
(1.孝感供电公司客户服务中心计量室,湖北孝感432100;2.襄阳海特测控技术有限公司,湖北襄阳441000)
基于I2C总线的多MCU系统设计
李晶1,吕肖晗2
(1.孝感供电公司客户服务中心计量室,湖北孝感432100;2.襄阳海特测控技术有限公司,湖北襄阳441000)
在一些应用系统中常常使用多片MCU协同实现系统功能,为实现多片MCU之间的数据交换,可以应用多端口RAM,但其结构复杂,成本高;而利用I2C总线使多片MCU之间通过RAM实现数据交换,具有结构简单、成本低的优点。介绍一种基于I2C总线的多MCU系统的设计,简要讨论I2C总线的结构、工作原理及多MCU竞争仲裁,给出I2C总线的多MCU系统的设计,实现了多MCU系统在实际中的应用。
I2C总线;多MCU系统;P89LPC932;数据交换
随着微电子技术的发展和MCU价格的降低,常常在实际应用中使用多片MCU来协同完成系统功能,以实现更高的性能。在这些系统中多片MCU通过某种方式实现数据交换,其中使用双口或多口E2PROM是一种常见的方法[1⁃2]。这种电路结构复杂、成本高,需要软、硬件解决多MCU访问的竞争问题,更重要的是目前许多MCU不支持外部总线,不能扩展外部E2PROM,因此无法使用这种方法。I2C总线是由Philips公司推出的芯片间串行传输总线。它以规范严谨、使用简单灵活、支持的外围器件繁多等特点而被广泛应用。I2C总线具有十分完善的总线协议,在协议的支持下,可以自动处理总线上出现的多MCU访问的竞争。目前的文献通常是介绍I2C总线在单MCU系统中的应用[3⁃4],本文介绍一种利用I2C总线实现多片MCU访问E2PROM,从而实现数据交换的方法。
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担任。
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总线软、硬件协议能进行协调管理,保证数据的可靠传输。
图1 使用两个微控制器的I2C总线
本应用中选用了两片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.5kΩ。在电路中R1,R2取值为5 kΩ。
由于P89LPC932单片机中带有内部RC振荡源,在电路中省略了一般51单片机所需要的晶振,因而电路比较简单。其硬件电路如图2所示。
图2 多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控制寄存器:
位复位值-0 I2EN 0 STA 0 STO 0 SI 0 AA 0 -0 CRSEL 0
其中I2EN位为I2C接口使能。该位为1时,使能I2C接口;该位为0时,I2C功能被禁止。STA,STO和SI必须设置为0。AA位为声明应答标志。当I2C处于主模式时,CRSEL决定SCL的频率,当CRSEL=1时,I2C接口将定时器1的溢出速率的1/2作为I2C时钟频率;当CRSEL=0时,I2C接口使用内部时钟发生器(其频率由I2SCLL和I2SCLH寄存器的值决定)作为时钟源。
I2C数据寄存器的设置:I2DAT寄存器包含要发送的数据或刚接收到的数据。当该8位直接寻址寄存器没有处理移位数据时,CPU可对其进行读写。这意味着用户只能在SI置位时对I2DAT进行访问。I2DAT中的数据在SI置位时一直保持不变。I2DAT中的数据总是从右向左移位:发送的第一个位是最高位(Bit7),而在接收完一个字节后,接收到的第一个数据位位于I2DAT的最高位(MSB)。
I2C SCL占空比寄存器I2SCLH和I2SCLL的设置:当设置I2CON寄存器的CRSEL=0以选择内部SCL发生器作为I2C接口的时钟源时,用户必须对I2SCLL和I2SCLH进行设置以选择合适的数据传输速率。I2SCLH定义SCL高电平的PCLK周期数,I2SCLL定义SCL低电平的PCLK周期数。频率由下面的公式决定:
其中,fPCLK表示PCLK的频率。
I2C地址寄存器在处于主模式时,该寄存器的内容无效。I2C状态寄存器是一个8位只读寄存器,它包含了I2C接口的状态代码,最低3位总是为0,I2C一共有26种可能的状态。
4.2 多MCU系统下的程序设计
按照I2C总线的规范,I2C总线数据传送可分为主发送、主接收、从发送、从接收4种方式。在多MCU模式下有主发送、主接收2种方式。每种方式都有典型的传送过程,这些数据传送都是由一些状态码标记的总线状态处理过程组成,因此I2C总线上的一个完整的数据传送是由多个I2C中断状态处理程序来完成的。每出现一个新的状态,就会产生一次I2C中断,然后进入该总线的中断处理程序,处理完毕中断返回再等待一次新的中断及状态处理直至结束。注意以下所说的主机可以是两片MCU中的任一片,而从机指的是I2C器件。
I2C总线的数据操作过程及总线状态处理是在标准软件包的支持下完成,无须用户介入,用户可以通过查询I2C总线的状态寄存器就可了解总线的处理状态,从而做相应的处理。程序设计流程图如图3所示。
图3 程序设计流程图
总线初始化代码如下:
状态处理代码如下(举例):
向总线发送数据代码如下:
I2C通信程序设计要点如下:
(1)每次通信的起始条件和停止条件均由主机发起,从机只是负责监听主机信号。起始条件和停止条件是通过置位I2CON中的STA和STO位达到的。
(2)当主机获得总线,成功发送启动条件后,地址和数据的发送是通过写数据寄存器I2DAT达到的。
(3)每次发送地址和数据后应该查询状态寄存器I2STAT检查数据发送状态以进行下一步动作。
(4)每次通信完毕后主机和从机均应该释放总线。
程序设计过程中值得注意的是:读写过程中从器件的地址是变化的,写过程中E2PROM的地址是0A0H,读过程中E2PROM的地址是0A1H。
本应用以两片MCU通过I2C总线共享一个存储器,实现了I2C总线多MCU机应用系统的设计,电路设计简单,易于扩展,具有较强的实用性。虽然本文是以MCS51内核单片机LPC932为例实现的,并且系统中仅两片MCU,但实际上任何带有I2C总线接口的多片MCU都可使用该方法。
[1]张洪刚,苑秉成,徐瑜,等.基于FPGA和SD卡的水声信号高速采集与存储系统设计[J].电子器件,2009,32(1):208⁃212.
[2]肖堃,闫杰,靳文平.基于TMS320F28335的无人机机载智能接口卡设计[J].机械制造,2013,51(590):17⁃20.
[3]冯立杰,傅民仓,李文波.多CPU嵌入式系统的设计方法[J].现代电子技术,2006,29(6):54⁃55.
[4]何冰,曾立波,尹邦胜.I2C总线在嵌入式系统中的应用[J].现代电子技术,2005,28(16):31⁃32.
[5]何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社,1995.
[6]周立功单片机公司.P89LPC932A1 FLASH单片机使用指南[EB/OL].[2010⁃08⁃09].http://www.zlgmcu.com.
Design of multi⁃MCU system based on I2C bus
LI Jing1,LÜ Xiao⁃han2
(1.Customer Service Center,Xiaogan Power Supply Company,Xiaogan 432100,China;2.Xiangyang Haite Control Technology Co.,Ltd,Xiangyan 441000,China)
System functions are implemented by multi⁃MCU collaborative working in some application systems.Although the multi⁃port RAM can be applied to achieve data exchange among multiple MCUs,its structure is complex and cost is high. Multi⁃MCU data exchange can be realized by the method to link I2C bus with RAM,which has the advantages of simple struc⁃ture and low cost.Design of the multi⁃MCU system based on I2C bus is introduced.The structure,execution principle,multi⁃MCU competition and arbitration of I2C bus are discussed briefly.The design of multi⁃MCU system based on I2C bus is given. The application of multi⁃MCU system in practice was implemented.
I2C;multi⁃MCU system;P89LPC932;data exchange
TN915⁃04
A
1004⁃373X(2015)09⁃0016⁃03
李晶(1971—),男,湖北孝感人,工程师。主要研究方向为供电信息技术及计量。
吕肖晗(1982—),男,湖北襄阳人。研究方向为嵌入式系统、自动化仪器仪表、无线传感器网络。
2014⁃10⁃30
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!