基于PowerPC的自环通信系统的BSP设计

来源:互联网 发布:电商美工设计培训班 编辑:程序博客网 时间:2024/05/19 16:48
 

  嵌入式系统是一种对可靠性和实时性要求较高的专用计算机系统。PowerPC860能够提供良好的编程、编译、系统配置和调试环境,同时能在底层实现模块化和屏蔽化。VxWorks是32位的实时操作系统,支持32位以上的嵌入式处理器,如MIPS、ARM、PowerPC系列等。在VxWorks的开发环境Tornado中已集成了很多基于ARM和PowerPC系列的驱动模块,如网卡设备驱动、串口通信驱动、块设备驱动等。在Tornado系统中,已在串口通信通道SCC3设备上开发了基于UART协议的板级支持BSP。但由于UART协议没有数据差错校验处理,所以不能实现数据的可靠传输。本文基于HDLC协议,提出了通过SCC3端口发送和接收数据,其中SCC3的接收缓冲区不但包括发送缓冲区的数据内容,还包括16位或32位的CRC差错校验,实现了数据的高可靠性和实时性传输。PowerPC860的板级支持包BSP的设计是实现SCC自环通信系统开发及移植的重点,BSP 主要完成VxWorks 对专用目标板的支持。由于对硬件系统紧凑性和操作系统处理性能的要求,本BSP设计是在SCC3端口上采用NMSI方式实现的自环通信。

  1 系统的BSP初始化方法

  PowerPC860由其内核、系统接口单元和通信处理模块CPM三部分组成。其中通信处理模块可以在不同的设备上发送和接收信息,还可以在CPM的串口通信通道SCC上实现不同协议的传输。一个BSP 包括硬件初始化、中断处理和产生、硬件时钟管理、本地和总线内存空间映射,同时也包含定制VxWorks 映像。目标板初始化和驱动程序设计是SCC3端口实现HDLC协议自环方式通信的关键和难点。通常,BSP提供的功能有:初始化(CPU初始化、目标板初始化、内核初始化)和驱动程序支持。驱动程序负责硬件设备的初始化,并与设备交互实现系统对设备功能的调用。本文提出的BSP设计特点是基于HDLC模式对SCC3通道初始化以及存储区的初始化配置,并采用中断控制提高数据传输效率。该BSP能够提供标准接口,包括设备初始化、设备的启动和停止、设备状态查询、中断和查询方式下发送和接收数据,从而实现底层模块化及提高数据处理效率。

  1.1 对自环通信的SCC3初始化的硬件设计

  配置发送与接收所用的波特率发生器,将SCC3的收发时钟分别配置成内部时钟和外部时钟;将SCC3配置成NMSI模式,初始化SDCR寄存器。在函数sccIoctl中,模式为16位CRC寄存器的设置如下:

sccIoctl(SCC_CHAN*pChan,int com,int arg){if(arg==CRC16_MODE){ pChan->hdlc.pSccReg->psmr&=~0x0800;pChan->hdlc.pScc->c_mask=CRC16_MASK;pChan->hdlc.pScc->c_pres=CRC16_PRES;}return (status);}

  1.2 对初始化SCC3的软件设计

  SCC3的初始化包括参数RAM和收发缓冲区描述符BD的初始化。IMMR寄存器的值是内存基址,其中内存包括寄存器基址和收发缓冲区描述符BD等。设置Rx和TxBD表的基址相对于双端口RAM的偏移量;设置Rx和Tx的函数代码;在MRBLR中设置接收缓存的最大空间;设置收发缓冲区描述符BD表基址相对于IMMR寄存器中值的偏移量。收发缓冲区描述符BD对Buffer结构进行描述,包括对Buffer的状态statusMode(即是否为空)、长度dataLength和指针dataPointer的描述。收发缓冲区描述符BD初始化过程如下(其中MAX_RXBD_

  NUM为最大接收缓冲区描述符BD数,MAX_BUF_SIZE为最大接收Buffer数目):

