文章

基于I2C总线技术的多处理器系统设计

2010-05-29史文奎 赵敏 孙棣华

1479阅
本文主要研究了I2C总线技术在多处理器领域的应用。简要阐述I2C总线及其数据收发技术,重点解决了多个处理器共用总线时数据传送问题一包括总线上的通信仲裁和处理器间数据收发的软件实现,并将基于I2C总线的多处理器模型应用在单元控制器领域。

1 引言

    近年来,随着嵌入式技术的发展 嵌入式系统以及低功耗、高性能、实时性好等特点在工业控制领域的得到广泛应用,主要是作为工业控制器和数据采集设备使用。但是,工业控制系统越来越庞大,要求现场的控制器所具备的功能越来越强大,数据采集设备接口也越来越复杂,现有的单处理器系统有时难以达到技术要求。目前解决这些问题的主要途径是提高处理器的档次,提升处理能力,或是增加外围扩展芯片的复杂程度。随着任务的增多,程序结构越来越复杂,而且面对不同的应用,应用软件的编制和调试也比较耗时。

图1 多处理器系统示意图

图1 多处理器系统示意图

    另一方面,微型计算机技术迅速发展,微处理器的集成度越来越高,价格也越来越低,这样在完成比较复杂的任务时,就为我们提供了这样一种可能,即使用多个微处理共同完成—个系统单元的任务,每个处理器实现—个或几个独立的模块功能,即多处理器嵌入式系统。

    多处理器系统的—般模型如图1所示:每个处理器处理特定的任务,各个处理器间通过某种通信方式进行数据的交换,完成相对比较复杂的任务。处理器之间可以是主从式,也可以是平行的结构。在多处理器系统中要实现系统的功能,除了要实现各个模块的功能,模块之间也要进行信息交换,实现模块间的协同配合。模块间的信息交换,是以某种通信方式为载体的,所以根据不同的需要,选取模块间通信方式就显得尤为重要。

2 多处理器间通信方式比较

    常用的处理器之间的通信方式有以下几种,

    (1)利用双端口RAM实现处理器之间通信,

    (2)利用单端口RAM实现处理器之间的通信,

    (3)利用串口E2 PROM实现处理器之间的通信;

    (4)利用SPI总线实现多处理器之间通信;

    (5)利用I2C总线实现多处理器之间的通信;

    其中双端口和单端口RAM主要是用于两个处理器之间的通信,双端口RAM数据交换量大、速度决快,适用于快速数据传输,但成本较高。单端口RAM是两个处理器公用—个存储器,通过一个仲裁电路防止两个处理器同时访问RAM时引起冲突。串口E2 PROM引线较少、价格低廉、应用广泛但传输速率较慢。SPI总线连线简单、方便、可靠,产品性价比好,观 是数据传输速度慢,实时性差。I2C总线接线简单、使用方便,而丑.对速度要求不是很高的场合较为适用,同时还是—个多主机总线,可以挂接较多的处理器,所以在处理器较多的场合宜选用I2C总线进行模块间的通信。通过对以上各种通信方式的比较,结合工业控制器的的功能需求,宜选用I2C总线开发基于多处理器模型的控制器。

3 I2C总线技术简介

3.1 概述

    I2C总线是Philip公司开发的—种双向两线多主机总线,它能方便地实现芯片间的数据传输与控制。I2C总线用两条线(SDA和SCL)在芯片和模块间传递信息。SDA为串行数据线,SCL为串行时钟线,这两条线必须用—个电流源或上拉电阻与正电源相连,其数据只有在总线不忙时才可传送。I2C总线的系统配置参见图2,连接到总线的器件输出级必须是漏极开路或集电极开路才能执行总线的功能。I2C总线上数据的传输速率在标准模式下可达100kb/s,在决速模式下可达400kb/s,在高速模式下可达3.4Mb/s。

图2 I2C总线的系统配置图

图2 I2C总线的系统配置图

3.2 I2C总线上的数据传输协议规范

    (1)字节的传送。发送到SDA 线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位,首先传输的是数据的最高位MSB见图3。如果从机要完成一些其他功能后,例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。

图3 I2C总线的数据传输

图3 I2C总线的数据传输

    (2)I2C总线完整的数据传输。数据的传输遵循图4所示的格式,在起始条件S后主机发送了一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位,0表示发送,写1表示请求数据读,数据传输—般由主机产生的停止位P终止,但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读写格式结合。

