【摘要】为了将MT6056i触摸屏作为TMS320F2812数字系统的人机界面,提出了沟通两者信息交换的通信设计方案。此设计根据各设备的功能特点,采用MAX3232芯片构成硬件的通信接口,触摸屏主动按批发送、运用F2812中SCI增强功能FIFO使F2812的CPU按批进行通信数据接收和发送、最后触摸屏按批接收的数据传送流程实现了两设备的通信。设计方案给出了F2812和MT6056i的基本设置、程序及数据回送通信的调试方法。该方案可有效解决F2812与触摸屏之间的通信问题,成功地使之作为F2812数字系统的人机界面。
【关键词 】F2812;触摸屏;通信;先进先出;宏指令
1.引言
DSP强大的运算功能 、快捷的处理速度使之成为许多系统的控制核心,如若配以触摸屏作为其人机界面,不但操作显示性则能大幅度提高,而且还有趋势线、数据报表、监控、报警等多种功能,使系统进一步趋于完美。
由于目前工业用触摸屏主要是作为PLC控制系统的人机界面,不能直接与DSP配套使用,其关键问题是两者无法进行通信。本文根据文献[1]所述系统通信部分的设计和调试经验,介绍TMS320F2812(文中简称F2812)DSP与威纶通科技有限公司MT6056i触摸屏(文中简称MT6056i)的通信设计和调试的具体方法。
2.F2812与MT6056i的硬件连接
触摸屏一般通过串行通信接口RS-232与其它设备进行通信,F2812外设串行通信接口SCIA需通过接口转换电路才能与触摸屏RS-232接口相连[1] ,见图1。MAX3232芯片中11端、12端分别与F2812的SCITXDA/GPIOF4端、SCIRXDA/GPIOF5端相连。J1插座中的1端、2端与3端分别与9 针RS232通信接口的5端、2端与3端相连。
图1 通信接口电路
3.通信原理
MT6056i与F2812之间采用主从通信方式,触摸屏为主设备,F2812为从设备。一次通信中,MT6056i发送请求帧,F2812收到后发送响应帧。
F2812方面,启用SCI的FIFO功能。当一帧N(通信帧长度,1~16,初始化时设定,文中取N=12)个字节全部进入FIFO接收寄存器组,在CPU查询时刻(若N个字节已全部到位)或在接收中断时刻,即将其一起转出,经校验无误后,存入一数组,按协议规则将其有用信息提取、变换,并根据其中的信息进行相应操作。之后,将要显示的信息按协议规则存入另一数组,经处理后送入FIFO发送寄存器组,由SCIA串行通信接口一批逐字节发出。
触摸屏RS-232接口接收该通信帧后,触摸屏内CPU将其整合为界面上可接受的数据格式,在人机界面相应位置上显示出来,一次通信结束。
每间隔一定时间,重复上述过程,就可连续进行F2812与MT6056i之间的信息交换,实现触摸屏对F2812数字系统的动态监控。
4.F2812主要通信设置及程序
F2812用C语言在CCS3.3中进行编程和调试。以下为F2812通信的初始化函数,“//”后为前一句语句的简要说明。其主要功能是根据通信要求为通信控制寄存器(SCICCR),控制寄存器1(SCICTL1)、控制寄存器2(SCICTL2),波特率寄存器(SCIHBAUD和SCILBAUD),FIFO发送寄存器(SCIFFTX)、FIFO接收寄存器(SCIFFRX),FIFO控制寄存器(SCIFFCT)设置参数[2-3]。基本通信参数为波特率19200bps,每个字符帧10位:1位起始位、8位数据位、无校验位、1位停止位。
void scia_fifo_init()
{
SciaRegs.SCICCR.all=0x0007;
SciaRegs.SCICCR.bit.SCICHAR=7;
//8位字符
SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;
//空闲线模式
SciaRegs.SCICCR.bit.LOOPBKENA=0;
//禁止回送测试
SciaRegs.SCICCR.bit.PARITYENA=0;
//禁止奇偶校验
SciaRegs.SCICCR.bit.STOPBITS=0;
//一个停止位
SciaRegs.SCICTL1.bit.all=0x0003;
SciaRegs.SCICTL1.bit.RXENA=1;
//使能接收
SciaRegs.SCICTL1.bit.TXENA=1;
//使能发送
SciaRegs.SCICTL1.bit.SLEEP=0;
//禁止睡眠
SciaRegs.SCICTL1.bit.TXWAKE=0;
//非多处理器模式
SciaRegs.SCICTL1.bit.SWRESET=0;
//SCI软件复位
SciaRegs.SCICTL1.bit.RXERRINTENA=0;
//禁止接收錯误中断
SciaRegs.SCICTL2.bit.TXINTENA =0;
//禁止发送中断
SciaRegs.SCICTL2.bit.RXBKINTENA =0;
//使能RXRDY/BRKDY中断
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =0x00f3;
//低速外设时钟为37.5 MHz时,波特率为19200bps
SciaRegs.SCIFFTX.bit.TXFFILIL=0;
//发送中断级位为0
SciaRegs.SCIFFTX.bit.TXFFIENA=0;
//禁止发送FIFO匹配中断
SciaRegs.SCIFFTX.bit.TXINTCLR=0;
//不影响TXFFINT标志位
SciaRegs.SCIFFTX.bit.TXFFINT=0;
//保留發送中断标志位默认值
SciaRegs.SCIFFTX.bit.TXFFST=0;
//保留发送状态位初始值SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0;
//发送复位且发送FIFO指针为0
SciaRegs.SCIFFTX.bit.SCIFFENA=1;
//使能FIFO功能
SciaRegs.SCIFFTX.bit.SCIRST=1;
//FIFO重新开始发送或接收
SciaRegs.SCIFFRX.bit.RXFFIL=12;
//接收中断级位为12,为N。
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
//使能接收匹配中断
SciaRegs.SCIFFRX.bit.RXFFINTCLR=0;
//不影响RXFFINT标志位
SciaRegs.SCIFFRX.bit.RXFFINT=0;
//保留接收中断标志位默认值
SciaRegs.SCIFFRX.bit.RXFIFST=0;
//保留接收状态位初始值
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
// 接收复位且接收FIFO指针为0
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=0;
// 不影响接收FIFO溢出标志位
SciaRegs.SCIFFRX.bit.RXFFOVF=0;
//保留接收FIFO溢出标志位的默认值
SciaRegs.SCIFFCT.all=0x00;
//FIFO控制寄存器配置成默认状态
SciaRegs.SCICTL1.bit.SWRESET=1;
// 重新使能SCI
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
//重新使能FIFO接收
}
上述函数嵌入原系统main函数的初始化程序段。原main函数前要添加对应串口通信的头文件。实时通信相应语句嵌入for循环或中断循环结构内,以便进行动态监控,如:
…
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
Uint16 dataA[12];
/定义数组,通信接收时用。
Uint16 dataB[12];
//定义数组,通信发送时用。
…
//定义其它变量。
void main(void)
{
Uint16 i;
…
EALLOW;
//允许写入受保护的寄存器。
GpioMuxRegs.GPFMUX.all=0x0030;
//将GPIOF4端设置为SCITXDA端、GPIOF5端设置为SCIRXDA端 。
EDIS;
//禁止写入受保护的寄存器。
scia_fifo_init();
//SCIA初始化。
for(;;)
{
…//其它程序段
if(SciaRegs.SCIFFRX.bit.RXFFINT==1)
//说明FIFO中已有12字节
{
for(i=0;i<12;i++)
{ dataA[i]=SciaRegs.SCIRXBUF.all;}
//将接收FIFO中的数据放入数组dataA
…//命令处理程序
for(i=0; i< 12; i++)
{SciaRegs.SCITXBUF=dataB[i]&0x00FF;}
//将数组dataB的数据放入发送FIFO中
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
//清除中断标志RXFFINT
}
…// 其它程序段
}
}
收、发语句之间命令处理程序的作用是根据协议约定将dataA数组中的信息进行处理,并将将要在屏幕上显示内容的有关信息放入dataB数组。
5.通信调试
触摸屏与F2812能否通信,可采用数据回送方法进行试验。F2812方面的设置和编程见第4节所述,并循环体中加入语句,使数组dataB = 数组dataA。
另外,在EB8000触摸屏编程软件中,在系统参数→设备列表中新增一个的设备,这个“PLC”(选中)的名称为“MODBUS RTU Device”,所在位置选为“本机”,类型设置选为“Free Protocol”,接口类型为RS232[4],通信口设置为“COM1,19200,8,N,1”。设计图2所示触摸屏界面,界面上有4(可根据需要确定,但要不能大于N/2)个数值输入元件NE_0~NE_3和4个数值显示元件ND_0~ND_3。设置NE_0~NE_3对应界面变量LW0~LW3,ND_0~ND_3对应界面变量LW10~LW13。变量显示格式均为16位16进制数。配上以下触摸屏宏指令程序:
macro_command main()
short aaaa[6],bbbb[6], return_value
char command[12],response[13]
FILL(command[0], 0, 12) //将数组12个元素置“0”
FILL(response[0], 0, 13)
while 1
GetData(aaaa[0], "Local HMI", LW,0, 4)
//将界面上LW0起的4个数据(字)送入aaaa[0]为首的4个字变量
HIBYTE( aaaa[0],command[0])
LOBYTE( aaaa[0],command[1])
…
HIBYTE( aaaa[3],command[6])
LOBYTE( aaaa[3],command[7])
OUTPORT(command[0],"MODBUS RTU Device",12) INPORT(response[0],"MODBUS RTU Device",13, return_value)
if (return_value > 0) then
read_data[0] = response[1]
read_data[0]=read_data[0]+(response[0] << 8)
…
read_data[3] = response[7]
read_data[3]=read_data[3]+(response[6] << 8)
SetData(read_data[0], "Local HMI", LW, 10, 4) //将aaaa[0]为首的4个字变量中数据送入界面上LW0起的4个字
end if
DELAY(1)
图2 触摸屏通信调试界面
系统试运行,如在输入数字框键入一16进制数,输出数字框也会显示相应的数值,说明通信畅通。之后,就可把F2812中的数组dataB与数组dataA的联系断开,将dataA的数据进一步处理;把F2812中要显示的数据送入dataB。另外触摸屏的界面和宏指令程序也要改变以满足实际系统需要。
6.结语
实践证明,加接串行通信转换接口,运用F2812串行通信接口的FIFO功能,结合MT6056i宏指令编程可有效解决F2812与MT6056i之间的通信问题。尽管此设计是针对F2812与MT6056i的,但也可供F28xx系列DSP与WEINVIEW其它系列触摸屏的配套使用提供参考。
参考文献
[1]冯惕,淮文军.基于F2812與触摸屏通信的双电机变频器设计[J].计算机测量与控制,2013,21(5):1310-1313.
[2]刘和平,邓力,江渝等.数字信号处理器原理、结构及应用基础[M].北京:机械工业出版社,2007.
[3]苏奎峰,吕强,耿庆锋等.TMS320X281xDSP 原理及C程序开发[M].北京:北京航空航天大学出版社,2008.
[4]EB8000触摸屏操作手册[Z].
作者简介:冯惕(1958—),男,江苏苏州人,硕士,副教授,高级工程师,现供职于苏州职业大学电子信息工程学院,研究方向:满意优化控制,电机的变频控制,数据通信等。