3.3 LonWorks接口卡的軟件設(shè)計(jì)
該接口卡的程序包含兩大部分:一是存儲(chǔ)在CY7C68013中的USB驅(qū)動(dòng)程序和與3150的并口通信程序:二是存儲(chǔ)在3150外部Flash中的并口通信程序以及LonTalk協(xié)議轉(zhuǎn)換程序。USB驅(qū)動(dòng)程序在開(kāi)發(fā)套件CY368 1中已有支持用戶,只要調(diào)用即可。而與31 50的并口通信程序則采用Keil C51語(yǔ)言編寫,并通過(guò)usB口下載到CY7C68013的8051內(nèi)核中。3150外部Flash中的并口通信程序以及LonTalk協(xié)議轉(zhuǎn)換程序采用Neuron C語(yǔ)言編寫,并采用LonWorks開(kāi)發(fā)工具——LonBuilder中的Neuron C編譯器對(duì)程序進(jìn)行編譯,生成ROM映像文件,最后下載到片外Flash中。
在8051的并口通信程序中,需要模擬3150的并口通信從A方式。以下為并口通信程序中主要模塊的C51程序,包括同步模塊(sync—loop());握手模塊(hndshkO);并口數(shù)據(jù)傳送接收模塊(pio read();pio write(void));令牌傳遞模塊(pass token())。
void sync-loop(void)
{unsigned char rb;
do{RW=0;hndshk();PB=CMD RESYNC;CS=0;CS=I;hndshk();
PB=EOM;CS=0;CS=1;hndshk();PB=0xff;RW=I;CS=0;rb=PB;
CS=I;}while(rb!=CMD ACKSYNC);token=MASTER;}
void hndshk(void)
{while((hs=INTO)==1);}
void pio_read(void)
{unsigned char cmd;unsigned char i;
PB=0xff;hndshk();RW=1;cmd=PB;CS=0;CS=1;
if(cmd==CMD—XFER){hndshk();pio.1en=PB;CS=0;CS=1;}
else pio.1en=o=pass—token();}
void pio-write(void)
{unsigned char sd;
hndshk();RW=0;PB=CMD—XFER;CS=0;CS=1;hndshk0;PB=pio.
1en;CS=0;CS=1:
for(sd=0;sd<pio.1en;sd++){hndshk();PB=pio.dat[sd];CS=0;CS=l;}
pass_token();RW=1;}
void pass_token(void)
{ifftoken==MASTER){hndshk();RW=0;PB=EOM;CS=0;CS=1:
token=SLAVE;}
else token=MASTER;}
根據(jù)硬件設(shè)計(jì),將3150芯片的I/O定義為并行(parallel)I/O對(duì)象類型。定義并行I/O對(duì)象的Neuron C源代碼為IO 0 parallel slave P BUS,其中,P BUS為所定義的I/O對(duì)象名稱。Neuron將從并口得到的報(bào)文解析,再利用Neuron C的消息傳送機(jī)制,將解析的消息傳送給適配器下層的應(yīng)用節(jié)點(diǎn)。讀取數(shù)據(jù)的Neuron C函數(shù)為io_in(),其格式如下:io in(P BUS,addressl);
其中,P_BUS為并口IO對(duì)象名稱,addressl為接收并口數(shù)據(jù)的地址。發(fā)消息的Neuron C函數(shù)為msg send()。
值得注意的是,Neuron芯片的應(yīng)用CPU在執(zhí)行該io_in()函數(shù)時(shí)會(huì)處于等待狀態(tài),也就是說(shuō)等待數(shù)據(jù)時(shí)應(yīng)用CPU不能處理其它I/O事件、定時(shí)器終止、網(wǎng)絡(luò)變量更新或報(bào)文到達(dá)事件。如果2 0字符時(shí)間內(nèi)尚沒(méi)有接收到數(shù)據(jù),則可能使Wat Chdog定時(shí)器產(chǎn)生超時(shí)錯(cuò)。在10MHz的輸入時(shí)鐘下,watchdog的超時(shí)時(shí)間是0.84s(該時(shí)間隨輸入時(shí)鐘而改變)。通常情況下,調(diào)度程序(scheduler)會(huì)周期性地對(duì)watchdog定時(shí)器進(jìn)行復(fù)位,但當(dāng)程序處理一個(gè)較長(zhǎng)的任務(wù)(task)如io in()時(shí),則有可能終止watChdog定時(shí)器,這將導(dǎo)致整個(gè)節(jié)點(diǎn)的復(fù)位。為避免產(chǎn)生這種情況,同時(shí)使程序盡可能多地接收到達(dá)的數(shù)據(jù),本節(jié)點(diǎn)程序在接收數(shù)據(jù)這個(gè)任務(wù)中周期性地調(diào)用函數(shù)watchdog update()。
4 結(jié)論
本文所設(shè)計(jì)接口卡的主要目的是為帶有USB接口的便攜設(shè)備進(jìn)行現(xiàn)場(chǎng)數(shù)據(jù)測(cè)量和現(xiàn)場(chǎng)監(jiān)測(cè)提供高速、安全的通信接口。解決了令工程師頭痛的便攜設(shè)備與現(xiàn)場(chǎng)設(shè)備采用通用串口通信時(shí)傳輸速率低、經(jīng)常掉線、連接不可靠的問(wèn)題。





