异步串行通信是一种串行数据传输协议,用于双向通信,可以实现半双工和全双工传输,因其结构简单、设计方便、价格低廉、占用资源少、传输距离远等优势而得到广泛应用。近年来串行通信正朝着带宽、速度、稳定性逐渐增强的方向发展。586-Engine是TERN公司推出的一款为了高精度和高可靠性的植入式应用所设计的核心板卡,运算速率高,适用于工业程序控制和高精度的数学计算。该板卡提供了2路异步串行通信接口,这在很多应用场合远远不够。
为了增加串口数量并保证较高的传输速率,使用高性能的UR8扩展卡是一种可行方案,本文结合UR8串口扩展卡在586-Engine上的成功应用,对UR8串口扩展方法进行详细介绍。
1 器件介绍
586-Engine是TEBN公司生产的基于AMD Elan SC520处理器的C/C++可编程微控制模块,成本低,功耗低,结构紧凑。它提供了多种算法指令用于处理各类数字格式以及正弦、余弦、正切、对数等超越函数,擅长高强度的运算应用。
586-Engine的主要参数指标如下:
1)CPU是主频为133 MHz的32位AMD ElanSC520处理器,兼容Inte180x86;
2)尺寸为3.6*2.3*0.3英寸,适用温度为-40℃-85℃;
3)支持114字节内置RAM,高达512KB电池供电的SRAM,512 kB的Flash,不支持SDRAM、PCI、DMA。
4)提供两个工业标准通用异步串口(UART),最高达到1.152 Mbit/s。
5)提供32路多功能I/O总线。包括总共19路12位模数转换器,其中11路串行模数转换和8路并行模数转换;6路12位数模转换器,其中2路串行数模转换和4路并行数模转换。
6)可编程中断控制器(PIC)支持22个中断优先级,包括15个外部中断。共有7个定时器,其中1个可编程内部定时器,3个16位PIT定时器和3个16位GP定时器。
UR8是TERN公司生产的8路异步串口扩展卡。它提供了多种串口工作方式,如RS232、RS485、RS422。其核心部件是2片TL16C754B 芯片,每片TL16C754B具有4路异步串口,每个通道具有64字节的发送FIFO和64字节的接收FIFO。在FIFO模式下,可以减小CPU的中断数量并降低软件开销。它有3种工作模式:查询模式、中断模式和DMA模式,并可编程选择中断和DMA模式的FIFO深度。它提供了可编程的波特率发生器用于产生14种不同的波特率,最高波特率可达230400bit/s,可见UR8的串口传输速度非常快。
2 硬件设计
2.1 UR8扩展卡串口的可配置方案
UR8扩展卡提供了3种可配置的串口标准方案(即RS232、RS485、RS422)以满足不同的需求。其中8个串口均可配置为RS232串口标准;COM2-COM5 4个串口可配置为RS485串口标准;COM2可配置为RS422串口标准。若采用后两种方案与PC机进行通信需在中间加装一个RS232/RS485转换器。以上3种配置方案均已成功应用,本文仅以RS232为例对该方法进行介绍。
2.2 接口电路原理框图
586-Engine的数据总线D0-D7连接到UR8的D0-D7,用于双向数据交换,/RD和 /CS1分别和UR8内部HCT245芯片的DIR及G相连来选择传输方向;586-Engine的地址总线A1、A2、A3、写使能端/WR、读使能端/RD以及RST与UR8的A0、A1、A2、写使能端/WR、读使能端/RD以及RST相连,实现TL16C754B的片内寄存器寻址和读写控制;586-Engine的地址总线A4、A5、A6、A7与UR8的A4、A5、A6、A7相连,经过TL16C754B内部译码器芯片进行译码实现片选功能。
UR8的8个串口(COM2-COM9)选用RS232通讯方式。可以采用两种方案进行试验,第一种是UR8的8个串口与8台PC机同时通信,第二种是 UR8的8个串口级联的接线方式,为了操作简洁采用第二种方案,即:外部数据发送到COM2的接收端/RXD2,/TXD2连到/RXD3,/TXD3连到/RXD4,以此类推,最终数据由COM9的发送端/TXD9发送到PC机的接收端,通过串口调试助手检测数据的正确性和完整性。整个接线关系如图1所示。
3 软件设计
3.1 UR8的初始化配置
TL16C754B内部寄存器地址如下表所示,每一个串口的定义都完全相同。
UR8的地址设置非常灵活,每个通道的基地址可以自由选择,采用基地址加偏移量的方法可以确定各寄存器的地址,然后就可以对各寄存器进行读写操作。值得注意的是,A0没有使用,各偏移量和基地址为偶地址,这样就增加了系统的抗干扰能力。
UR8是一款可灵活选择配置的扩展卡,其每一通道的初始化配置均可根据实际需要来进行。下面以串口2为例,给出初始化配置。
3.2 串口函数说明
void qur_init(char ch,unsigned char baud)//ch=2—9,串口初始化
void put_ch(char ch,unsigned char dat)//串口数据发送函数
unsigned char qur_hit(char ch)//检查接收FIFO是否有数据
unsigned char get_ch(char ch) //串口数据接收函数
3.3 程序说明
软件设计流程图如图2所示,程序采用顺序查询模式,依次查询COM2-COM9的接收FIFO中是否有数据,如果有数据则存储数据再将存储的数据发出;如果接收FIFO中没有数据,则继续检查下一个串口。结合硬件的连线方式,一帧数据就会在8个串口间循环一次。每一通道都有各自的接收/发送FIFO和寄存器,各自数据的接收和发送不受影响。
3.4 调试结果
调试过程中,PC机串口发送端与UR8的串口2的RXD2相连,发送的数据通过串口发送端依次通过COM2、COM3、COM4、COM5、COM6、 COM7、COM8、COM9,最终由COM9的发送端TXD9传送到PC机的串口接收端,形成一个数据循环传输的过程。PC机通过串口调试助手控制串口的发送和接收,具体调试原理如图3所示。
串口调试助手当波特率设定为115 200 bit/s,一帧数据为01到40个字符时,逐步减小每帧数据的发送间隔,最终测试得到的最短时间间隔为20 ms。即每20 ms发送一帧数据。PC机接收到的数据显示在窗口中,实验最终结果如图4所示。
从结果可以看出,接收窗口接收到的数据没有误码,说明数据在各个串口的接收发送过程中没有出现错误;界面最下面显示S:153000 R:153000,发送和接收的字节数相等,说明没有丢失数据。
图5给出了时间间隔减小到19 ms的实验结果,从接收窗口可以看出第4行39、40两个字符被01、02替代,说明串口发送一帧数据所需要时间已经大于PC机发送一帧数据的时间间隔,串口还没发完一帧数据已经被强制执行下一次的发送命令,第8、15、17、22行反映了同样的问题。说明20 ms为这种扩展方案的极限值。
调试结果说明,使用UR8成功地扩展了586-Engine的异步串行通信能力。
4 结论
本文介绍的这种串行通信扩展方案具有明显的优越性:一是增加了8个串行通信接口,可以与更多的设备进行连接,极大地提高了586-Engine的异步串行通信能力;二是由于586-Engine内核处理数据的速度极快并尽最大限度的压缩程序所占用时间,使得这种UR8串口扩展方案达到很高的传输速率,能够满足譬如飞控计算机这种高实时性、高运算量设备的设计需求;三是UR8不仅能扩展到586-Engine,还能直接扩展到A-Engine、i386- Engine、i386-Drive、586-Drive等TERN公司生产的板卡,省去了设计接口电路的麻烦。实验证明,在实时性高、传输波特率高、 CPU运算量大的情况下,使用UR8进行串口扩展是一种很实用的方案。