许亚星,门 茜,曹艳梅,王 琳
(中国航空计算技术研究所,陕西 西安 710065)
为了提高系统的接口负载能力,常采用FPGA+CPU架构进行系统控制。其中FPGA负责统一管理硬件接口,将硬件采集的数据处理后放在特定地址或空间,由CPU通过数据总线和地址总线读取数据,进一步进行控制处理。FPGA也可以管理多路422总线,为每一路422总线创建特定的硬件FIFO空间,进行数据收发时,首先将要发送的数据放在对应的硬件FIFO中,然后统一进行发送处理。当要发送的数据量超过硬件FIFO的大小时,可能会造成发送数据的丢失,进一步造成通信故障。本文提出了一种422总线超额发送方法,即当要发送的数据量超过FIFO大小时,不用更改FIFO大小,同时保证数据发送的完整性。
RS422是一种全双工串行异步通信,因为没有统一参照的时钟,通信双方需要约定好固定的通信格式,包括通信周期、通信长度、包头、校验和、波特率、校验方式、停止位方式等。422通信的基本单位是数据帧,数据帧包含起始位、数据位、校验位、停止位,如图1所示。若干数据帧组成数据包,数据包长度和内容按照通信协议规定,数据包构成通信双方单次通信的内容[1]。
图1 数据帧格式
FPGA可以管理多路422通信,将通信结果放在特定地址供CPU进行读写。FPGA在内部为每一路422搭建串口控制器软核,通过软核控制与外部422的通信。FPGA为CPU开放串口控制器软核配置寄存器地址,CPU通过对寄存器进行配置,可以实现与不同类型的422进行通信[2]。串口控制器软核控制寄存器的定义如表1所示。
表1 串口控制器软核控制寄存器定义
其中,接收缓冲寄存器用于保存刚收到的数据,发送保持寄存器用于保存将要发送的数据。波特率发生器是一个16位的计数器,用于生成发送器的传输数据速率,可通过分频因子寄存器(DLM&DLL)对其进行编程设置,DLL分频因子寄存器用于设置分频因子的低8位,DLM分频因子寄存器用于设置分频因子的高8位。中断使能寄存器用于设置串行通道的中断功能,通过置位中断使能寄存器相应的位可以分别使能串行通道的6个中断源。中断标识寄存器用于指示当前是否存在一个未决中断以及这个中断的类型。FIFO控制寄存器用来实现使能和清空FIFO的功能。线控制寄存器用于定义串口通讯中的数据传输格式,包括校验使能、校验方式、停止位个数、数据位个数等。调制解调器控制寄存器用于控制串行通道/调制解调器模式的接口信号,或者用于特殊功能的输入输出信号。线状态寄存器用于标识主处理器与本控制器之间的数据传输状态,主机可以通过读取线状态寄存器得到接收和发送的情况。FIFO触发登记寄存器用于设置接收FIFO的触发等级[3]。
使用软核进行串行通信的时候,首先需要对软核进行初始化,进行初始化时,按照串口控制器软核寄存器的位定义,依次对LCR、FCR、LSR、DLL/DLM、IER、MSR、MCR进行初始化配置。初始化配置完成后,就可以进行读接收操作和写发送操作[4]。
进行读接收数据操作时,首先读LSR(1)线状态寄存器,判断自上次接收数据是否发生了硬件FIFO溢出;然后读LSR(0)线状态寄存器,判断是否接收数据准备好;最后读RBR接收缓冲寄存器或接收FIFO中的数据,完成读接收数据操作。
进行写发送数据操作时,首先读LSR(5)线状态寄存器,判断控制器中THR或发送FIFO是否为空;然后写数据到THR发送保持寄存器或发送FIFO中,完成写发送数据操作[5]。
按照上述步骤进行写发送操作通信时,判断发送FIFO为空后,一次性将要发送的数据写进发送FIFO中,但当要发送的数据量超过发送FIFO大小时,会造成发送数据丢失,进一步导致通信失败。在不改变硬件FIFO大小的情况下,对写操作进行适当改进,可以实现固定硬件FIFO的超额发送。
假设硬件发送FIFO大小为128字节,要发送的数据量为200字节,超过硬件FIFO大小,直接写入FIFO时,会丢失128字节以外的数据。进行写操作时,可以在第一步和第二步操作间增加一个操作,增加判断要发送的数据是否大于128,当发送数据小于128时,可以将发送数据直接写入硬件发送FIFO,当发送数据大于128时,可以在每次写入发送FIFO前,都判断一次硬件FIFO是否为空,如果为空,则写入,如果不为空,则进行循环等待,直至硬件FIFO有空余。
用如上方法对写发送操作进行改进后,经过试验,可以在不改变硬件发送FIFO大小的情况下,实现数据量大于硬件FIFO的超额发送。
本文提出的基于FPGA串口软核控制器的RS422超额发送方法,解决了发送数据量依赖硬件FIFO大小的问题,实现了不改变硬件FIFO的情况下,可以发送大于硬件FIFO大小的数据量,提高了RS422通信的灵活性。