新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于CAN的農業灌溉監測系統設計

        基于CAN的農業灌溉監測系統設計

        作者: 時間:2016-12-19 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201612/331330.htm

        2.1CAN總線節點初始化程序

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

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

        #include_SFR_H_

        #include_FUNCS_H_

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

        typedefstruct{

        unsignedintid;/*報文標識符*/

        unsignedcharrtr;/*遠程幀位*/

        unsignedchardlen;/*數據長度*/

        unsignedchardata[8];/*數據*/

        }MSG_STRUCT;/*將CAN協議的幀用C語言的結構表示*/

        voidinit_can(){

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

        /*SJA1000進入復位狀態*/

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

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

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

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

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

        /*初始化總線時序寄存器BTR0*/

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

        /*初始化總線時序寄存器BTR1*/

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

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

        }

        2.2報文發送程序

        發送程序負責節點報文的發送,發送時用戶只需將待發送的數據按特定格式組合成一幀報文,送入SJA1000發送緩存區中,并將SJA1000的命令寄存器發送請求標志位(TR)置位。SJA1000會自動啟動發送過程。但是,在往SJA1000發送緩存區發送報文之前,必須先對發送緩沖器是否釋放進行判斷,只有當發送緩沖器標志(TBS)為“1”時,發送緩沖器才被釋放,可將新報文寫入發送緩存,否則,在發送緩沖器被鎖定時,新報文是不能被寫入發送緩沖器的。發送程序分數據幀和發送遠程幀兩種。遠程幀無數據場。發送程序一般編寫成子程序的形式。報文發送程序如下:

        unsignedcharcan_send(MSG_STRUCTsmsg)

        {unsignedcharv;

        inti;

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

        if(v&0x08)/*判斷是否可以發送數據*/

        {v=smsg.id>>3;/*標識符送識別碼寄存器*/

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

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

        v=smsg.id&7;/*識別碼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報文接收程序

        SJA1000的報文接收是它自身獨立完成的,它接收到的報文經過濾波驗收以后,暫時放在接收緩沖器FIFO當中。在報文進到接收緩沖器之后,狀態寄存器的RBS會被置‘1’,與此同時若中斷使能寄存器的RIE被設為‘1’時,中斷寄存器的RI位也會被置為‘1’,然后SJA1000向CPU提出中斷請求。報文接收可以采取查詢接收方式或者是中斷接收方式。如果對通信的實時性的要求沒有那么強那就可以采取查詢接收方式[9]。報文接收程序如下:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临潭县| 南陵县| 伊川县| 庆城县| 巧家县| 吉水县| 尼木县| 穆棱市| 汨罗市| 德昌县| 丰都县| 玉树县| 呼玛县| 太仆寺旗| 凯里市| 谷城县| 邳州市| 锡林郭勒盟| 新邵县| 寿宁县| 顺平县| 青河县| 乌什县| 普宁市| 柳河县| 庄浪县| 富顺县| 福州市| 伊宁市| 马山县| 张北县| 瑞金市| 碌曲县| 始兴县| 清水县| 平泉县| 绍兴市| 潍坊市| 郸城县| 许昌市| 鹿邑县|