【摘要】為了將MT6056i觸摸屏作為TMS320F2812數(shù)字系統(tǒng)的人機(jī)界面,提出了溝通兩者信息交換的通信設(shè)計(jì)方案。此設(shè)計(jì)根據(jù)各設(shè)備的功能特點(diǎn),采用MAX3232芯片構(gòu)成硬件的通信接口,觸摸屏主動(dòng)按批發(fā)送、運(yùn)用F2812中SCI增強(qiáng)功能FIFO使F2812的CPU按批進(jìn)行通信數(shù)據(jù)接收和發(fā)送、最后觸摸屏按批接收的數(shù)據(jù)傳送流程實(shí)現(xiàn)了兩設(shè)備的通信。設(shè)計(jì)方案給出了F2812和MT6056i的基本設(shè)置、程序及數(shù)據(jù)回送通信的調(diào)試方法。該方案可有效解決F2812與觸摸屏之間的通信問(wèn)題,成功地使之作為F2812數(shù)字系統(tǒng)的人機(jī)界面。
【關(guān)鍵詞 】F2812;觸摸屏;通信;先進(jìn)先出;宏指令
1.引言
DSP強(qiáng)大的運(yùn)算功能 、快捷的處理速度使之成為許多系統(tǒng)的控制核心,如若配以觸摸屏作為其人機(jī)界面,不但操作顯示性則能大幅度提高,而且還有趨勢(shì)線、數(shù)據(jù)報(bào)表、監(jiān)控、報(bào)警等多種功能,使系統(tǒng)進(jìn)一步趨于完美。
由于目前工業(yè)用觸摸屏主要是作為PLC控制系統(tǒng)的人機(jī)界面,不能直接與DSP配套使用,其關(guān)鍵問(wèn)題是兩者無(wú)法進(jìn)行通信。本文根據(jù)文獻(xiàn)[1]所述系統(tǒng)通信部分的設(shè)計(jì)和調(diào)試經(jīng)驗(yàn),介紹TMS320F2812(文中簡(jiǎn)稱F2812)DSP與威綸通科技有限公司MT6056i觸摸屏(文中簡(jiǎn)稱MT6056i)的通信設(shè)計(jì)和調(diào)試的具體方法。
2.F2812與MT6056i的硬件連接
觸摸屏一般通過(guò)串行通信接口RS-232與其它設(shè)備進(jìn)行通信,F(xiàn)2812外設(shè)串行通信接口SCIA需通過(guò)接口轉(zhuǎn)換電路才能與觸摸屏RS-232接口相連[1] ,見(jiàn)圖1。MAX3232芯片中11端、12端分別與F2812的SCITXDA/GPIOF4端、SCIRXDA/GPIOF5端相連。J1插座中的1端、2端與3端分別與9 針RS232通信接口的5端、2端與3端相連。
圖1 通信接口電路
3.通信原理
MT6056i與F2812之間采用主從通信方式,觸摸屏為主設(shè)備,F(xiàn)2812為從設(shè)備。一次通信中,MT6056i發(fā)送請(qǐng)求幀,F(xiàn)2812收到后發(fā)送響應(yīng)幀。
F2812方面,啟用SCI的FIFO功能。當(dāng)一幀N(通信幀長(zhǎng)度,1~16,初始化時(shí)設(shè)定,文中取N=12)個(gè)字節(jié)全部進(jìn)入FIFO接收寄存器組,在CPU查詢時(shí)刻(若N個(gè)字節(jié)已全部到位)或在接收中斷時(shí)刻,即將其一起轉(zhuǎn)出,經(jīng)校驗(yàn)無(wú)誤后,存入一數(shù)組,按協(xié)議規(guī)則將其有用信息提取、變換,并根據(jù)其中的信息進(jìn)行相應(yīng)操作。之后,將要顯示的信息按協(xié)議規(guī)則存入另一數(shù)組,經(jīng)處理后送入FIFO發(fā)送寄存器組,由SCIA串行通信接口一批逐字節(jié)發(fā)出。
觸摸屏RS-232接口接收該通信幀后,觸摸屏內(nèi)CPU將其整合為界面上可接受的數(shù)據(jù)格式,在人機(jī)界面相應(yīng)位置上顯示出來(lái),一次通信結(jié)束。
每間隔一定時(shí)間,重復(fù)上述過(guò)程,就可連續(xù)進(jìn)行F2812與MT6056i之間的信息交換,實(shí)現(xiàn)觸摸屏對(duì)F2812數(shù)字系統(tǒng)的動(dòng)態(tài)監(jiān)控。
4.F2812主要通信設(shè)置及程序
F2812用C語(yǔ)言在CCS3.3中進(jìn)行編程和調(diào)試。以下為F2812通信的初始化函數(shù),“//”后為前一句語(yǔ)句的簡(jiǎn)要說(shuō)明。其主要功能是根據(jù)通信要求為通信控制寄存器(SCICCR),控制寄存器1(SCICTL1)、控制寄存器2(SCICTL2),波特率寄存器(SCIHBAUD和SCILBAUD),F(xiàn)IFO發(fā)送寄存器(SCIFFTX)、FIFO接收寄存器(SCIFFRX),F(xiàn)IFO控制寄存器(SCIFFCT)設(shè)置參數(shù)[2-3]?;就ㄐ艆?shù)為波特率19200bps,每個(gè)字符幀10位:1位起始位、8位數(shù)據(jù)位、無(wú)校驗(yàn)位、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;
//禁止回送測(cè)試
SciaRegs.SCICCR.bit.PARITYENA=0;
//禁止奇偶校驗(yàn)
SciaRegs.SCICCR.bit.STOPBITS=0;
//一個(gè)停止位
SciaRegs.SCICTL1.bit.all=0x0003;
SciaRegs.SCICTL1.bit.RXENA=1;
//使能接收
SciaRegs.SCICTL1.bit.TXENA=1;
//使能發(fā)送
SciaRegs.SCICTL1.bit.SLEEP=0;
//禁止睡眠
SciaRegs.SCICTL1.bit.TXWAKE=0;
//非多處理器模式
SciaRegs.SCICTL1.bit.SWRESET=0;
//SCI軟件復(fù)位
SciaRegs.SCICTL1.bit.RXERRINTENA=0;
//禁止接收錯(cuò)誤中斷
SciaRegs.SCICTL2.bit.TXINTENA =0;
//禁止發(fā)送中斷
SciaRegs.SCICTL2.bit.RXBKINTENA =0;
//使能RXRDY/BRKDY中斷
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =0x00f3;
//低速外設(shè)時(shí)鐘為37.5 MHz時(shí),波特率為19200bps
SciaRegs.SCIFFTX.bit.TXFFILIL=0;
//發(fā)送中斷級(jí)位為0
SciaRegs.SCIFFTX.bit.TXFFIENA=0;
//禁止發(fā)送FIFO匹配中斷
SciaRegs.SCIFFTX.bit.TXINTCLR=0;
//不影響TXFFINT標(biāo)志位
SciaRegs.SCIFFTX.bit.TXFFINT=0;
//保留發(fā)送中斷標(biāo)志位默認(rèn)值
SciaRegs.SCIFFTX.bit.TXFFST=0;
//保留發(fā)送狀態(tài)位初始值SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0;
//發(fā)送復(fù)位且發(fā)送FIFO指針為0
SciaRegs.SCIFFTX.bit.SCIFFENA=1;
//使能FIFO功能
SciaRegs.SCIFFTX.bit.SCIRST=1;
//FIFO重新開(kāi)始發(fā)送或接收
SciaRegs.SCIFFRX.bit.RXFFIL=12;
//接收中斷級(jí)位為12,為N。
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
//使能接收匹配中斷
SciaRegs.SCIFFRX.bit.RXFFINTCLR=0;
//不影響RXFFINT標(biāo)志位
SciaRegs.SCIFFRX.bit.RXFFINT=0;
//保留接收中斷標(biāo)志位默認(rèn)值
SciaRegs.SCIFFRX.bit.RXFIFST=0;
//保留接收狀態(tài)位初始值
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
// 接收復(fù)位且接收FIFO指針為0
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=0;
// 不影響接收FIFO溢出標(biāo)志位
SciaRegs.SCIFFRX.bit.RXFFOVF=0;
//保留接收FIFO溢出標(biāo)志位的默認(rèn)值
SciaRegs.SCIFFCT.all=0x00;
//FIFO控制寄存器配置成默認(rèn)狀態(tài)
SciaRegs.SCICTL1.bit.SWRESET=1;
// 重新使能SCI
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
//重新使能FIFO接收
}
上述函數(shù)嵌入原系統(tǒng)main函數(shù)的初始化程序段。原main函數(shù)前要添加對(duì)應(yīng)串口通信的頭文件。實(shí)時(shí)通信相應(yīng)語(yǔ)句嵌入for循環(huán)或中斷循環(huán)結(jié)構(gòu)內(nèi),以便進(jìn)行動(dòng)態(tài)監(jiān)控,如:
…
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
Uint16 dataA[12];
/定義數(shù)組,通信接收時(shí)用。
Uint16 dataB[12];
//定義數(shù)組,通信發(fā)送時(shí)用。
…
//定義其它變量。
void main(void)
{
Uint16 i;
…
EALLOW;
//允許寫(xiě)入受保護(hù)的寄存器。
GpioMuxRegs.GPFMUX.all=0x0030;
//將GPIOF4端設(shè)置為SCITXDA端、GPIOF5端設(shè)置為SCIRXDA端 。
EDIS;
//禁止寫(xiě)入受保護(hù)的寄存器。
scia_fifo_init();
//SCIA初始化。
for(;;)
{
…//其它程序段
if(SciaRegs.SCIFFRX.bit.RXFFINT==1)
//說(shuō)明FIFO中已有12字節(jié)
{
for(i=0;i<12;i++)
{ dataA[i]=SciaRegs.SCIRXBUF.all;}
//將接收FIFO中的數(shù)據(jù)放入數(shù)組dataA
…//命令處理程序
for(i=0; i< 12; i++)
{SciaRegs.SCITXBUF=dataB[i]&0x00FF;}
//將數(shù)組dataB的數(shù)據(jù)放入發(fā)送FIFO中
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
//清除中斷標(biāo)志RXFFINT
}
…// 其它程序段
}
}
收、發(fā)語(yǔ)句之間命令處理程序的作用是根據(jù)協(xié)議約定將dataA數(shù)組中的信息進(jìn)行處理,并將將要在屏幕上顯示內(nèi)容的有關(guān)信息放入dataB數(shù)組。
5.通信調(diào)試
觸摸屏與F2812能否通信,可采用數(shù)據(jù)回送方法進(jìn)行試驗(yàn)。F2812方面的設(shè)置和編程見(jiàn)第4節(jié)所述,并循環(huán)體中加入語(yǔ)句,使數(shù)組dataB = 數(shù)組dataA。
另外,在EB8000觸摸屏編程軟件中,在系統(tǒng)參數(shù)→設(shè)備列表中新增一個(gè)的設(shè)備,這個(gè)“PLC”(選中)的名稱為“MODBUS RTU Device”,所在位置選為“本機(jī)”,類型設(shè)置選為“Free Protocol”,接口類型為RS232[4],通信口設(shè)置為“COM1,19200,8,N,1”。設(shè)計(jì)圖2所示觸摸屏界面,界面上有4(可根據(jù)需要確定,但要不能大于N/2)個(gè)數(shù)值輸入元件NE_0~NE_3和4個(gè)數(shù)值顯示元件ND_0~ND_3。設(shè)置NE_0~NE_3對(duì)應(yīng)界面變量LW0~LW3,ND_0~ND_3對(duì)應(yīng)界面變量LW10~LW13。變量顯示格式均為16位16進(jìn)制數(shù)。配上以下觸摸屏宏指令程序:
macro_command main()
short aaaa[6],bbbb[6], return_value
char command[12],response[13]
FILL(command[0], 0, 12) //將數(shù)組12個(gè)元素置“0”
FILL(response[0], 0, 13)
while 1
GetData(aaaa[0], "Local HMI", LW,0, 4)
//將界面上LW0起的4個(gè)數(shù)據(jù)(字)送入aaaa[0]為首的4個(gè)字變量
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個(gè)字變量中數(shù)據(jù)送入界面上LW0起的4個(gè)字
end if
DELAY(1)
圖2 觸摸屏通信調(diào)試界面
系統(tǒng)試運(yùn)行,如在輸入數(shù)字框鍵入一16進(jìn)制數(shù),輸出數(shù)字框也會(huì)顯示相應(yīng)的數(shù)值,說(shuō)明通信暢通。之后,就可把F2812中的數(shù)組dataB與數(shù)組dataA的聯(lián)系斷開(kāi),將dataA的數(shù)據(jù)進(jìn)一步處理;把F2812中要顯示的數(shù)據(jù)送入dataB。另外觸摸屏的界面和宏指令程序也要改變以滿足實(shí)際系統(tǒng)需要。
6.結(jié)語(yǔ)
實(shí)踐證明,加接串行通信轉(zhuǎn)換接口,運(yùn)用F2812串行通信接口的FIFO功能,結(jié)合MT6056i宏指令編程可有效解決F2812與MT6056i之間的通信問(wèn)題。盡管此設(shè)計(jì)是針對(duì)F2812與MT6056i的,但也可供F28xx系列DSP與WEINVIEW其它系列觸摸屏的配套使用提供參考。
參考文獻(xiàn)
[1]馮惕,淮文軍.基于F2812與觸摸屏通信的雙電機(jī)變頻器設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2013,21(5):1310-1313.
[2]劉和平,鄧力,江渝等.數(shù)字信號(hào)處理器原理、結(jié)構(gòu)及應(yīng)用基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2007.
[3]蘇奎峰,呂強(qiáng),耿慶鋒等.TMS320X281xDSP 原理及C程序開(kāi)發(fā)[M].北京:北京航空航天大學(xué)出版社,2008.
[4]EB8000觸摸屏操作手冊(cè)[Z].
作者簡(jiǎn)介:馮惕(1958—),男,江蘇蘇州人,碩士,副教授,高級(jí)工程師,現(xiàn)供職于蘇州職業(yè)大學(xué)電子信息工程學(xué)院,研究方向:滿意優(yōu)化控制,電機(jī)的變頻控制,數(shù)據(jù)通信等。