基于FPGA的RS-232通信协议接口设计
2020-12-22燕伯峰董永乐刘宇鹏石浩渊
燕伯峰 董永乐 余 佳 刘宇鹏 黄 欣 石浩渊
(1.内蒙古电力(集团)有限责任公司,内蒙古 呼和浩特 010020;2.内蒙古电力科学研究院,内蒙古 呼和浩特 010020)
0 引言
RS-232 接口是1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准[1]。常见的RS-232 串口有DB25 和DB9 2种,接口定义如图1 所示。RS-232 通信协议因其低成本和高可靠性而被广泛应用,加上其占用的I/O 口数量少,许多以嵌入式微处理器为核心的控制系统中常常采用该技术[2]。工业控制的RS-232 口一般只使用RXD、TXD、GND 3 条线,使用简单方便。FPGA 即现场可编程门阵列,是在PAL、GAL、CPLD等可编程器件的基础上发展而来,作为专用集成电路领域中的一种半定制电路,它既解决了定制电路生成周期长且内部电路不能更改的不足,又克服了原有的可编程器件门电路有限的缺点[3]。该文的逻辑设计是基于Altera 公司的Cyclone V 系列FPGA,型号为DE10-Nano,开发板上同时集成了Cortex-A9 ARM 处理器,提高了设计的灵活性。
1 RS-232协议介绍
RS-232 电平是负逻辑,即逻辑‘1’是-15V~ -5V,逻辑‘0’是+5 V~+15 V,与TTL 电平相反,使用时需要注意。RS-232 为串行异步通信,每一数据帧由起始位、数据位、奇偶校验位(可省略)、停止位和线路空闲位组成[4],如图2 所示。一般情况下,起始位为1 位,数据位为5、6、7或8 位,奇偶校验位为1 位,停止位为1、1.5 或2 位。在无数据传送时,传送线为逻辑‘1’,处于空闲状态,当检测到低电平后,为数据传输的“起始位”,之后开始传送数据位,低位在前,高位在后,发完数据位后,根据所发数据发送奇校验位或偶校验位,最后以一位高电平作为停止位结束该次数据传送[5]。传送的速率一般为9 600 bps 或115 200 bps 等。该文在RS-232 串口通信协议的基础上,利用FPGA 对该协议进行模拟仿真,进行数据的接收与发送,并利用串口调试助手进行在线测试。之后,再利用FPGA 模拟一款电表计量芯片的数据存储与交换的过程。
图1 25 针及9 针串口引脚图
2 FPGA模拟RS-232串口数据收发设计
串口发送的程序写在uart_x 模块中。在主程序模块中首先调用gen_divd 模块,在50M 主时钟的基础上分频出115 200 bps 的时钟作为串口数据发送的波特率。接着,调用uart_x 模块以BCLK,Xmit cmdp,TxdBuf 为输入,其中BCLK 为115 200 bps 的时钟信号,作为发送数据的时钟,Xmit cmdp 为wire 类型数据,作为一个数据传输的标志,在Xmit cmdp 由高变低的下一个上升沿开始发送数据,在TxdBuf 中为要发送的数据,从主模块中传递过来。
在uart_x模块中定义了6位状态机,其中TXIDLE为空闲状态,当无数据发送时处于该状态,此时无操作。TXLode为装载数据状态,当接收到主模块发来的Xmit cmdp 信号由0 转到1 时,进入数据装载状态,将主模块发过来的需要发送的数据装载到TxdBufTmp 寄存器中,之后转入TXStartBit 状态中,发送0 到数据线中,作为起始信号。接着转入TXDataBit 状态,将TxdBufTmp 中的数据发送到数据线中,一位一位发送,低位在前,高位在后,发送完8位数据后,进入TXStopBit 状态,发送1 到数据线,作为数据帧的停止位。最后进入TXDone 状态,给TxDone 寄存器置1,表示发送完成,再进入TXIDLE 状态,等待数据帧的到来。
串口接收程序主要在uart_r 模块中实现。在主模块中首先调用gen_divd 模块,将主频50M 时钟分频得到115 200×16 bps 的时钟信号。该信号为串口通信波特率的16倍,方便将数据线上发送过来的数据在合适的位置接收进来,避免错乱或出现毛刺影响数据接收。
在uart_r 模块中,以CLKIN 作为接收的主时钟,该时钟为主模块中的115 200×16 bps 的时钟信号,RXD 为接收数据线,串口发送过来的数据通过该输入口进行接收。在该模块中定义了5 位状态机,首先IDLE 状态是空闲状态,等待数据的到来,此时数据线为高电平,当数据线上传来0 信号后,进入RevStartBit 状态,在该状态中,一直判断信号线中的数据,如果在16 个脉冲内均为低电平,则认可该信号为数据帧起始信号,如果在此段时间中数据线出现高电平,则转到IDLE 状态,视为数据线上的毛刺。16个脉冲后,判定为起始信号后,进入RevDataBit 状态,对数据线上的数据进行接收。数据位定为8 bit 的数据,每一bit 数据用16 个脉冲来接收,在第7 个脉冲读取数据线上的数值,防止数据线上出现毛刺或抖动,接收到的数据存在RxDataBuf 寄存器中。接收完8 bit 数据后进入RevStopBit状态,将RxReady 置为1,表示接收完成,传递到主程序,进行相应动作。16 个脉冲后进入RevDone 状态,将接收到的数据从RxDataBuf 寄存器传递给RxData 寄存器,输出到主模块中。
图2 RS-232 数据帧结构
3 HT7017通信接口模拟设计
HT7017 芯片是经典的单相电能计量芯片,该芯片通信接口为UART 即RS-232 接口,可以将电表通过的功率信号等信息存储在芯片的内部寄存器中,用作电表的计量数据。该文利用FPGA 模拟该芯片的通信接口,以及芯片内部的寄存器。以此可以模拟和监控写入该芯片的数据,防止出现篡改计量芯片数据的行为。
HT7017 芯片UART 通信有一确定的命令帧规范,首先发送0x6A 作为字节帧头,然后发送 CMD 字节, CMD 字节最高位为0 则表示要进行读操作,如果为1 则表示要进行写操作,后面7 位数据表示要操作的数的寄存器地址。如果为读操作,则将指定寄存器中的数据读取出来,发送到数据线上,高位在前。发送数据一般为3 个字节的寄存器数据,如果数据不足3 字节,则将寄存器数据与数据帧的低位对齐,并将前面5 个字节的数据相加,抛弃进位,最后再按位取反,得到CHKSUM 字节,发送出去,用来校验前面发送的数据的正确性。如果为写操作,则将接收到的数据进行校验和运算,与接收到的CHKSUM 字节对比验证,如果相同则将数据存入寄存器中并返回一个ACK,数据为0x54,否则将数据丢弃,也返回ACK,数据为0x63。HT7017 芯片UART 通信的数据帧规范流程图如图3 所示。
在uart_r 模块中,主要实现HT7017 接收数据的时序模拟仿真。首先利用FPGA 中配置的PLL 锁相环IP 核,将板载主时钟50M 分频成1.8432 MHz 的时钟信号,该频率为通信波特率115 200 bps 的16 倍,用来接收数据线上的信息。之后定义6 位状态机,以此来完成数据接收的时序设计。
IDLE 状态为空闲状态,此时数据线上一直为高电平,当检测到数据线上有低电平时跳转到start bit 状态中,检测该低电平,如果在16 个脉冲内均为低电平,则判定为起始信号,否则认定为数据线上的毛刺。之后转入data bit 状态,在该状态接收8 bit 数据,第一个数据如果为0x6A,则继续接收,否则放弃本次数据通信。接收第2 个字节后,判断第一个bit,如果为1,则进行写操作,如果为0 则进行读操作。写操作就继续接收2 个字节的寄存器数据和1 个字节的校验和数据,将校验和数据前的数据相加,抛弃进位,再按位取反,与接收到的校验和数据对比,如果相同则将数据存储到在SDRAM中开辟的寄存器中,并返回0x54 表示接收完成。如果与校验和数据不同,则放弃存储数据,且返回0x63。如果要进行读操作,则需要调用uart_x 模块,且需要先利用gen_divd 模块,分频得到115 200 bps 的波特率,根据CMD 中给出的寄存器地址,取出其中的数据信息,如果不足3 个字节,则高位补0,并计算出校验和字节,发送出去,作为发送数据的验证。
图3 HT7017 数据帧流程图
4 仿真及结果验证
设计完串口的时序逻辑后,在QUARTUS中的SignalTab II 逻辑分析软件中,进行了仿真验证,结果如图4 所示。该图是通过使用串口调试助手软件以115 200 bps 波特率发送十六进制数62 到FPGA 中,FPGA 上接收数据的波形,可以看出数据传输稳定且准确。
图4 串口接收时序图
图5 HT7017 写入数据时序图
HT7017 通信接口有其专门的数据帧规范,该文利用FPGA 模拟了其通信接口的设计,实现了数据的存取,满足了项目的需要。图5 为HT7017 芯片写入数据的时序图,首先接收到头字节为0x6A,之后接收到CWD 字节为0x82,首位为1,表示有数据需要写入,写入的寄存器地址为0x02,之后接收到的数据为0x33 和0x56,计算其校验和为0x8A,与接收的CHKSUM 一致,表明数据接收正确,可以存入相应寄存器中。数据接收过程明确,满足要求。
图6 为模拟读取HT7017 芯片中寄存器数据的时序图,图7 为串口调试助手中接收的数据截图。首先利用串口调试助手发送头字节0x6A,然后发送CWD 字节0x32,首位为0,表明要读取数据,要读取的寄存器地址为0x02,读出的数据为0xE1,0xD5,0x62,仿真表明数据读取准确。
图6 读取HT7017 数据时序图
图7 串口调试助手读取数据图
5 结语
该文提出的利用FPGA模拟RS-232串口通信的设计,运行稳定且配置简单,可以广泛应用于支持RS-232 接口的各类芯片的通信仿真,也可以解决某些开发板串口数量不足的问题。该文基于智能电表测试系统进行设计,利用FPGA 模拟支持RS-232 串口通信协议的存储芯片,例如Flash 芯片、EEPROM 芯片等,可以用来监督通过该芯片收发的数据,并可以通过板载的ARM9 处理器将所得数据以Modbus 协议传递到上位机,进行显示。也可以通过上位机直接修改该芯片内的数据,实现对智能电表的测试,防止出现篡改数据或伪造数据等行为,有较高的应用价值。