<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM處理器的CAN節(jié)點(diǎn)設(shè)計(jì)

          基于ARM處理器的CAN節(jié)點(diǎn)設(shè)計(jì)

          作者: 時間:2012-03-26 來源:網(wǎng)絡(luò) 收藏

          引言

          本文引用地址:http://www.ex-cimer.com/article/149346.htm

          隨著信息技術(shù)的飛速發(fā)展,在嵌入式系統(tǒng)方面的優(yōu)勢和總線的廣泛應(yīng)用,目前越來越多的內(nèi)部自帶了控制器,極大的方便了開發(fā)人員對總線的開發(fā)。本課題是2104的微CAN總線系統(tǒng)開發(fā),采用CAN總線可以將控制器直接安裝在現(xiàn)場,數(shù)據(jù)經(jīng)處理后發(fā)送到總線上,實(shí)現(xiàn)了信息的全數(shù)字方式傳輸,提高了傳輸?shù)目垢蓴_能力,增加了信息的傳輸量。

          總體方案

          本課題中所的是CAN總線系統(tǒng),系統(tǒng)節(jié)點(diǎn)結(jié)構(gòu)圖如圖1。

          圖1 系統(tǒng)節(jié)點(diǎn)結(jié)構(gòu)圖

          CAN總線系統(tǒng)應(yīng)用要求:CAN總線接口的擴(kuò)展、點(diǎn)對點(diǎn)通信。

          CAN節(jié)點(diǎn)的主要是CAN通信控制器與微之間、CAN總線收發(fā)器與物理總線之間的電路的設(shè)計(jì)。微控制器主要負(fù)責(zé)CAN控制器的初始化,進(jìn)行與CAN控制器的數(shù)據(jù)傳遞,并按照預(yù)定的程序進(jìn)行處理;CAN的通信協(xié)議主要由CAN控制器完成,CAN控制器主要負(fù)責(zé)將數(shù)據(jù)以CAN報文的形式傳遞,并進(jìn)行系統(tǒng)的診斷、測試以及處理CAN總線上的錯誤等;而CAN總線收發(fā)器是CAN控制器和CAN總線之間的接口,完成物理電平的轉(zhuǎn)換,功能是增大通信距離,提高系統(tǒng)的瞬間抗干擾能力,保護(hù)總線,降低射頻干擾(RFI)。

          通常一個完整的CAN節(jié)點(diǎn)應(yīng)該包括三個部分:微控制器、CAN控制器、CAN收發(fā)器。目前廣泛流行的CAN總線器件有兩大類:一類是獨(dú)立的CAN控器,另一類是帶有在片CAN的微控制器。

          CAN節(jié)點(diǎn)硬件電路設(shè)計(jì)

          對于CAN節(jié)點(diǎn)硬件電路的的各接口電路的設(shè)計(jì)有:CAN接口電路、CPU模塊、外圍電路(復(fù)位電路和JATG接口電路)。其中CPU及電源電路如下圖2所示:

          圖2  CPU及電源模塊

          圖2 CPU及電源模塊

          LPC2104要使用兩組電源,I/O供電電源為3.3V應(yīng)用系統(tǒng)。首先,電源DW1將電源整流,經(jīng)過C1、C3濾波,然后通過78M05將電源穩(wěn)壓至5V,再使用LDO芯片(低差壓電源芯片)穩(wěn)壓輸出3.3V及1.8V電壓。LD0芯片采用S-1131B33UC和S-1131B18UC,其特點(diǎn)為輸出電流大、精度高、穩(wěn)定性高、功耗低。

          設(shè)計(jì)中的CPU芯片與控制器SJA1000的配腳圖如圖3所示。

          圖3  模擬總線硬件圖

          圖3 模擬總線硬件圖

          CAN節(jié)點(diǎn)的軟件設(shè)計(jì)

          CAN節(jié)點(diǎn)的軟件設(shè)計(jì)主要包括ARM處理器的編程和SJA1000驅(qū)動程序的設(shè)計(jì)。在硬件電路確定以后,系統(tǒng)控制的主要功能將依賴于軟件來實(shí)現(xiàn)。系統(tǒng)能否正??煽康墓ぷ?,除了硬件的合理設(shè)計(jì)以外,與功能完善的軟件設(shè)計(jì)是分不開的。

          軟件程序流程圖如下圖4所示:

          圖4 主程序流程圖

          配置軟件包使用的GPIO必須在文件config.h中進(jìn)行,其程序清單如列表1所示,其中程序清單(1)設(shè)置地址總線的寬度,只能為8、16、和24三個值之一。清單(2)設(shè)置信號AD0對應(yīng)GPIO,其中0對應(yīng)P0.0,1對應(yīng)P0.1,以此類推。地址/數(shù)據(jù)總線的其它信號以這個信號為基準(zhǔn),順序定義。清單(3)信號ALE對應(yīng)GPIO,其中0對應(yīng)P0.0,1對應(yīng)P0.1,以此類推。清單(4)信號WR對應(yīng)GPIO,其中0對應(yīng)P0.0,1對應(yīng)P0.1,以此類推。

          程序清單列表1 配置總線使用的GPIO

          #define ADDR_N_BIT 16 (1)

          #define AD0_PIN_NUM 8 (2)

          #define ALE_PIN_NUM 0 (3)

          #define WR_PIN_NUM 1 (4)

          #define RD_PIN_NUM 4 (5)

          #include“exbus.h” (6)

          本系統(tǒng)CAN控制器采用SJA1000,SJA1000控制器在微控制器正常通訊前,都必須先在相應(yīng)地址寄存器中加載,確定接收標(biāo)識碼、總線接收波特率以及輸出控制等,這就是CAN控制器的初始化。系統(tǒng)所用的CAN總線控制器SJA1000和CAN2.0A以及CAN2.0B兩個版本的協(xié)議同時兼容。本系統(tǒng)設(shè)計(jì)以CAN2.0A的Basic CAN為協(xié)議標(biāo)準(zhǔn)進(jìn)行設(shè)計(jì)。

          測試之前編寫的程序前首先要確定SJA1000的片選地址,確定與其他外部存儲器無沖突。其次,微處理器對SJA1000的控制訪問是以外部存儲器的方式,來訪問SJA1000的內(nèi)部寄存器,所以應(yīng)該正確定義微處理器訪問SJA1000時,SJA1000內(nèi)部寄存器的訪問地址。

          整個流程進(jìn)行測試之后,SJA1000有8個不同的中斷,這些中斷可使主控制器立即作用在CAN控制器的某些狀態(tài)上。一旦CAN產(chǎn)生中斷,SJA1000就將中斷輸出(管腳16)設(shè)為低電平,直到主控制器通過讀SJA1000的中斷寄存器對中斷采取相應(yīng)措施,在主控制器響應(yīng)后中斷,或接收INFO里有更多有效數(shù)據(jù),SJA1000立刻將中斷輸出再次設(shè)為低電平。采用中斷接收的方式來接收數(shù)據(jù),LPC2104的P0.16設(shè)置為外部中斷INT,整個數(shù)據(jù)接收模塊由數(shù)據(jù)接收函數(shù)void ReceiveData(uint8 *Rt)、中斷處理函數(shù)CANException(void)構(gòu)成。當(dāng)SJA1000接收到CAN總線數(shù)據(jù),通過接收中斷使得LPC2104產(chǎn)生外部中斷INT而使其進(jìn)入中斷處理函數(shù),進(jìn)而對接收到的數(shù)據(jù)進(jìn)行處理。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();