一种面向小型全自动生化分析仪的UART通信的实现

时间:2011-08-23

 

  为了提高小型全自动生化分析仪的工作效率,其控制系统需采取并行处理的策略,以单个单片机为的单处理器因其功能的局限性,已不能完成多任务的并行处理。采用双单片机的控制方案可以提高系统的性能,但必须为双机通信提供稳定可靠的方案。

  UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始,后面是7个或8个数据位,一个可用的奇偶位和一个或几个高位停止位。接收器发现开始位时它就知道数据准备发送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。在接收过程中,UART从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART就置位奇偶标志。本文将分别从物理层、传输层与应用层介绍等待握手协议在同步可靠的UART通信中的实现。

  1 物理层

  物理层实现通信底层的物理连接,为数据端设备提供传送数据的通路,其作用是确保比特流能在物理信道上传输[2]。物理层的连接由单片机的异步通信端口(UART串口)实现。

  1.1 异步通信简介

  在异步通信中,数据是以字符为单位组成字符帧进行传送的。发送端与接收端分别按字符帧规定的格式和波特率来协调数据的发送和接收。字符帧和波特率可以由用户根据实际情况选择。

  字符帧由起始位、数据位、停止位和空闲位4部分组成,如图1所示。


  1.2 C8051F060的UART

  C8051F060是一款完全集成了单片复合信号系统的微控制器。C8051F060具有59个数字I/O引脚,并集成了2个 16位 1 Msps ADC。C8051F060结合了高度精密的模拟数据转换器和一个高吞吐量8051 CPU,是模拟和计算密集型应用的理想选择。

  C8051F060 应用:工业过程反馈控制系统;仪表仪器;测试系统;销售点终端;卫星广播系统;蜂窝基站;光纤系统;测试设备;电子秤;智能发射器;自动测试设备 (ATE)。

  2 传输层

  传输层实现数据流的传输,并负责传输控制,具备流量控制的功能。其目的是为应用层提供可靠无误的数据传输。传输层的服务要经历传输连接建立阶段和数据传送阶段[2]。该层由软硬件结合实现。硬件实现传输线路与控制线路的连接,软件对其进行设置和控制。

  2.1 传输层的硬件电路设置

  传输层的数据传输线路为物理层的UART串口,其传输连接的建立、传输流量的控制则通过单片机的另外2个独立I/O口,用于实现3次等待握手协议。电路设计的原理为:发送端单片机UART口的TX0和RX0分别连接到接收端单片机的UART口的RX0和TX0。在每1个单片机上分别使用2个I/O端口用于握手信号的发送和接收。其电气连接如图2所示。

