新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用PIC18F458的CAN模塊實現CAN總線通訊

        用PIC18F458的CAN模塊實現CAN總線通訊

        作者: 時間:2016-11-21 來源:網絡 收藏

          CAN(Controller Area Network)即控制器區域網,是一種主要用于各種設備監測及控制的網絡。CAN 具有獨特的設計思想, 良好的功能特征和極高的可靠性,現場抗干擾能力強。其在國內外工業控制領域已經被廣泛應用, 成為最有發展前途的現場總線之一。

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

          美國微芯公司的PIC18F458 單片機集成了CAN 通信接口,執行Bosch 公司的CAN2.0A/B 協議。它能支持CAN1.2、CAN2.0A、CAN2.0B 協議的舊版本和CAN2.0B現行版本。使用PIC18F458 單片機的嵌入式系統, 可以很方便的利用CAN 總線與外界進行數據交換。它的優點是電路接口比較簡單,只需很少的外圍電路就可實現CAN 通信, 受硬件限制比較少;軟件編程容易實現所需功能, 只需對相關寄存器進行正確設置即可。

          1 硬件接口電路

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

          

          2 CAN 控制器的操作

          2.1 初始化CAN 控制

          在使用CAN 之前, 必須對它的一些內部寄存器進行設置, 如CAN 控制寄存器CANCON 、波特率寄存器BRGCONx 的設置以及對郵箱進行初始化。

          波特率寄存器BRGCONx(x=1,2, 3)決定了CAN 控制器的波特率、采樣次數、同步跳轉寬度和重同步方式,對波特率寄存器的配置步驟如下:

          設置CANCON 寄存器中的C A N 操作方式請求位為1xx,即REQOP=1xx;

          判斷CANSTAT 寄存器中的操作方式狀態位是否為100,即OPMODE 是否為100,如OPMODE=100 則進入下一步;

          設置BRGCONx(x=1,2,3)寄存器,即配置正確的波特率, 同步跳轉寬度、采樣次數和重同步方式;

          設置發送郵箱和接收郵箱的標識符、郵箱數據長度、屏蔽寄存器、濾波寄存器以及初始化郵箱的數據區;

          設置CANCON 寄存器中的CAN 操作方式請求位為000,即REQOP=000,使CAN 模塊進入正常工作方式;

          判斷CANSTAT 寄存器中的操作方式狀態位是否為000,即OPMODE 是否為000,如OPMODE=000 則進入下一步;

          寄存器配置和郵箱初始化完成后,進入正常工作方式。

          

          初始化流程圖如圖2 所示。

        2.2 信息的發送

          PIC18F458 有3 個發送郵箱緩沖器,每一個發送緩沖器的數據長度可以設置為1 ~ 8 個字節長度, 信息發送的具體步驟如下:

          ① 初始化發送郵箱;

          ② 設置相應的發送請求位為1 ,即TXBxCON bits.TXREQ=1(x=1,2,3);

          ③ 若CAN 總線允許發送, 則啟動最高優先級信息的發送;

          ④ 若發送成功,則TXREQ 被清零,TXBxIF 被置1,如果中斷被使能, 則會產生中斷;

          ⑤ 若信息發送失敗,則TXREQ 保持為1 ,并置位相應的狀態標志。

          2.3 信息的接收

          PIC18F458 有2 個具有多重接收濾波器的完全接收緩沖器和1 個單獨信息組合的緩沖器。接收郵箱初始化時,要設置其標識符及相關的屏蔽寄存器、接收優先級等。

          MAB 寄存器接收所有來自總線的下一條信息,RXB0 和RXB1 則接收來自協議驅動的完整信息。MAB 接收所有信息, 但是只有滿足過濾條件的信息才被傳送到RXBx 中。

          3 軟件設計

          下面的程序例程實現的是發送緩沖器0 向接收緩沖器0 發送數據的自測試模式, 其中接收采用中斷方式,發送采用查詢方式。該程序實現了PIC18F458 單片機CAN 模塊的最小程序, 經過適當修改即可用于實際工程程序中, 并在實現工程中驗證了它的正確性。

          #include

          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;

          }

          }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 炎陵县| 泗洪县| 闽侯县| 吉木萨尔县| 绿春县| 濮阳县| 河西区| 勐海县| 苍梧县| 三原县| 奈曼旗| 张家港市| 博罗县| 都江堰市| 溧水县| 常山县| 淮安市| 清流县| 苍山县| 东明县| 仪征市| 嘉善县| 杭锦后旗| 荔浦县| 亳州市| 焉耆| 甘德县| 罗江县| 河池市| 商都县| 云龙县| 衡水市| 黄龙县| 进贤县| 剑阁县| 花莲市| 保德县| 宁乡县| 光山县| 瑞丽市| 永平县|