static void InitBDs(void){int i=0;/*pRxBuffer是Buffer的首地址*/for (i=0;i{RecvBD[i]->statusMode=0x0000;RecvBD[i]->statusMode|=(BD_RX_EMPTY_BIT);RecvBD[i]->dataLength=0;RecvBD[i]->dataPointer=(u_char*)(pRxBuffer+i*MAX_BUF_SIZE);}}

  2 自环方式通信系统的驱动设计

  由于系统在自环通信方式下工作,所以SCC3的参数RAM、收发缓存区描述符等的内存地址设计、UART协议和HDLC协议的驱动设计方法、自环通信和多通道通信方式设计将发生根本变化。因此系统设备驱动程序需编写具有相应特点的设备函数。

  (1)接收函数sccPollInput()的设计。

  正式读入数据前,必须先检测帧开始标志,并匹配地址,然后决定是否进入接收状态。进入接收状态后,首先提取RxBD的状态模式字节,若接收未准备好,则继续等待;若已准备好,则开始接收。由于一个数据包可以放置于多个缓存,所以检测RxBD状态模式字节的L位,以判断是否为本帧的最后一个缓存。如果不是,则关闭这个缓存,处理下一个缓存描述字;如果是,则接收完最后一个缓存的数据后结束接收过程。对于最后一个buffer,需要检测是否有接收错误。下面举例说明SCC3的一个接收缓冲区描述符BD所描述的5个Buffer的数据接收过程,如图1所示。该例设节点地址STADDR为0x1999,最大Buffer接收数MAX_BUF_SIZE为5,接收缓存地址pRxBuffer,连续接收发送缓存区数据66,XmitBD[0]->dataPointer为首地址pRxBuffer赋值。

  接收Buffer的数据结构和实现接收数据的基本过程如下:

#define MAX_BUF_SIZE 5#define STADDR 0x1999typedef struct{SCC_HDLC_BUF*pTxBuffer;SCC_HDLC_BUF*pRxBuffer;}SCC_HDLC_DEV*pRxBuffer =XmitBD[0]->dataPointer;*pRxBuffer=(STADDR%256);*pRxBuffer=pRxBuffer +1;*pRxBuffer=(STADDR/256);pRxBuffer=pRxBuffer +1;for(index=2;index_BUF_SIZE;index++)    {*pRxBuffer=0x66;pRxBuffer=pRxBuffer+1;}

  (2)发送函数sccPollInput( )的设计。

  设计方法同接收函数相似,但对于最后一个Buffer,需要检测是否有发送错误,并以剩下的实际数据长度作为发送帧中数据段的长度发送。

  (3)设备控制函数sccIoctl()和数据发送函数sccStartup( )的设计。

  sccIoctl()函数用于设备工作模式配置和参数读取。其中包括工作模式、通信速率、节点地址、CRC模式、最长帧等。轮询模式下的收、发消息不需外部消息激励,减少了任务的相互调度,可以用taskDelay实现 ,但是效率较低。sccStartup( )是中断方式下的数据发送函数,设计要求在sysHwInit2( )函数中用接口inConnect( )实现关联sccStartup( )和ISR。

  本文是在CS860板的SCC3设备上开发支持标准HDLC点对点通信协议的BSP,它实现了数据的高可靠和实时性传输。基于Vxworks 操作系统的HDLC协议自环通信,按一定的步骤分阶段编码调试实现。开发步骤包括:建立开发环境、编写初始化代码驱动、调试BSP等。通过测试程序实现了在查询及中断方式下发送和接收数据,在超级终端设置和查看工作模式、通信速率、节点地址、CRC模式,最长帧等,并设有收发是否正常及错误类型告警提示。通过硬件配置和程序调试,本文的BSP能在PowerPC860的其他SCC上移植。

  参考文献

  1 Motorola Company.The MPC860 PowerQUICC TrainingCDROM [EB/OL].America,Motorola,2004

  2 李方敏.VxWorks高级程序设计[M].北京:清华大学出版社,2004

  3 周启平.VxWorks下设备驱动程序BSP及开发指南[M].北京:中国电力出版社,2004

  4 张昆藏.计算机组织与结构——性能设计(第五版)[M].北京:电子工业出版社,2004

原创粉丝点击