图4 7位地址格式完整的数据传输

图4 7位地址格式完整的数据传输


如有任何看法或投稿请联系 MSN:liangxi1122@hotmail.com;QQ:85557991分页

4 基于I2C总线的多处理器系统设计的关键问题

    多处理器系统中每个模块处理特定的任务,各个模块的功能相对独立。各模块的功能实现相对容易,要实现多处理器系统的功能需要解决关键问题的是模块间的信息传递问题。基于I2C总线的多处理器系统要实现模块间的数据交换需要重点解决两个方面的问题:模块间对总线的竞争问题和模块间在I2C总线上数据收发协议的软件支持。

    模块间采用I2C总线连接,这样总线上有多个可以控制总线的主机,I2C总线在任一时刻只能被某个主机占用,不允许有多个主机同时占用总线,否则会引起总线冲突,导致通信失败。对于多主机系统,在I2C总线上就存在一个多主机竞争的问题,需要进行仲裁。

4.1 多处理器共用总线时的通信仲裁

    通过仲裁可是使总线上的多个主机更加合理的使用总线,使整个系统的运行效率更高。首先要解决的是时钟线上的时钟同步问题,因为总线上的各个主机的时钟频率不一定相同,但是要在总线上传递数据,必须采用统一的时钟频率,所以要实现总线上时钟的同步,然后就是多个主机同时向总线发送数据时数据线上的仲裁问题。

    (1)时钟同步

图5 仲裁过程的时钟同步

图5 仲裁过程的时钟同步

    要实现多处理器系统各处理器在I2C总线上的时钟同步,可以利用I2C总线上线“与 的逻辑功能,同步过程如图5所示。因为所有器件的时钟线均并联I2C总线的SCL线上,所以只要有一个节点发送低电平时,总线上就表现为低电平;当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。

    (2)仲裁

    模块间信息交换是多处理器系统功能实现的重要部分,在I2C总线上数据是在SDA线上传送的,而且各个处理器的SDA接口都是并联到I2C总线的SDA线上的。这样就可以利用线“与”逻辑功能来实现SDA线的仲裁。具体的原理为:节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。I2C总线通过仲裁只允许一个主节点可以继续占据总线。

图6 两个主机的仲裁过程

图6 两个主机的仲裁过程

    本文以两个主节点的系统为例的来说明多处理器共用总线时的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉SOA线上的数据,因此在仲裁过程中数据没有丢失。当多于两个主机的情况下,仲裁的原理和两个主机的过程一样。

4.2 数据收发协议软件实现

    各个模块除了要完成本身的功能,还要与其他模块之间通过总线交换数据。I2C总线上数据收发需要遵循一定的通信协议,因此要开发软件来支持总线通信协议,才能保证多处理器系统模块间正常的数据交换。

    以Philips公司的P89C66X系列单片机为处理器组成多处理器系统为例,开发I2C总线数据收发的软件,对于其它基于51内核的单片机同样适用。这里只列出部分主要程序,其他部分由于篇幅的关系这里不在阐述。

    总线上可作为主机的节点想要和总线上其他的节点传送数据,首先设置申请控制总线一一即申请成为主机。如果只有一个节点申请,那么它可以马上控制总线,进行从机的寻址,数据的传输等。如果同时发送请求的多于一个节点,那么就要通过上述的仲裁过程。总线申请程序如下:

void Get Bus()
{
S1CON=Oxc5; /*设置时钟为100K(MCU主频为12M),ENS1和AA置位*/
STA=1; /*申请成为主机,起动总线*/
while(SI==O); /*等待起始位的发送*/
}

    主节点通过仲裁获得了总线的使用权以后,就要开始数据的传送。数据的收发有两个方向:向从器件发送数据和向从器件读取数据。

    向从器件发送字节数据

bit ISendByte(uchar sla,uchar c)
{
GetBus(); /*启动总线*/
SendByte(sla); /*发送器件地址,若无应答则返回*/
if(S1STA!=0X18){S1CON=0XD5;return(0);}
Send Byte(c); /*发送数据*/
if(S1STA!=0X28){S1CON=0XD5;return(0);}
S1CON=0XD5; /*结束总线*/
return(1);
}

    向从器件读数据

