新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于CAN的農(nóng)業(yè)灌溉監(jiān)測(cè)系統(tǒng)設(shè)計(jì)

基于CAN的農(nóng)業(yè)灌溉監(jiān)測(cè)系統(tǒng)設(shè)計(jì)

作者: 時(shí)間:2016-12-19 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://2s4d.com/article/201612/331330.htm

2.1CAN總線節(jié)點(diǎn)初始化程序

節(jié)點(diǎn)初始化主要指的是在系統(tǒng)上電以后對(duì)89C51以及CAN控制器SJA1000所進(jìn)行初始化,來(lái)保證工作主頻、輸出特性以及波特率等。89C51的初始化能通過(guò)結(jié)合他們的監(jiān)控任務(wù)來(lái)進(jìn)行,主要就是完成對(duì)中斷允許與屏蔽以及定時(shí)器的使用與和設(shè)置等。這里著重來(lái)說(shuō)明SJA1000的初始化,SJA1000內(nèi)部沒(méi)有微處理器,要實(shí)現(xiàn)它的初始化要依靠89C51對(duì)其編程實(shí)現(xiàn)。在復(fù)位模式下才能進(jìn)行SJA1000的初始化,因此在SJA1000初始化程序中第一要把工作方式置換為復(fù)位模式,然后設(shè)置驗(yàn)收濾波方式等。在CAN協(xié)議物理層當(dāng)中的通信波特率的大小以及同步跳轉(zhuǎn)寬度都是由定時(shí)寄存器BTR0和BTR1的程序所決定。著重強(qiáng)調(diào)的是:對(duì)一個(gè)系統(tǒng)當(dāng)中的所有的節(jié)點(diǎn)來(lái)說(shuō),這兩個(gè)寄存器的所有內(nèi)容一定要一樣,不然將沒(méi)有辦法進(jìn)行通信。當(dāng)初始化的設(shè)置完成以后,把復(fù)位請(qǐng)求位置‘0’,SJA1000就能夠進(jìn)入到工作狀態(tài),來(lái)完成正常的通信任務(wù)[8]。初始化程序如下:

#include<80c196kd.h>//包含的控制器寄存器定義

#include_SFR_H_

#include_FUNCS_H_

#defineBASE_CAN0xa000//定義CAN控制器基址

typedefstruct{

unsignedintid;/*報(bào)文標(biāo)識(shí)符*/

unsignedcharrtr;/*遠(yuǎn)程幀位*/

unsignedchardlen;/*數(shù)據(jù)長(zhǎng)度*/

unsignedchardata[8];/*數(shù)據(jù)*/

}MSG_STRUCT;/*將CAN協(xié)議的幀用C語(yǔ)言的結(jié)構(gòu)表示*/

voidinit_can(){

*(unsignedchar*)(BASE_CAN+0)=0x01;

/*SJA1000進(jìn)入復(fù)位狀態(tài)*/

*(unsignedchar*)(BASE_CAN+4)=0x00;

/*初始化接收代碼寄存器ACR*/

*(unsignedchar*)(BASE_CAN+5)=0xff;

/*初始化接收屏蔽寄存器AMR*/

*(unsignedchar*)(BASE_CAN+6)=0x00;

/*初始化總線時(shí)序寄存器BTR0*/

*(unsignedchar*)(BASE_CAN+7)=0x14;

/*初始化總線時(shí)序寄存器BTR1*/

*(unsignedchar*)(BASE_CAN+8)=0xfa;

/*初始化輸出控制寄存器OCR*/

}

2.2報(bào)文發(fā)送程序

發(fā)送程序負(fù)責(zé)節(jié)點(diǎn)報(bào)文的發(fā)送,發(fā)送時(shí)用戶只需將待發(fā)送的數(shù)據(jù)按特定格式組合成一幀報(bào)文,送入SJA1000發(fā)送緩存區(qū)中,并將SJA1000的命令寄存器發(fā)送請(qǐng)求標(biāo)志位(TR)置位。SJA1000會(huì)自動(dòng)啟動(dòng)發(fā)送過(guò)程。但是,在往SJA1000發(fā)送緩存區(qū)發(fā)送報(bào)文之前,必須先對(duì)發(fā)送緩沖器是否釋放進(jìn)行判斷,只有當(dāng)發(fā)送緩沖器標(biāo)志(TBS)為“1”時(shí),發(fā)送緩沖器才被釋放,可將新報(bào)文寫入發(fā)送緩存,否則,在發(fā)送緩沖器被鎖定時(shí),新報(bào)文是不能被寫入發(fā)送緩沖器的。發(fā)送程序分?jǐn)?shù)據(jù)幀和發(fā)送遠(yuǎn)程幀兩種。遠(yuǎn)程幀無(wú)數(shù)據(jù)場(chǎng)。發(fā)送程序一般編寫成子程序的形式。報(bào)文發(fā)送程序如下:

unsignedcharcan_send(MSG_STRUCTsmsg)

{unsignedcharv;

inti;

v=*(unsignedchar*)(BASE_CAN+2);

if(v&0x08)/*判斷是否可以發(fā)送數(shù)據(jù)*/

{v=smsg.id>>3;/*標(biāo)識(shí)符送識(shí)別碼寄存器*/

*(unsignedchar*)(BASE_CAN+10)=v;

v=*(unsignedchar*)(BASE_CAN+10);

v=smsg.id&7;/*識(shí)別碼0-2位、RTR、DLC*/

v<<=5;

v+=smsg.dlen;

*(unsignedchar*)(BASE_CAN+11)=v;

for(i=0;ii

{

*(unsignedchar*)(BASE_CAN+12+i)=smsg.data[i];

}

*(unsignedchar*)(BASE_CAN+1)=0x01;

return(1);

}

else

return(0);

}

2.3報(bào)文接收程序

SJA1000的報(bào)文接收是它自身獨(dú)立完成的,它接收到的報(bào)文經(jīng)過(guò)濾波驗(yàn)收以后,暫時(shí)放在接收緩沖器FIFO當(dāng)中。在報(bào)文進(jìn)到接收緩沖器之后,狀態(tài)寄存器的RBS會(huì)被置‘1’,與此同時(shí)若中斷使能寄存器的RIE被設(shè)為‘1’時(shí),中斷寄存器的RI位也會(huì)被置為‘1’,然后SJA1000向CPU提出中斷請(qǐng)求。報(bào)文接收可以采取查詢接收方式或者是中斷接收方式。如果對(duì)通信的實(shí)時(shí)性的要求沒(méi)有那么強(qiáng)那就可以采取查詢接收方式[9]。報(bào)文接收程序如下:



評(píng)論


技術(shù)專區(qū)

關(guān)閉