1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      用PIC18F458 的CAN 模塊實現(xiàn)CAN 總線通信

      更新時間: 2007-08-23 09:12:45來源: 粵嵌教育瀏覽量:784

        CAN(Controller Area Network)即控制器區(qū)域網(wǎng),是一種主要用于各種設(shè)備監(jiān)測及控制的網(wǎng)絡。CAN 具有獨特的設(shè)計思想, 良好的功能特征和極高的可靠性,現(xiàn)場抗干擾能力強。其在國內(nèi)外工業(yè)控制領(lǐng)域已經(jīng)被廣泛應用, 成為有發(fā)展前途的現(xiàn)場總線之一。
         
        美國微芯公司的PIC18F458 單片機集成了CAN 通信接口,執(zhí)行Bosch 公司的CAN2.0A/B 協(xié)議。它能支持CAN1.2、CAN2.0A、CAN2.0B 協(xié)議的舊版本和CAN2.0B現(xiàn)行版本。使用PIC18F458 單片機的嵌入式系統(tǒng), 可以很方便的利用CAN 總線與外界進行數(shù)據(jù)交換。它的優(yōu)點是電路接口比較簡單,只需很少的外圍電路就可實現(xiàn)CAN 通信, 受硬件限制比較少;軟件編程容易實現(xiàn)所需功能, 只需對相關(guān)寄存器進行正確設(shè)置即可。

        1 硬件接口電路
         
        PIC18F458 與CAN 驅(qū)動芯片PCA82C250T 的接口電路如圖1 所示。PCA82C250T 是驅(qū)動CAN 控制器和物理總線間的接口, 提供對總線的差動發(fā)送和接收功能。電阻R 作為CAN 終端的匹配電阻;電感L 起濾波作用。

        2 CAN 控制器的操作

        2.1 初始化CAN 控制
         
        在使用CAN 之前, 必須對它的一些內(nèi)部寄存器進行設(shè)置, 如CAN 控制寄存器CANCON 、波特率寄存器BRGCONx 的設(shè)置以及對郵箱進行初始化。
         
        波特率寄存器BRGCONx(x=1,2, 3)決定了CAN 控制器的波特率、采樣次數(shù)、同步跳轉(zhuǎn)寬度和重同步方式,對波特率寄存器的配置步驟如下:

        設(shè)置CANCON 寄存器中的C A N 操作方式請求位為1xx,即REQOP=1xx; 
        判斷CANSTAT 寄存器中的操作方式狀態(tài)位是否為100,即OPMODE 是否為100,如OPMODE=100 則進入下一步;
        設(shè)置BRGCONx(x=1,2,3)寄存器,即配置正確的波特率, 同步跳轉(zhuǎn)寬度、采樣次數(shù)和重同步方式;
        設(shè)置發(fā)送郵箱和接收郵箱的標識符、郵箱數(shù)據(jù)長度、屏蔽寄存器、濾波寄存器以及初始化郵箱的數(shù)據(jù)區(qū);
        設(shè)置CANCON 寄存器中的CAN 操作方式請求位為000,即REQOP=000,使CAN 模塊進入正常工作方式;
        判斷CANSTAT 寄存器中的操作方式狀態(tài)位是否為000,即OPMODE 是否為000,如OPMODE=000 則進入下一步;
        寄存器配置和郵箱初始化完成后,進入正常工作方式。
        初始化流程圖如圖2 所示。

        2.2 信息的發(fā)送
         
        PIC18F458 有3 個發(fā)送郵箱緩沖器,每一個發(fā)送緩沖器的數(shù)據(jù)長度可以設(shè)置為1 ~ 8 個字節(jié)長度, 信息發(fā)送的具體步驟如下:
       ?、?初始化發(fā)送郵箱;
       ?、?設(shè)置相應的發(fā)送請求位為1 ,即TXBxCON bits.TXREQ=1(x=1,2,3);
        ③ 若CAN 總線允許發(fā)送, 則啟動優(yōu)先級信息的發(fā)送;
       ?、?若發(fā)送成功,則TXREQ 被清零,TXBxIF 被置1,如果中斷被使能, 則會產(chǎn)生中斷;
        ⑤ 若信息發(fā)送失敗,則TXREQ 保持為1 ,并置位相應的狀態(tài)標志。

        2.3 信息的接收
         
        PIC18F458 有2 個具有多重接收濾波器的完全接收緩沖器和1 個單獨信息組合的緩沖器。接收郵箱初始化時,要設(shè)置其標識符及相關(guān)的屏蔽寄存器、接收優(yōu)先級等。
         
        MAB 寄存器接收所有來自總線的下一條信息,RXB0 和RXB1 則接收來自協(xié)議驅(qū)動的完整信息。MAB 接收所有信息, 但是只有滿足過濾條件的信息才被傳送到RXBx 中。

        3 軟件設(shè)計
         
        下面的程序例程實現(xiàn)的是發(fā)送緩沖器0 向接收緩沖器0 發(fā)送數(shù)據(jù)的自測試模式, 其中接收采用中斷方式,發(fā)送采用查詢方式。該程序?qū)崿F(xiàn)了PIC18F458 單片機CAN 模塊的小程序, 經(jīng)過適當修改即可用于實際工程程序中, 并在實現(xiàn)工程中驗證了它的正確性。

        #include <p18f458.h>
        int CAN_FLAG;
        voidinitcan(){
        TRISB=(TRISB|0X08)&0XFB;
        CANCON=0X80;
        while(CANSTAT&0X80==0)continue;
        BRGCON1=0X01;
        BRGCON2=0X90;
        BRGCON3=0X42;
        TXB0CON=0X03;
        TXB0SIDH=0XFF;
        TXB0SIDL=0XE0;
        TXB0DLC=0X08;
        TXB0D0=0X00;
        TXB0D1=0X01;
        TXB0D2=0X02;
        TXB0D3=0X03;
        TXB0D4=0X04;
        TXB0D5=0X05;
        TXB0D6=0X06;
        TXB0D7=0X07;
        RXB0SIDH=0XFF;
        RXB0SIDL=0XE0;
        RXB0CON=0X20;
        RXB0DLC=0X08;
        RXB0D0=0X00;
        RXB0D1=0X00;
        RXB0D2=0X00;
        RXB0D3=0X00;
        RXB0D4=0X00;
        RXB0D5=0X00;
        RXB0D6=0X00;
        RXB0D7=0X00;
        RXF0SIDH=0XFF;
        RXF0SIDL=0XE0;
        RXM0SIDH=0X00;
        RXM0SIDL=0X00;
        CANCON=0X40;
        while(CANSTAT&0X40==0)continue;
        PIR3=0X00;
        PIE3=0X01;
        IPR3=0X01;
        }
        #pragma interrupt can_isr
        #pragma code low_ISR=0x18
        void low_ISR() {
        _asm
        gotocan_isr
        _endasm
        }
        #pragma code
        voidcan_isr() {
        if(PIR3bits.RXB0IF==1)CAN_FLAG=1;
        PIR3bits.RXB0IF=0;
        RXB0CONbits.RXFUL=0;
        }
        main(){
        INTCON=0x00;
        initcan();
        W D T C O N = 0 ;
        INTCON=0xc0;
        while(1) {
        TXB0CONbits.TXREQ=1;
        while(PIR3bits.TXB0IF!=1)continue;
        while(CAN_FLAG==0)continue;
        CAN_FLAG=0;
        TXB0CONbits.TXREQ=0;
        TXB0D0=RXB0D0+1;
        TXB0D1=RXB0D1+1;
        TXB0D2=RXB0D2+1;
        TXB0D3=RXB0D3+1;
        TXB0D4=RXB0D4+1;
        TXB0D5=RXB0D5+1;
        TXB0D6=RXB0D6+1;
        TXB0D7=RXB0D7+1;
        }
        }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 一级a国产a国产片 | 日本丰满的少妇中文字幕 | 亚洲国产91在线精品国自产拍 | 中文字幕永久一区二区三区 | 午夜性爱视频免费在线观看 | 欧美亚洲色综久久精品国产 |