基于AVR處理器at90can128的CAN總線應(yīng)用
a t90can128是一種基于AVR 增強(qiáng)型R ISC結(jié)構(gòu)的低功耗CMOS 8位單片機(jī)。通過執(zhí)行一個單時鐘周期的高效指令, AT90CAN128每MH z能達(dá)1M IPS,這就可讓系統(tǒng)設(shè)計人員將功率損耗與處理速度優(yōu)化。AVR內(nèi)核具有豐富的指令集并帶有32個通用目的工作寄存器。32 個寄存器全都直接連到運(yùn)算邏輯單元( ALU ) , 允許兩個獨立的寄存器在一個時鐘周期執(zhí)行單個指令的方式訪問。其結(jié)果就是, 采用這種結(jié)構(gòu)的速度比常規(guī)的R ISC單片機(jī)快10倍的同時代碼效率更高。它除了擁有一般AVR 處理器的AD 模塊, SPI模塊外, 還集成CAN 控制器, 為搭建基于CAN 通信的系統(tǒng)提供了便利??刂平Y(jié)構(gòu)如圖2所示。
圖2 at90can128的CAN控制結(jié)構(gòu)。
對于復(fù)雜的CAN 通信協(xié)議, 在此不詳述, 以下就at90can128的CAN控制器使用作介紹。
a t90can128的CAN 控制器提供了所有有利于消息管理的硬件, 對于每個要發(fā)送或接收的信息都是通過一個叫做消息對象( message ob ject) 的東西來封裝起來的。在對模塊初始化的時候, 程序會指定哪些消息要發(fā)送, 哪些消息要接收, 只有那些約定好標(biāo)識符的消息才能被正確無誤地交換。另外, 對于接收到的遠(yuǎn)程幀, 控制器會進(jìn)行相應(yīng)的自動回復(fù)。
所以在這種方式下, 相對于最原始的CAN 控制方式, CPU 的負(fù)擔(dān)大大減小了。用戶可以根據(jù)自身要求, 通過對相關(guān)寄存器進(jìn)行配置達(dá)到自己的要求。
而在發(fā)送消息之前, 必須初始化幾個字段:
其中IDT 是標(biāo)識符字段, IDE 是標(biāo)識符擴(kuò)展使能選擇, RTRTAG是遠(yuǎn)程傳輸請求, DLC 是數(shù)據(jù)長度代碼, RBnTAG 是保留字段( n = 0, 1) , MSG 是指向相應(yīng)MOB的CAN 數(shù)據(jù)。當(dāng)MOB 的發(fā)送指令執(zhí)行后, MOB 就會準(zhǔn)備發(fā)送一個數(shù)據(jù)或者是一個遠(yuǎn)程幀。接著, CAN 通道就會掃描各個MOB, 尋找到優(yōu)先級最高的MOB, 將其發(fā)送出去。當(dāng)傳送成功后,MOB 狀態(tài)寄存器CANSTMOB 中的TXOK 位就會置位。而最重要的是, 對于每一次新的數(shù)據(jù)傳輸都必須重新對相關(guān)寄存器初始化, 否則無法正常工作。
接收消息之前所要做的初始化步驟基本相同,只是多了IDMSK 和IDEMSK 標(biāo)識符掩碼的設(shè)置。
以下就給出基于AVR at90can128CAN 總線接口初始化以及發(fā)送、接收功能模塊的關(guān)鍵代碼及注解(見圖3)。
圖3 電梯系統(tǒng)主板與調(diào)試器之間的CAN通信。
CAN 初始化:
CANGCON | = 0X01;
for( i= 0; i 15; i+ + )
{
CANPAGE = i 4; / /將15個MOB 都初始化一次
CANCDMOB = 0;
CANSTMOB= 0;
CAN IDT1= 0;
CAN IDT2= 0;
……
for( j= 0; j 8; j+ + )
CANMSG= 0;
CANBT1= 0X1E; / /設(shè)置CAN 傳輸波特率, 16分頻
CANBT2= 0X40;
CANBT3= 0X49;
評論