UART传输层的硬件电路设置

  2.2 传输层的软件设计原理

  为实现数据通信的同步和提高通信的可靠性,传输层采用3次等待握手协议实现数据的实时同步通信。协议的原理如图3所示。

  协议的原理如下:

  (1)当发送端要发送数据时,发出第1次握手信号,通知接收端,第1次握手信号始终有效,直到收到接收端对第1次握手信号的应答信号,即第2次握手信号。当发送端接收到第2次握手信号后,使第1次握手信号无效,发出对第2次握手信号的应答信号,即第3次握手信号,并随即发送数据。至此,3次握手协议完成,发送端与接收端实现了数据的同步传输。

  (2)当接收端要接收数据时,首先等待发送端发出的第1次握手信号,当发送端发送第1次握手信号后,表明发送端已经准备好要发送数据,接收端将第2次握手信号持续一段时间后清除,等待第3次握手信号。检测到第3次握手信号后,随即开始接收数据。至此,3次握手协议完成,发送端与接收端实现了数据的同步传输。

  2.3 传输层的软件实现

  传输层的软件与硬件电路密切相关,传输层的软件质量的好坏决定了终应用层软件的质量。在传输层的软件实现中,与硬件相关的系统初始化尤为重要。系统上电后,首先要进行的就是初始化,初始化包括系统时钟初始化、EMIF初始化、定时器初始化、端口初始化以及交叉开关的配置等。可以通过设置相应的特殊功能寄存器(SFR)来进行。由于篇幅所限,这里主要介绍关键初始化模块:端口初始化与UART初始化。系统的初始化分为主机的初始化与从机的初始化部分。

  2.3.1 端口初始化

  端口初始化的关键是合理地分配C8051F060的数字外设,使其依据硬件电路的设计,对交叉开关进行配置,并设置相应的端口输入输出类型。主机端口初始化中交叉开关配置部分的程序如下:

  void  MasterPORTInit (void)

  {

  OldSFRPAGE = SFRPAGE;

  SFRPAGE = CONFIG_PAGE;                //切换页面地址

  XBR0 = 0x02;                                    //SPI0连接到端口

  //脚P0.0~P0.3

  XBR1  = 0x00;

  XBR2  = 0x44;                                  //弱上拉全局禁止,交叉

  //开关使能, UART连接到P0.4~P0.5

  SFRPAGE = OldSFRPAGE;               //恢复页面地址   }

  从机的端口初始化与主机的端口初始化原理相同,这里不再累述。

  2.3.2 UART初始化

  UART初始化主要包括时钟源的选择、工作方式的选择,逻辑电平的选择及处理中断的方式等,其中主机的UART初始化程序如下:

  void  MasterUARTInit(void)

  {

  OldSFRPAGE = SFRPAGE;

  SFRPAGE = UART_PAGE;     //切换页面地址

  SCON1 = 0x40;                      //波特率可编程的8位UART,

  //停止位的逻辑电平被忽略,

  //禁止接收,清空发送及接收中断标志

  SFRPAGE = OldSFRPAGE;            //恢复页面地址

  }

  传输层数据传输软件实现元数据传输的功能,在这里实现传输层的3次握手协议。依据3次握手协议的设计原理,主机发送软件的实现如下:

  {

  while(P0_6==1)            //等待第2次握手信号

  P0_7=0;                      //发出第1次握手信号

  Delay1us(1);      //延时1 ?滋s

  P0_7=1;       //发送第3次握手信号

  }

  工作时序为:当主机需要发送数据时,首先将P0_7设置为低,即为第1次握手信号,从机检测到该信号后,知道主机将发送数据,于是发出第2次握手信号,将与主机P0_6相连的引脚置低。主机检测到P0_6为低电平,即第2次握手信号后,将发出第3次握手信号,即把P0_7设置为高电平,并随即发送数据。

  从机接收数据时的软件实现如下:

  {

  while(P5_5==1)                 //等待的第1次握手信号

  P5_4=1;

  P5_4=0;                           //发出第2次握手信号

  Delay1us(1);

  P5_4=1;

  }

  从机的P5_4、P5_5分别连接主机的P0_6、P0_7。当从机接收数据时,首先等待主机发送的第1次握手信号,即主机的P0_7端口(从机的P5_5端口)为低电平。若检测到第1次握手信号,则发送第2次握手信号(即将P5_4置低),随即将P5_4拉高,检测到第3次握手信号后开始接收数据。为实现软件的简便性,减少编程出错的概率,本文定义了2个宏来完成上述握手的过程。宏定义如下:

  #define Send while(P0_6==1)P0_7=0;

  \Delay1us(1); P0_7=1;          //主机发送的宏定义

  #define Receive  OldSFRPAGE=SFRPAGE;

  \SFRPAGE=CONFIG_PAGE;while(P5_5==1)P5_4=1;

  \P5_4=0;Delay1us(1);P5_4=1;

  \SFRPAGE=OldSFRPAGE;           //从机接收的宏定义

  主机发送与从机接收元数据的函数分别如下:

  void  MasterSendUART (Uchar sdata)

  {

  Send;                                                   //完成握手协议

  OldSFRPAGE = SFRPAGE;               //寄存器页面切换

  SFRPAGE = UART_PAGE;

  TI1 = 0;                                            //清除发送完成中断标志

  SBUF1 = sdata;                                  //发送数据

  while(TI1==0);                                  //等待发送完成

  TI1 = 0;                                            //清空发送完成标志

  SFRPAGE = OldSFRPAGE; }

  Uchar SlaverReceiveUART(void)

  {

  Receive;                                            //完成握手协议

  OldSFRPAGE = SFRPAGE;

  SFRPAGE = UART_PAGE;                //寄存器页面切换

  SCON1 = 0x50;                                  //允许接收,清空接收完标志

  while((SCON1&0x01)==0);                   //等待接收完成

  ReData = SBUF1;                                 //接收数据

  SCON1 = 0x40;                                   //清空接收及发送完成标志位

  SFRPAGE = OldSFRPAGE;

  return ReData;                                  //返回接收到的数据

  }

  3  应用层

  应用层软件主要为实际应用服务,实现系统的应用需求。本文所设计的通信方案是为小型全自动化的生化分析仪控制系统的数据通信服务的,应用程序包括生化检测结束后病人检测结果的交互,以及双机对各功能器件的控制指令等,下面简要介绍应用层软件的流程。

  应用层软件完成数据的发送和接收,应用层数据接收软件将实现数据的完整接收与存储,发送软件完成完整的数据发送。小型全自动生化分析仪控制系统的通信内容有结果数据和控制指令。为进一步保障数据传输的可靠性与同步性,在应用层的数据传输中加入了同步数据。应用层函数完成有关数据接收的处理,首先判断接收到的数据类型,并依次调用相应的软件处理模块来对接收后数据的存储。图4为应用层的接收端软件的执行流程。


  4  结果

  本文在小型全自动生化分析仪控制系统的通信中分别使用基于3次等待握手协议的UART通信与基于查询式的UART通信方案并进行了对比,其结果如表1所示。当系统使用基于查询式的UART通信时,因双处理器未能同步工作,导致了接收端未能及时查询及存储数据,造成了数据的丢失。而通信建立时的等待握手协议则提高了通信的稳定性与可靠性。


 

  本文提出的基于3次等待握手协议的UART传输通信同步可靠,应用于小型全自动生化分析仪的控制系统通信时,解决了查询方式下UART因接收与发送端未同步造成数据帧丢失及中断方式打断正常程序流程执行的问题,取得了令人满意的效果。

 


  
上一篇:风力发电系统中ABB剩余电流动作保护器的应用
下一篇:浅析一种具有自动增益控制功能的信号调理电路

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料