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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 利用MCP2515的多路CAN總線接口及驅(qū)動程序設(shè)計

          利用MCP2515的多路CAN總線接口及驅(qū)動程序設(shè)計

          作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

          引言

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

          在鐵路系統(tǒng)中,為了保證列車的安全運行,需要對鐵軌及周圍狀況進行實時檢測。目前采用的方法是在鐵路沿線安裝多個檢測設(shè)備,用于檢測洪水、大風(fēng)、泥石流等自然災(zāi)害及軌溫等參數(shù)。這些設(shè)備一般采用的通信方式是RS232、RS485或 CAN,并通過專線連接至監(jiān)控中心的各個監(jiān)控設(shè)備。這種方式極大浪費了線路資源,也不易于設(shè)備的統(tǒng)一管理。因此,需要一種安裝在鐵路沿線的設(shè)備,它將附近的檢測設(shè)備發(fā)送的信息統(tǒng)一收集并通過一條專線直接送往監(jiān)控中心。為了與多個檢測設(shè)備通信,必須同時具有多個RS232、RS485和CAN接口。基于這種應(yīng)用需要,本文提出了擴展多個的方法。

          1 系統(tǒng)結(jié)構(gòu)

          1.1 芯片介紹系統(tǒng)

          采用Atmel公司的AT91RM9200(以下簡稱“9200”)作為MCU。該處理器基于ARM920T內(nèi)核,主頻為180 MHz時,性能可達到200MIPS;最高主頻為209 MHz。該處理器還具有豐富的外設(shè)資源,非常適合工業(yè)控制領(lǐng)域的應(yīng)用[1];采用的操作系統(tǒng)是ARMLinux,內(nèi)核版本為2.4.19。

          目前主流的CAN協(xié)議控制器一般采用I/O總線(SJA1000等)或SPI接口(等)與MCU進行通信。由于本設(shè)計采用PC/104總線擴展卡的方式來擴展多個RS232和RS485接口,沒有多余的I/O片選線可用,因此最終選用9200的SPI接口與進行多路的擴展。

          是Microchip公司推出的具有SPI接口的獨立CAN控制器。它完全支持CAN V2.0B技術(shù)規(guī)范,通信速率最高可達1 Mbps,內(nèi)含3個發(fā)送緩沖器、2個接收緩沖器、6個29位驗收濾波寄存器和2個29位驗收屏蔽寄存器[2];它的SPI接口時鐘頻率最高可達10 MHz,可滿足一個SPI主機接口擴展多路的需要。

          1.2 系統(tǒng)硬件接口

          圖1是9200與MCP2515的接口原理框圖,通過9200的SPI接口,連接了5個MCP2515。由于9200的SPI從設(shè)備片選線數(shù)量有限,故采用片選譯碼方式,NPCS0可作為普通的外部中斷線使用(NPCS0與IRQ5復(fù)用引腳)。由于9200的外部中斷線資源有限,故采用中斷線共享的方式,即分別有兩個MCP2515共享同一中斷線,最后一個MCP2515獨占一條中斷線,以滿足不同通信速率下數(shù)據(jù)處理的需要。

          圖1 AT91RM9200與MCP2515接口原理框圖

          圖2 MCP2515 CAN總線接口電路

          圖2是MCP2515的外圍CAN總線接口框圖,圖中省略了MCP2515和9200的接口部分。由于設(shè)備需要安裝在鐵路沿線,必須具有防雷擊的能力。因此MCP2515與CAN總線收發(fā)器(TJA1050)之間采用高速光耦進行完全的電氣隔離,并且光耦兩端電路的電源也必須用電源隔離模塊隔離開,這樣才能真正起到隔離的作用。在TJA1050的CANH和CANL引腳與地之間連接2個30 pF的電容,可以過濾CAN總線上的高頻干擾;2個二極管可以在總線電壓發(fā)生瞬變干擾時起保護作用。光耦正常工作時輸入電流為10 mA左右,內(nèi)部發(fā)光二極管的正向電壓降為1.7 V左右,因此要特別注意輸入端串聯(lián)電阻的阻值選擇。

          2 SPI主機的工作方式

          9200通過SPI接口與5個MCP2515進行通信,9200的SPI控制器工作在主機模式,MCP2515工作在從機模式。MCP2515 支持多個指令(如復(fù)位指令、讀指令、寫指令等),以便于9200通過SPI接口對MCP2515的內(nèi)部寄存器進行讀/寫操作。9200 SPI控制器作為主機時工作模式流程如圖3所示[1]。

          圖3 AT91RM9200 SPI控制器主機模式流程

          需要注意的是,SPI使能后,只有在SPI_TDR(發(fā)送數(shù)據(jù)寄存器)中有數(shù)據(jù)時,才會根據(jù)片選配置(固定外設(shè)或可變外設(shè))使能相應(yīng)片選;而 SPI_TDR中無數(shù)據(jù)時,則片選自動禁用。因此,9200向MCP2515連續(xù)發(fā)送多個字節(jié)時,要保證在前一個字節(jié)傳輸完畢前,后一個字節(jié)就被寫入到 SPI_TDR中,以避免片選被自動禁用;同時,在傳輸完每一個字節(jié)后,還要讀取SPI_RDR(接收數(shù)據(jù)寄存器)。

          下面以MCP2515的讀指令為例,說明圖4所示的驅(qū)動程序完成一次讀指令操作(只讀一個字節(jié)數(shù)據(jù))的過程,并假設(shè)9200 SPI采用固定外設(shè)的片選配置方式。其他指令的軟件實現(xiàn)流程與讀指令類似。

          圖4 SPI讀指令操作軟件流程

          3 驅(qū)動程序設(shè)計

          驅(qū)動程序是應(yīng)用程序與硬件之間的中間軟件層,它完全隱蔽了設(shè)備工作的細(xì)節(jié)。Linux操作系統(tǒng)根據(jù)設(shè)備中信息傳送方式的不同,將設(shè)備分成3種類型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備[3]。9200與MCP2515的通信都是通過SPI接口以字節(jié)為單位進行的,因此MCP2515屬于字符設(shè)備。由于5 個MCP2515共享9200的一個SPI接口,因此采用一個驅(qū)動程序來管理所有的MCP2515,這樣做有利于對所有設(shè)備進行統(tǒng)一管理。

          3.1 驅(qū)動程序中定義的主要數(shù)據(jù)結(jié)構(gòu)

          CAN總線通信是基于報文幀的,在驅(qū)動程序中,無論發(fā)送數(shù)據(jù)還是接收數(shù)據(jù)都是基于報文幀的操作[4],因此需要設(shè)計合適的數(shù)據(jù)結(jié)構(gòu)以滿足數(shù)據(jù)操作的需要。

          3.1.1接收與發(fā)送CAN報文幀結(jié)構(gòu)體

          typedef struct {

          unsigned char node_num;

          unsigned intid;

          unsigned char dlc;

          unsigned char data[8];

          int ext_flag;

          int rtr_flag;

          } CanFrame;

          其中,node_num為MCP2515的節(jié)點號(0~4),id為CAN報文幀的標(biāo)識符,dlc為數(shù)據(jù)長度(0~8),data為CAN報文幀的數(shù)據(jù)緩沖區(qū),ext_flag用于標(biāo)識CAN報文幀是否為擴展幀,rtr_flag用于標(biāo)識CAN報文幀是否為遠程幀。

          3.1.2 設(shè)備配置結(jié)構(gòu)體

          (1) 波特率和報文濾波配置結(jié)構(gòu)體

          typedef struct{

          unsigned charnode_num;


          上一頁 1 2 3 下一頁

          評論


          相關(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); })();