基于TMS320F2812 DSP与PC机的串口通信设计
摘 要:本文首先介绍了TMS320F2812 DSP与PC机进行串口通信时的硬件连接。然后 ,详细阐述了从机通信程序和主机通信模块的软件设计。其通信程序协议采用了一种通用工业标准Modbus协议。该系统中不但采用了奇校验和CRC校验,还利用定时器设置了超时报警机制,提高了通信系统抗干扰的能力。
关键词: DSP,PC机,串口通信,设计
1. 前言
通常,微处理器都集成有1路或多路硬件UART通道,可以非常方便地实现串行通信。在工业控制、电力通讯、智能仪表等领域,常常使用简便易用的串行通信方式作为数据交换的手段。本文所介绍的是采用DSP芯片为核心的电动自卸车控制器与故障诊断机之间的串口通信。电动自卸车控制器的一个功能是将电动车运行中的实时数据和故障数据采集并上传给故障诊断机。故障诊断机(PC机)完成车载数据的转储、数据管理和故障诊断等功能。
2.DSP 与PC机的硬件连接
系统下位机采用TI公司的TMS320F2812 DSP。它是德州公司专为电机数字控制而推出的高性能的数字信号处理器。F2812支持异步外设之间的串行通信,内部有两路专用的串行通信模块(SCIA与SCIB),其中用于通信的两个I/O引脚分别为发送端SCIA/BTXD和接收端SCIA/BRXD。SCI接收器和发送器是双缓冲,每个都有自己单独的使能和中断标志。两者可以独立工作或在全双工的方式下同时工作。SCI内部有多个串行通信接口控制寄存器,可以设置通信的格式,如波特率,奇偶效验,起始位,停止位和数据位中断模式。
PC机的串行通信口一般采用的是RS-232协议,发送和接收都是单端的,传输速率较低,传输的最大距离只有15-20m,而且RS-232为共模传输,抗干扰性差。因此,本文采用了平衡差分接收的RS-485协议,其抗共模干扰能力强,接收灵敏度高。PC机与TMS320F2812的连接方式如图1所示。PC机通过RS-485/RS-232集线器转换器接入RS-485。图中,SP3481/3485为低功耗半双工收发器。它完全满足RS-485和RS-422串行协议的要求。DE脚的逻辑电平为高时,使能发送器的差分输出,为低时,发送器的输出呈现三态。RE#脚的逻辑电平为高时,使能接收器输入,反之,禁止输入。通过软件编程控制TMS320F2812的COMA_R#/W脚电平,可控制SP3481/3485处于发送或接收状态。
3. 软件设计
串口通信程序中,下位机采用C语言编写,上位机采用VC++编写。其通信协议采用Modbus通信协议。
3.1 Modbus通信协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一种通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构。它描述了控制器请求访问其它设备的过程。
控制器通信使用主—从技术,即仅主设备能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据做出相应反应。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一个消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、错误检测域。
控制器能设置为ASCII传输模式或RTU传输模式中的任何一种进行通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
ASCII模式:
当控制器设成以ASCII模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。每个字节中有1Bit起始位 ,7Bit数据位(最小的有效位先发送), 1Bit奇偶校验位(可不使用),1Bit停止位(有校验时)或2个Bit停止位(无校验时)。
RTU模式:
每个字节中有1Bit起始位 ,8Bit数据位(最小的有效位先发送), 1Bit奇偶校验位(可不使用),1Bit停止位(有校验时)或2个Bit停止位(无校验时)。
3.2 从机通信程序设计
根据MODBUS协议。主、从机间通信时发送的每一帧数据包含以下信息,其格式为:
从机地址(1 字节):表示从机设备号,主机利用从机地址来识别从机设备。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应并回复。命令字(1 字节):主机发送的功能代码,告诉从机当前执行什么操作。本文中,主机向从机读数据的命令字为04H,用于读取从机的实时数据和故障数据。主机写命令字为10H,用于向从机写清除命令和整定参数。信息字(N 字节):包括进行两机通讯中各种数据地址、数据长度、数据信息。校验码(2 字节):用于检测数据通讯错误,采用循环冗余码CRC16。由于从机只能被动的接收上位机命令后,才进行数据传输。故从机上电初始化后,就会打开串行通信的接收中断,接收上位机传过来的命令与数据。其中,接收与发送缓冲区设置为16Bit的数组形式,长度分别为100与800。SCI模块的初始化程序如下:
void main(void)
{ DINT;
…
EALLOW;
SciaRegs.SCIFFTX.bit.SCIFFENA = 0; //Disable FiFo
SciaRegs.SCIFFRX.all = 0x0000;
SciaRegs.SCICCR.all = 0x0027; //1bit stop, odd parity,8bit Data width
SciaRegs.SCICTL1.all = 0x0003;//接收
SciaRegs.SCIHBAUD = 0x05;//波特率为9600bit/s
SciaRegs.SCILBAUD = 0x15;
SciaRegs.SCICTL1.bit.SWRESET = 1; //SCI软件复位
GpioDataRegs.GPECLEAR.bit.GPIOE1=0; //Ge.1=0 ,Set SCI_A To Receive;
Enable_SciA_RxInt();
Disable_SciA_TxInt();
PieCtrlRegs.PIEIER9.bit.INTx1=1; // SciA RX,PIE Group 9, INT1
PieCtrlRegs.PIEIER9.bit.INTx2=0; // SciA TX,PIE Group 9, INT2
SciA_RxBuf.Ptr=0;
IER|= 0x100; // Enable CPU INT
PieCtrlRegs.PIEACK.bit.ACK9 =1 ;
EDIS;
}
从机不断地侦测Modbus网络,当第一个数据(地址码)到达,TMS320F2812 DSP就会进入接收中断,将该字符放到数据接收缓冲区。为了提高通信的可靠性,除了采用硬件抗干扰措施外,软件中也采用了CRC校验和超时报警等抗干扰措施。每收一个字节时启动超时检测,若超时,则说明通信有误。此时,计数器溢出,进入定时器中断,先将定时器清0,丢弃此错误帧,系统重新进入下一重复帧接收等待状态。
若没有超时,根据接收到的命令码和字节长度即可算出本帧数据的总长,由此判断一帧数据是否接收完毕。如接收完毕,则进行错误检测。若从机地址错误或CRC校验错误,从机不对此作应答回复,等待上位机处理。若校验正确,从机根据不同的Modbus命令调用相应的处理函数。例如,上位机需要实时数据或故障数据,则将该类数据按Modbus协议格式加上地址码、字节长度和CRC校验码后打包成一帧数据,然后引起发送中断,将该帧数据逐个字节发送,直到全部发送完毕退出中断。发送中断只有在接收正确后回复上位机或上位机读数据时启动,比较简单。下面仅给出接收中断服务程序的部分代码。
interrupt void sciaRxIsr(void)//接收中断服务程序
{ 启动定时器
Uint16 i;
DINT;
if(SciaRegs.SCIRXST.bit.RXERROR == 1)
{ 奇校验出错,SCI软件复位 }
else
{ 接收数据以2字节格式存入缓冲区 }
if(SciA_RxBuf.Ptr==6)
{分写命令和读命令计算接收数据长度以便判别一帧数据是否接收完毕 } if((SciA_RxBuf.Ptr>6)&&(SciA_RxBuf.Ptr== SciA_RxBuf.Len)) //未完继续接收数据
{ 接收完毕,求CRC校验码 }
if(tmp.a == SciA_RxBuf.Data[SciA_RxBuf.Ptr/2-1].a) //CRC校验是否正确
{switch(RxBuf->Data[0].b.wordlo) //正确接收,读命令字
case 0x10: 上位机写数据,先处理数据,后发送正常回复
break;
case 04: 上位机读数据,数据准备、打包后准备发送
break;
default:
SciA_Start_Tx();//SCI开始发送数据
}
else {CRC校验错误,关闭a口发送中断,定时到后准备重新接收 }
EINT;
PieCtrlRegs.PIEACK.bit.ACK9 =1 ;
关定时器
}
3.2 上位机通信模块设计
上位机通讯模块分为三层:物理层,数据链路层和应用层。物理层采用RS485协议进行通信,通信速率为9600bit/s, 8个数据位,1个停止位,奇校验。
数据链路层将来自应用层的数据加上从机地址、命令字和校验位得到一帧数据,发送到串口,同时启动超时检测。若超时到,未收到回复信息或数据,则认为通信出错,进入定时器中断,先将定时器清0,再重发原数据帧。若收到从机传来的一帧数据,比如收到从机传来的60字节的实时数据(一个字节就引起接收事件对上位机效率太低),则引起接收事件,进入接收中断,对其进行CRC校验和进一步校验,若有误则重发命令帧,若正确将该帧数据放到数据交换区。数据链路层的通信流程图如图(2)所示。
应用层分为读取DSP的实时数据和故障数据,向DSP写入清除命令和整定参数。例如,当主机需要读取DSP的实时数据时,将启动定时器。定时器每500ms进入定时中断处理函数,发送一个读实时数据命令,将接收到的数据处理后显示到界面。
4. 结束语
本文讨论了以TMS320F2812为核心的电动轮自卸车控制器与上位PC机间的串口通信设计。介绍了他们之间的硬件连接,重点介绍了从机通信程序和主机通信模块的软件设计。
|