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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一種基于ARM920T的現(xiàn)場(chǎng)總線控制系統(tǒng)

          一種基于ARM920T的現(xiàn)場(chǎng)總線控制系統(tǒng)

          作者: 時(shí)間:2014-01-17 來源:網(wǎng)絡(luò) 收藏

            3.2.1 IO接口連接

            微處理器的通用IO口可以提供一個(gè)簡便的方法來控制SJA100T。EP9315的GPIO信號(hào)提供了很大的靈活度來滿足SJA1000T時(shí)間上的要求。將SJA1000T數(shù)據(jù)地址復(fù)用總線全部與EP9315的通用IO接口連接。其它信號(hào)線WR、RD、ALE……也與IO接口連接。具體連接方式參考圖2。

            22.jpg

            3.2.2 數(shù)據(jù)信號(hào)線連接

            除了全部由IO端口來控制CAN模塊,還可利用ARM9的數(shù)據(jù)線和信號(hào)線來實(shí)現(xiàn)CAN模塊的擴(kuò)展。連接電路如圖3所示,凡SJA1000T以外的信號(hào)均為EP9315芯片上的信號(hào)管腳,SJA1000T數(shù)據(jù)地址復(fù)用總線與EP9315數(shù)據(jù)線相連,GPIOx、GPIOy、GPIOz可以是EP9315任意GPIO引腳,但選擇同一個(gè)通道的GPIO口將使編程更容易。注意SJA100T的INT可以連接CPU的INT也可以連接到帶有中斷的通用IO上。在EP9315中,GPIO的通道A,B,F(xiàn)有中斷功能。

            33.jpg

            圖2和圖3是示意圖,具體的由于EP9315信號(hào)高電平為3.3V,而SJA1000T高電平為5V,故需要通過74LVC245這類電平匹配芯片進(jìn)行電平匹配后再連接。

            4、驅(qū)動(dòng)開發(fā)

            由于在許多場(chǎng)合具有實(shí)時(shí)性的要求,本采用實(shí)時(shí)性高的eCos作為操作系統(tǒng),CAN驅(qū)動(dòng)程序也在eCos操作系統(tǒng) 上進(jìn)行擴(kuò)展。

            對(duì)eCos系統(tǒng)的設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)主要圍繞著DEVTAB_ENTRY和DEVIO_TAB進(jìn)行,添加新設(shè)備的工作就是對(duì)這兩個(gè)表項(xiàng)的各個(gè)域進(jìn)行實(shí)現(xiàn),并且編寫與硬件相關(guān)的底層函數(shù)。通過對(duì)驅(qū)動(dòng)程序結(jié)構(gòu)層次的剖析,CAN總線驅(qū)動(dòng)的開發(fā)分為四步:

            第一步:向內(nèi)核注冊(cè)新設(shè)備;

            第二步:開發(fā)驅(qū)動(dòng)程序基本IO函數(shù);

            第三步:實(shí)現(xiàn)中斷處理函數(shù);

            第四步:綁定設(shè)備中斷并進(jìn)行驗(yàn)證。

            具體實(shí)現(xiàn)過程如下:

            4.1 向內(nèi)核注冊(cè)新設(shè)備

            在向內(nèi)核注冊(cè)新設(shè)備時(shí),原有的驅(qū)動(dòng)程序中和硬件無關(guān)的部分仍然可以使用,例如設(shè)備I/O函數(shù)表,硬件相關(guān)的部分需要自行設(shè)計(jì),包括設(shè)備描述符、設(shè)備名、設(shè)備初始化程序init、查找程序lookup和拓展CAN總線的數(shù)據(jù)結(jié)構(gòu)。

            拓展CAN總線的數(shù)據(jù)結(jié)構(gòu)Can_bus時(shí)一組用于描述對(duì)設(shè)備進(jìn)行的全部操作的數(shù)據(jù)結(jié)構(gòu)。通過宏Can_bus產(chǎn)生can總線的數(shù)據(jù)結(jié)構(gòu),宏Can_bus的原型為:

            Can_bus(1,funs,modereg,intrenreg,bustime,outpctr,clkdiv,acptcode,acptmask,flag)

            參數(shù)說明如下:

            l-該數(shù)據(jù)結(jié)構(gòu)的語言標(biāo)識(shí)符

            funs接口函數(shù)組,即硬件接口函數(shù)。

            flags驅(qū)動(dòng)程序初始表示值。

            modereg工作模式初始值

            intrenreg中斷允許初始值

            bustime總線時(shí)鐘1,和總線時(shí)鐘2初始值

            outpctr輸出控制

            clkdiv分時(shí)

            acptcode驗(yàn)收代碼

            acptmask驗(yàn)收屏蔽

            在產(chǎn)生CAN總線的設(shè)備表入口時(shí)首先要?jiǎng)?chuàng)建can總線的數(shù)據(jù)對(duì)象Can_bus,并且初始化以上所有參數(shù)。拓展CAN總線的Can_bus數(shù)據(jù)對(duì)象標(biāo)識(shí)符為EP9315_can_bus。

            拓展CAN總線的設(shè)備表入口對(duì)象實(shí)現(xiàn)如下:

            DEVTAB_ENTRY(EP9315_can_io0,

            CYGDAT_IO_CAN_EP9315_CAN0_NAME,

            0,

            cyg_io_can_devio,

            EP9315_can_init, //拓展CAN的初始化函數(shù)

            EP9315_can_lookup, //拓展CAN的查找函數(shù)

            EP9315_can_bus //CAN數(shù)據(jù)結(jié)構(gòu)Can_bus

            );

            4.2 開發(fā)驅(qū)動(dòng)程序基本IO函數(shù)

            這部分函數(shù)指的是驅(qū)動(dòng)程序接口函數(shù)中與硬件相關(guān)的部分,也就是Can_bus數(shù)據(jù)結(jié)構(gòu)中的funs接口函數(shù)表。funs函數(shù)表通過以下宏進(jìn)行定義:

            CAN_FUNS(l,putc,getc,set_config,start_xmit,stop_xmit)

            參數(shù)說明如下:

            l是該funs函數(shù)表的C語言標(biāo)實(shí)符。

            putc函數(shù):bool (*putc)(can_bus *priv,unsigned char c)該函數(shù)發(fā)送一個(gè)字符到串口。如果發(fā)送成功,則返回true,否則返回false。

          陀螺儀相關(guān)文章:陀螺儀原理




          評(píng)論


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