bit IRcvByte(uchar sla,uchar*c)
{
GetBus(); /*启动总线*/
SendByte(sla+1); /*发送器件地址*/
if(S1STA!=0X40){S1CON=0XD5;return(0);}
S1C0N=0XC1; /*接收一字节数据即发送非应答位*/
while(SI==0); /*等待接收数据*/
if(S1STA!=0X58){S1CON=0XD5;return(0);}
*c=S1DAT; /*读取数据*/
S1CON=0XD5; /*结束总线*/
return(1);
}


如有任何看法或投稿请联系 MSN:liangxi1122@hotmail.com;QQ:85557991分页

    当两个都可以作为主节点的节点之间传送数据时,其中—个单片机要作为 器件,下面是单片机作为从器件时的软件实现:

    接收数据

bit RcvByte(uchar *c)
{
S1CON=0XC5; /*清除标志位*/
while(SI==0); /*放开总线,等待接收*/
if(S1STA==ENDWRSLA){S1CON=0XC5;
return(0);} /*先放开总线,再返回0*/
*c=S1DAT; /*取数据*/
return(1)};
}

    发送数据

bit SendByte(uchar c)
{
if(SlSTA==ENDRDSLA){S1CON=0XC5;return(0);}
S1DAT=c; /*发送数据*/
S1CON=0XC5; /*释放总线*/
while{SI==0);/*等待字节数据发送完成*/
return(1);
}

5 基于I2C总线的多处理器系统应用

    基于I2C总线多处理器系统由于其模块化设计、灵活性强等特点,可以应用于工业控制、监控、数据采集等很多的领域。这里简要介绍其在工业控制中作为单元控制器的应用。单元控制器在工业控制现场用于连接现场检测设备、信息录入设备、显示设备以及上层管理系统,同时具备本地数据处理的功能。

    单元控制器处于整个控制系统的底层,负着现场设备与上层控制系统的数据交换,有以下一些特点:

    (1)需要的接口种类多。现场需要采集的生产数据来源各种各样,相应需要各种类型接口的采集设备。如信息录入设备键盘、条码枪等需要的PS/2或USB接口;负责显示的电子看板需要VGA接口;为了与上位机通信或与现场各种现场总线设备相连,需要带有以太网接口、RS-485串行接口、现场总线接口(如CAN)等;这就要求数据采集交换控制器上带有这些接口以便连接这些设备。

    (2)接口类型、接口数量难以确定。不同的现场有不同的生产数据来源以及不同的通信需求,就导致一些特殊状况,如需要的接口类型不多,但某些类型接口的数量却需要众多,或者某一类型接口的数量需要不多,但需要的接口类型众多等。

    目前,用于工业现场作为单元控制器的设备主要有:工业计算机、嵌入式计算机。工业计算机体积和功耗较大,与现场设备接口需要各种转接卡,灵活性差且价格较贵。嵌入式计算机,主要采用单处理器设计,当需要接口种类较多或是某种接口数量较多时,扩展比较困难,而且使得编程难度增加。

    将基于I2C总线的多处理器模型应用于单元控制器领域,可以充分的解决这些问题。系统的配置如图7所示,这里只列出比较常用的典型模块。

图7 采用多处理器的单元控制器简图

图7 采用多处理器的单元控制器简图

    采用嵌入式设计,体积和功耗大大减小。扩展容易,根据需要在总线上挂接需要的模块即可,每个模块只是负责完成自己的功能和与其他模块的数据交换编程难度降低。采用多片性能相对较低的处理器来完成相对复杂的任务。由于采用的芯片性能较低,所以价格便宜;采用模块化设计,针对不同的需要可以挂接不同的模块,当某个模块的不能满足要求,可以通过更换处理器、重新设计软硬件等来提升性能,而不必对整个系统重新设计,使得开发过程变得更加简化。针对不同的应用,只需将相应的模块组合,适当修改一下代码,从而使系统的灵活性、可扩展性、开放性大大加强。在使用过程中某个模块发生故障时,更换相应的模块即可,可维护性大大增强。

6 结束语

    多处理器系统是嵌入式发展的一个趋势。基于I2C总线的多处理器系统,使得应用系统的硬件、软件设计都变得更加清晰、简便,模块化方法的采用,使得设计工作更加规范。将采用多处理器系统的控制器应用于工业控制领域,使得控制器的灵活性更强,可扩展性也大大增强。


如有任何看法或投稿请联系 MSN:liangxi1122@hotmail.com;QQ:85557991

责任编辑:梁曦
本文为作者授权转载文章,任何人未经原作者同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
读者评论 (0)
请您登录/注册后再评论
相关阅读