• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      波特率自適應(yīng)的CAN驅(qū)動在嵌入式Linux下的實現(xiàn)①

      2018-02-07 02:42:02史小燕朱建鴻
      計算機系統(tǒng)應(yīng)用 2018年1期
      關(guān)鍵詞:輪詢波特率寄存器

      史小燕,朱建鴻

      (江南大學(xué) 物聯(lián)網(wǎng)工程學(xué)院,無錫 214122)

      控制器局部網(wǎng)(CAN-CONTROLLER AREA NETWORK)是BOSCH公司推出的一種多主機局部網(wǎng)[1].它是一種非常有效的分布式控制串行通信網(wǎng)絡(luò),并且具有傳輸速度快、可靠性高、通信方式靈活等特點,因此在工業(yè)控制現(xiàn)場被廣泛應(yīng)用[2].CAN總線工作時要求通訊雙方波特率一致,實現(xiàn)CAN波特率自適應(yīng)將有效提高CAN總線的靈活性和使用效率.本文實現(xiàn)了一種基于嵌入式Linux的波特率自適應(yīng)方法,該方法通過融合直接測量法和波特率表輪詢法來加快波特率的配適速度;同時,加入波特率優(yōu)先級的概念,保存用戶選擇數(shù)據(jù)并將其利用到波特率初始值設(shè)置中,增加了一次性命中正確波特率的概率.

      1 CAN總線硬件平臺介紹

      硬件平臺采用三星S3C2410芯片作為系統(tǒng)微控制器.CAN總線規(guī)范定義了OSI模型的數(shù)據(jù)鏈路層和物理層.這兩層通常由CAN總線控制器和CAN總線收發(fā)器實現(xiàn)[3].本文CAN總線控制器和收發(fā)器分別采用Microchip的MCP2510和Philips的P82C50,二者通過SPI總線實現(xiàn)與控制器的數(shù)據(jù)傳輸.

      S3C241X系列是由Samsung公司設(shè)計生產(chǎn)的低功耗,高集成微處理器芯片,能夠?qū)INCE,EPOC32,LINUX系統(tǒng)提供支持.芯片接口資源豐富,可通過SPI同步串行接口和MCP2510相連.MCP2510是帶有SPI接口的CAN總線控制器,支持回環(huán)、正常、監(jiān)聽、睡眠、配置5種工作模式,滿足CAN總線使用需求.P82C50是Philips公司生產(chǎn)的can總線收發(fā)器,芯片作為CAN控制器與物理總線間的接口,提供對總線的差動發(fā)送和接收功能.當(dāng)使用P82C50作為CAN收發(fā)器時,同一網(wǎng)絡(luò)中允許掛接110個節(jié)點.CAN收發(fā)器,控制器與微控制單元之間的關(guān)系如圖1所示.

      圖1 CAN總線器件示意圖

      2 Linux下CAN驅(qū)動軟件結(jié)構(gòu)

      Linux設(shè)備驅(qū)動是硬件設(shè)備和應(yīng)用程序之間的接口,它為用戶提供了統(tǒng)一的設(shè)備訪問方式.Linux內(nèi)核一般把驅(qū)動程序分為4種類型,而CAN總線設(shè)備屬于其中的字符型設(shè)備,它以設(shè)備文件的方式建立在文件系統(tǒng)中的/dev目錄下,并且可以像文件一樣被訪問[4].

      Linux下設(shè)備驅(qū)動程序可以以模塊的形式動態(tài)的加載和卸載,字符設(shè)備驅(qū)動程序一般包含5個部分:頭文件、file_operation結(jié)構(gòu)體變量、中斷函數(shù)、加載函數(shù)以及卸載函數(shù).file_operation結(jié)構(gòu)體變量存儲驅(qū)動內(nèi)核模塊提供的對設(shè)備進(jìn)行各種操作的函數(shù)的指針,該結(jié)構(gòu)體的每個域都對應(yīng)著驅(qū)動內(nèi)核模塊用來處理某個被請求的事務(wù)的函數(shù)的地址.<linux/fs.h>對file_operations數(shù)據(jù)結(jié)構(gòu)中各個變量做了詳細(xì)定義[5].當(dāng)用戶調(diào)用如open(),read()等API接口時,系統(tǒng)將參數(shù)傳遞給file_operation結(jié)構(gòu)體的成員函數(shù),最終獲得參數(shù)實控權(quán)的將是系統(tǒng)調(diào)用函數(shù).

      加載函數(shù)以及卸載函數(shù)為驅(qū)動提供了動態(tài)使用模式,系統(tǒng)通過調(diào)用module_init()來加載驅(qū)動,通過調(diào)用module_exit()來卸載驅(qū)動.module_exit()只在動態(tài)編譯時有意義,因為靜態(tài)加載時驅(qū)動已經(jīng)被編譯進(jìn)內(nèi)核,無法進(jìn)行卸載.

      中斷函數(shù)即中斷服務(wù)程序,它響應(yīng)系統(tǒng)中斷并作出相應(yīng)的處理.本文所設(shè)計的波特率自適應(yīng)方式就是通過中斷服務(wù)程序來實現(xiàn).Linux中斷處理程序可以分為上半部和下半部[6].上部中斷處理緊急中斷任務(wù),它應(yīng)該盡量短小簡單以便程序能迅速處理完中斷并及時返回.底部中斷用來處理較長的非緊急任務(wù),linux2.6版本內(nèi)核提供了三種底部中斷處理方式:softirq、tasklet和work queue.tasklet和softirq都是基于軟中斷機制實現(xiàn),而work queue則是依靠內(nèi)核線程實現(xiàn).這三種處理方式各有優(yōu)缺點,如果專注性能提高應(yīng)使用softirq,對底部中斷處理的調(diào)度有特殊要求則必須使用work queue,除此之外,最優(yōu)選擇tasklet處理方式.

      3 波特率自適應(yīng)CAN驅(qū)動軟件設(shè)計

      CAN波特率自適應(yīng)的一般方法有兩種:輪詢法和探測法.本方案將結(jié)合這兩種常用檢測法來設(shè)計自適應(yīng)CAN驅(qū)動.

      輪詢法即將常用波特率記錄進(jìn)一張波特率輪詢表中,然后將測試波特率按序填入CAN驅(qū)動,通過判斷能否正確接收CAN數(shù)據(jù)幀決定是否進(jìn)行下一次輪詢.

      探測法即對接收數(shù)據(jù)進(jìn)行采樣,通過采樣數(shù)據(jù)來獲得正確波特率.由于CAN波特率有一定容錯空間,所以當(dāng)MCU自帶捕捉功能時,即使采樣波特率有一定誤差,很大程度上也能獲得正確波特率.

      這兩種方法各有利弊,前者可以保證在波特率表范圍內(nèi)找到正確值,但因為要對數(shù)據(jù)依次輪詢,所以往往耗時較長.后者雖然時耗短,但對設(shè)備有特殊要求,且如果偏差值超過波特率容錯范圍,則會造成無法獲得正確波特率的錯誤.基于此本文將兩種方法相結(jié)合,實現(xiàn)一種平均耗時短、匹配成功率高的波特率自適應(yīng)CAN驅(qū)動.

      3.1 CAN控制器MCP2510

      MCP2510是一款獨立CAN控制器,它的存在大大降低了軟件開發(fā)的難度.MCP2510具有8個中斷源,寄存器CANINTE是中斷使能寄存器,它包含了各個中斷源的中斷使能位;寄存器CANINTF是中斷標(biāo)志寄存器,它包含了各個中斷源的中斷標(biāo)志位.寄存器各個位設(shè)置如表1所示.

      表1 中斷寄存器CANINTE,CANINTF

      Bit0–Bit1:接收中斷位.MCP2510有兩個接收緩沖寄存器,緩存器0和緩存器1,驅(qū)動將接收數(shù)據(jù)讀入這兩個寄存器再傳遞進(jìn)用戶層.在這兩個位使能的情況下,若RX0IF置位,則緩存器0已滿;若RX1IF置位則緩存器1已滿.

      Bit2–Bit4:發(fā)送中斷位.MCP2510有三個發(fā)送緩存器,緩存器0,1和2.在這三個位使能的情況下,若TX0IF置位,則發(fā)送緩存器0是空;以此類推.

      Bit5–Bit6:錯誤中斷位和喚醒總線活動位.

      Bit7:報文錯誤中斷位.如果報文發(fā)送和接收過程中發(fā)生錯誤,將觸發(fā)該位中斷.該中斷功能在與監(jiān)聽模式聯(lián)用時被用來加快波特率的確定.

      MCP2510提供五種工作模式:配置模式,正常模式,睡眠模式,監(jiān)聽模式,回環(huán)模式.這五種模式通過設(shè)置CANTCRL寄存器的值來切換,其中波特率必須在配置模式下才能成功設(shè)置;CAN總線的通信運行在正常模式下;監(jiān)聽模式僅接受數(shù)據(jù)幀而不能發(fā)送數(shù)據(jù),應(yīng)該在該模式下進(jìn)行波特率自適應(yīng).

      3.2 波特率自適應(yīng)軟件原理

      本文所使用的硬件平臺將外部中斷4作為CAN專用中斷引腳,SPI 總線將差分信號傳輸?shù)?MCU 的外部中斷引腳,驅(qū)動對該中斷做出一系列響應(yīng)從而得到傳輸數(shù)據(jù).首先對MCP2510 的CANINIE進(jìn)行設(shè)置,使能中斷.當(dāng)信號來臨時會根據(jù)相應(yīng)中斷對中斷標(biāo)志寄存器進(jìn)行設(shè)置,在中斷服務(wù)程序中讀取CANINIF寄存器的值并進(jìn)行判斷,完成中斷響應(yīng).通訊雙方波特率相匹配時,中斷服務(wù)程序?qū)O(shè)置工作模式為正常模式并接收數(shù)據(jù);波特率設(shè)置有誤時,中斷服務(wù)程序?qū)O(shè)置工作模式為正常模式并進(jìn)入波特率自適應(yīng)階段.

      在波特率自適應(yīng)階段,驅(qū)動首先對數(shù)據(jù)進(jìn)行采樣以獲得預(yù)判波特率.中斷觸發(fā)方式有邊沿觸發(fā)和電平觸發(fā),邊緣觸發(fā)分為高電平觸發(fā)和低電平觸發(fā).驅(qū)動中可調(diào)用set_irq_type函數(shù)對觸發(fā)方式進(jìn)行設(shè)置,do_gettimeofday函數(shù)可在高低電平觸發(fā)時分別獲得一個當(dāng)前時間值.do_gettimeofday是系統(tǒng)函數(shù),用戶層函數(shù)gettimeofday實際調(diào)用的便是該函數(shù),它可以實現(xiàn)微秒級的時間獲取.將獲得的當(dāng)前時間與前一次獲得的時間相減并不斷比較可獲得一個最小時間差Tmin.由于CAN總線采用反向不歸零編碼(NRZ),該種編碼方式采用位填充的方法確保至少每6位時間發(fā)生一次跳變,即Tmin可以是實際碼元長度的1–5倍.從提高驅(qū)動效率的角度出發(fā),實際出現(xiàn)長時間不跳變的情況較少,所以本文僅考慮Tmin就是實際碼元長度的情況.

      獲得預(yù)判波特率以后即使用該波特率進(jìn)行測試,若再次進(jìn)入報文錯誤中斷,則依據(jù)該波特率所在位置對其周圍波特率進(jìn)行左右輪詢直至波特率最終匹配成功.波特率自適應(yīng)流程圖如圖2.

      圖2 CAN波特率自適應(yīng)流程圖

      當(dāng)產(chǎn)生報文錯誤中斷后,首先獲取波特率預(yù)測值并對該波特率進(jìn)行測試.該預(yù)測值往往有一定的誤差,將波特率表中的各值之間的中間值作為判定該值的邊界,可使獲得的波特率歸束到波特率表中存在的值中.若再次進(jìn)入報文錯誤中斷,則進(jìn)行波特率輪詢.確定該波特率在波特率表中的位置,根據(jù)錯誤計數(shù)值的奇偶性向左右兩個方向進(jìn)行輪詢,即一回合向左,下一回合向右.若一方先達(dá)到邊界值,則專注向另一方向輪詢直至找到正確值.輪詢部分交由Linux底部中斷完成.波特率匹配成功后進(jìn)入接收中斷,對CANINIF寄存器的接收緩存標(biāo)志位進(jìn)行問詢,若緩存器0,1有空閑空間,則讀取數(shù)據(jù);若緩存器滿,則喚醒等待隊列,將數(shù)據(jù)傳遞到用戶層.在中斷服務(wù)程序執(zhí)行完畢后,需要手動清除中斷標(biāo)志位,否則中斷會一直響應(yīng)陷入死循環(huán).清除中斷標(biāo)志位最好使用按位清除的方式,以防未被響應(yīng)的中斷標(biāo)志被一并清除.

      3.3 用戶優(yōu)先級的設(shè)置

      CAN波特率的設(shè)置與距離有關(guān),波特率越高,能夠穩(wěn)定通信的距離越短.即在距離一定的情況下,往往波特率的設(shè)置區(qū)間也受到了一定的限制.CAN總線在不同波特率下允許的最大通訊距離是:6.7 km(10 Kbps)、1.3 km(50 Kbps)、620 m(100 Kbps)、530 m(125 Kbps)、270 m(250 Kbps)、130 m(500 Kbps)、40 m(1Mbps)[7].在CAN驅(qū)動中,波特率初值固定地設(shè)置為波特率表的第一個值,這對于波特率自適應(yīng)來說是一種資源的浪費.基于此,本文將用戶使用頻率的影響添進(jìn)波特率初始值的設(shè)置,增加了一次碰撞即可獲得正確波特率的概率,提高了波特率匹配效率.

      用戶數(shù)據(jù)需要具有能夠反復(fù)讀取、即使驅(qū)動關(guān)閉也能繼續(xù)存留數(shù)據(jù)的功能,因此僅將其作為變量寫入驅(qū)動是不夠的.在本方法中用戶數(shù)據(jù)被寫入文件,在驅(qū)動打開時讀入數(shù)據(jù),接收中斷里進(jìn)行優(yōu)先級判定,驅(qū)動關(guān)閉時保存數(shù)據(jù).驅(qū)動層調(diào)用讀寫程序之前需要使用set_fs()函數(shù)對內(nèi)核空間進(jìn)行保護(hù).

      用戶數(shù)據(jù)中保存一個二維數(shù)組,該數(shù)組放置了波特率表中的各波特率及其所屬優(yōu)先級,程序每進(jìn)入一次接受中斷,證明該次波特率匹配成功,對該波特率進(jìn)行判斷并將其對應(yīng)的優(yōu)先級增加1,再進(jìn)行排序后便可獲得一個新的波特率優(yōu)先級表.該表存放在一個掉電不擦除的目錄下,每次初始化時讀取到驅(qū)動中的數(shù)組里,使用后在關(guān)閉驅(qū)動時原路保存.

      4 實驗結(jié)果分析

      本設(shè)計方案為用戶設(shè)定了16個常見波特率,滿足一般情況下的通訊需求.通過實驗平臺串口調(diào)試功能檢測驅(qū)動運行情況,驅(qū)動初始化階段打印優(yōu)先級信息,userlist是波特率枚舉值,priority為對應(yīng)優(yōu)先級信息.用戶層運行CAN數(shù)據(jù)收發(fā)程序,進(jìn)入波特率調(diào)試階段,驅(qū)動首先獲得波特率探測值再根據(jù)該值進(jìn)行輪詢.

      圖3首先以十六進(jìn)制形式向ARM開發(fā)板發(fā)送一組隨機數(shù)據(jù)AA 76 07 54 65 34 53 55,成功匹配波特率后順利接收;然后ARM端向PC端發(fā)送如圖4所示三組數(shù)據(jù).

      圖4接收數(shù)據(jù)為ASSIC碼轉(zhuǎn)換而成.經(jīng)過測試,本文所設(shè)計CAN驅(qū)動匹配時間基本維持在3秒以內(nèi),而僅使用輪訓(xùn)方式匹配波特率會有首尾波特率輪詢時間差距大的情況出現(xiàn),如文獻(xiàn)[6]中波特率自適應(yīng)時間從4 s到12 s時間不等.且本設(shè)計增加了用戶選擇頻率的影響,當(dāng)所設(shè)置波特率為常用波特率時,有很大幾率會一次命中正確波特率.在實際實驗中,當(dāng)用戶優(yōu)先級第一的波特率被選中時,匹配時間會被縮短到1 s以內(nèi),驅(qū)動能夠在毫秒級時間內(nèi)完成波特率匹配,這進(jìn)一步提高了波特率匹配效率.

      圖3 驅(qū)動匹配測試圖

      圖4 驅(qū)動數(shù)據(jù)收發(fā)測試圖

      5 結(jié)語

      本文在對CAN驅(qū)動結(jié)構(gòu)進(jìn)行分析的基礎(chǔ)上設(shè)計了一款可以實現(xiàn)CAN波特率自適應(yīng)的驅(qū)動.以S3C2410微處理器為主控制器、MCP2510芯片為CAN控制器的嵌入式設(shè)備為實驗硬件平臺.設(shè)計方案融合了兩種常用波特率自適應(yīng)方法并增加了用戶使用頻率對波特率自適應(yīng)的影響,文章對這部分內(nèi)容進(jìn)行了詳細(xì)的解釋.經(jīng)過實驗驗證了該方案比原本的方法耗時更短,該驅(qū)動正常工作時數(shù)據(jù)能正確傳輸.

      1 馮軍,王耀南,劉宏立.Linux系統(tǒng)下CAN總線通信的設(shè)計及實現(xiàn).微計算機信息,2008,24(32):71–72,81.[doi:10.3969/j.issn.1008-0570.2008.32.031]

      2 田小剛,蔡啟仲,鄔軍偉.基于嵌入式Linux下CAN設(shè)備驅(qū)動程序設(shè)計.微計算機信息,2009,25(17):155–157.

      3 黃輝,范霽月,張明.CAN總線接口設(shè)計與應(yīng)用.輕工科技,2013,(1):61–62.

      4 陳在平,許東輝.Linux下S3C2440微控制器的CAN驅(qū)動設(shè)計與實現(xiàn).化工自動化及儀表,2011,38(8):985–988.

      5 張雪松,王鴻磊,徐釗.嵌入式Linux2.6內(nèi)核的CAN驅(qū)動設(shè)計與實現(xiàn).計算機工程與設(shè)計,2010,31(15):3396–3398,3426.

      6 曾祥文,宋樹祥,賓相邦.嵌入式Linux下波特率自適應(yīng)的CAN總線驅(qū)動的實現(xiàn).測控技術(shù),2015,34(8):104–107.

      7 謝云山,楊安種,龔建宇,等.自適應(yīng)CAN總線波特率轉(zhuǎn)換器設(shè)計.自動化與儀器儀表,2013,(5):62–63.

      猜你喜歡
      輪詢波特率寄存器
      CAN 總線波特率自適應(yīng)程序設(shè)計
      智能制造(2020年5期)2020-07-03 06:24:00
      Lite寄存器模型的設(shè)計與實現(xiàn)
      基于等概率的ASON業(yè)務(wù)授權(quán)設(shè)計?
      基于FPGA的異步串行通信波特率容錯設(shè)計
      電子測試(2018年7期)2018-05-16 06:27:18
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      依托站點狀態(tài)的兩級輪詢控制系統(tǒng)時延特性分析
      利用時間輪詢方式操作DDR3實現(xiàn)多模式下數(shù)據(jù)重排
      C*Core芯片SCI串口波特率容限優(yōu)化
      高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
      一種可重構(gòu)線性反饋移位寄存器設(shè)計
      枝江市| 万全县| 图木舒克市| 万载县| 普格县| 台南县| 延长县| 义乌市| 台东市| 博罗县| 大名县| 榆林市| 建始县| 清原| 鄱阳县| 石棉县| 科技| 余姚市| 蓝田县| 夏津县| 罗定市| 洛隆县| 沙湾县| 和顺县| 伊川县| 维西| 双江| 阿拉善盟| 连江县| 衡阳市| 永嘉县| 个旧市| 惠东县| 本溪| 公安县| 武威市| 安塞县| 景洪市| 汤阴县| 宣威市| 黄浦区|