宋天楹 張紅梅 馮 歡
(桂林電子科技大學(xué)信息與通信學(xué)院,廣西 桂林 541004)
Bosch公司開(kāi)發(fā)的控制器局域網(wǎng)網(wǎng)絡(luò)(controller area network,CAN)是國(guó)際上應(yīng)用較為廣泛的現(xiàn)場(chǎng)總線之一,由于其具有較高的可靠性和良好的糾錯(cuò)特性,在智能大廈、航空工業(yè)、礦山煤場(chǎng)等領(lǐng)域得到了廣泛的重視與應(yīng)用[1-2]。
CAN總線應(yīng)用一般是針對(duì)各種工業(yè)現(xiàn)場(chǎng)、汽車內(nèi)部的低速測(cè)量、控制設(shè)備等[3]。作為上位機(jī)的通用PC機(jī),大部分沒(méi)有配備CAN接口,一般只提供RS-232接口,而RS-232接口作為傳統(tǒng)的工業(yè)控制通信方式,在生產(chǎn)生活中仍然大量使用。因此,實(shí)現(xiàn)CAN-RS232的通信轉(zhuǎn)換具有重要的實(shí)際意義。
當(dāng)今市場(chǎng)上相關(guān)的轉(zhuǎn)換器產(chǎn)品大多數(shù)為單一功能的專門設(shè)備,考慮到實(shí)際應(yīng)用場(chǎng)合中的通信環(huán)境復(fù)雜多變,本文采用嵌入式操作系統(tǒng)來(lái)實(shí)現(xiàn)轉(zhuǎn)換功能,以便進(jìn)行功能擴(kuò)展。通過(guò)在性能、成本等方面與流行嵌入式系統(tǒng)μC/OS-II、RT-Linux等作比較,決定采用實(shí)時(shí)操作系統(tǒng)RT-Thread作為系統(tǒng)平臺(tái)。硬件方面采用以LPC1768為核心的第二代Cortex-M3開(kāi)發(fā)板作為硬件平臺(tái)來(lái)進(jìn)行設(shè)計(jì)。
本文硬件平臺(tái)采用以NXP公司的LPC1768為核心的開(kāi)發(fā)平臺(tái),其MCU是第二代ARM Cortex-M3處理器,操作頻率可達(dá)100 MHz。ARM Cortex-M3 CPU具有3級(jí)流水線和哈佛結(jié)構(gòu),帶獨(dú)立的本地指令和數(shù)據(jù)總線,以及用于外設(shè)的、性能略低的第三條總線;外設(shè)包含512 kB的Flash存儲(chǔ)器、64 kB的SRAM、以太網(wǎng)控制器、USB主機(jī)/從機(jī)OTG接口、8通道的通用DMA控制器、4個(gè)UART接口(其中UART3連接 RS-485接口)以及SPI接口等,完全可以實(shí)現(xiàn)轉(zhuǎn)換器的功能。系統(tǒng)硬件總體框圖如圖1所示。
圖1 系統(tǒng)硬件總體框圖Fig.1 Overall block diagram of system hardware
此開(kāi)發(fā)平臺(tái)使用的CAN收發(fā)器為SN65HVD230;RS-232電平轉(zhuǎn)換器使用常用的MAX3232;開(kāi)發(fā)過(guò)程中的程序燒寫與調(diào)制使用JTAG接口。
目前常用的嵌入式實(shí)時(shí)操作系統(tǒng)有μC/OS-II、RT-Linux、μCLinux、Vxworks等。RT-Linux與 μCLinux的實(shí)時(shí)性并不盡如人意,一般用于手持設(shè)備等應(yīng)用;Vxworks高額的授權(quán)費(fèi)用令一般的商家與開(kāi)發(fā)者望而卻步;針對(duì)小型設(shè)備設(shè)計(jì)的μC/OS-II體積小、實(shí)時(shí)性高,性能較為優(yōu)秀,而其商用的文件系統(tǒng)組件μc/FS和網(wǎng)絡(luò)組件μTCP/IP同樣價(jià)格不菲[4]??紤]到轉(zhuǎn)換器系統(tǒng)的網(wǎng)絡(luò)化擴(kuò)展方向,決定采用商用許可授權(quán)寬松靈活、源碼免費(fèi)、內(nèi)核穩(wěn)定的RT-Thread系統(tǒng)作為轉(zhuǎn)換器的系統(tǒng)平臺(tái)。RT-Thread與μC/OS-II的相關(guān)比較如表1 所示[5]。
表1 RT-Thread與μC/OS-II的相關(guān)比較Tab.1 Comparison of RT-Thread and μC/OS-II
RT-Thread作為國(guó)內(nèi)優(yōu)秀的開(kāi)源實(shí)時(shí)操作系統(tǒng),用C語(yǔ)言實(shí)現(xiàn)了非常友好的面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格。RT-Thread將任務(wù)、信號(hào)量、接口設(shè)備均看作內(nèi)核對(duì)象來(lái)進(jìn)行處理,所有的內(nèi)核對(duì)象從基對(duì)象進(jìn)行派生。基對(duì)象派生為線程對(duì)象、IPC對(duì)象和定時(shí)器對(duì)象等。其中,在I/O管理模塊中,RT-Thread的設(shè)備驅(qū)動(dòng)框架從基對(duì)象中派生而來(lái),分為字符型設(shè)備對(duì)象、塊設(shè)備對(duì)象和網(wǎng)絡(luò)設(shè)備對(duì)象等。設(shè)計(jì)風(fēng)格與Linux的設(shè)備管理方式類似,同μC/OS-II等沒(méi)有設(shè)備驅(qū)動(dòng)框架的系統(tǒng)相比,驅(qū)動(dòng)函數(shù)的代碼結(jié)構(gòu)不會(huì)因?yàn)殚_(kāi)發(fā)者的不同而有大的改變,具有非常好的可讀性與重用性[6]。RT-Thread系統(tǒng)的最小型配置為8 kB ROM、3 kB RAM。本文采用RT-Thread最近版本rt-thread-0.4.0 beta1來(lái)進(jìn)行開(kāi)發(fā)。此版本在LPC176x分支上已經(jīng)提供了基本的系統(tǒng)功能以及UART基本驅(qū)動(dòng)、LwIP網(wǎng)絡(luò)協(xié)議棧與文件系統(tǒng)(SD卡)等組件功能[5]。RT-Thread的設(shè)備驅(qū)動(dòng)框架為一個(gè)名為rt_device的結(jié)構(gòu)體,其中定義了一些基本的關(guān)鍵成員與接口函數(shù),具體如下。
其中,void* user_data為用戶的私有數(shù)據(jù)域。用戶可以定義自己的私有數(shù)據(jù)結(jié)構(gòu),然后賦值到此指針上,當(dāng)然也可以在此rt_device對(duì)象基礎(chǔ)上進(jìn)行派生。本文采用的是第二種方法。如果實(shí)現(xiàn)了rt_device中規(guī)定的接口函數(shù),系統(tǒng)就可以利用接口操作函數(shù)對(duì)接口設(shè)備進(jìn)行初始化、控制與讀寫等操作[6]。
由上述分析可知,為了在RT-Thread系統(tǒng)上添加CAN通信設(shè)備,需要從rt-device對(duì)象中派生出CAN設(shè)備對(duì)象,并且實(shí)現(xiàn) init、open、read、write、close 等接口函數(shù)。在rt_device中已經(jīng)設(shè)計(jì)了基本的成員變量,只要增加CAN設(shè)備的接收緩沖區(qū)、讀寫索引標(biāo)示、初始化相關(guān)參數(shù)等即可。轉(zhuǎn)換器設(shè)計(jì)使用CAN1、CAN2兩個(gè)接口,這種有多個(gè)相同設(shè)備的情況下,設(shè)備接口函數(shù)可以共用一套,而在各自的數(shù)據(jù)域進(jìn)行區(qū)分。這里使用CAN設(shè)備寄存器的基地址來(lái)對(duì)CAN1、CAN2設(shè)備進(jìn)行區(qū)分。
由于CAN總線在短距離上的傳輸速率最大為1 MB/s,RS-232的波特率大約為15 kB/s,因此兩者的速率存在較大差別。為了使通信過(guò)程不會(huì)因?yàn)榇瞬町惖挠绊懚a(chǎn)生大量數(shù)據(jù)成塊丟失的現(xiàn)象,這里采用環(huán)形緩沖區(qū)結(jié)構(gòu)來(lái)進(jìn)行緩解。CAN接口與RS-232接口分別設(shè)計(jì)環(huán)形緩沖區(qū)結(jié)構(gòu)來(lái)緩存數(shù)據(jù),以CAN接口接收環(huán)形緩沖區(qū)為例,其緩沖區(qū)結(jié)構(gòu)如下。
其中rt_CANMsg_t為CAN數(shù)據(jù)幀的數(shù)據(jù)結(jié)構(gòu)。CAN設(shè)備對(duì)象的結(jié)構(gòu)CAN_device設(shè)計(jì)如下。
要實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)框架規(guī)定的 init、open、read、write、close等接口函數(shù),需把LPC1768通用的CAN接口操作函數(shù),按照RTT-Thread系統(tǒng)中設(shè)備操作函數(shù)的形式進(jìn)行改寫,這里不一一贅述。特別需要注意的是在注冊(cè)CAN設(shè)備中斷處理函數(shù)時(shí),需要修改/rt-thread-0.4.0 beta1/libcpu/arm/lpc17xx下的 start_rvds.S 文件中關(guān)于CAN中斷服務(wù)處理函數(shù)的行,把中間項(xiàng)改為用戶定義的中斷服務(wù)處理函數(shù)名即可。
RT-Thread在LPC176x下的分支已經(jīng)把UART的基本驅(qū)動(dòng)寫好,不過(guò)只是簡(jiǎn)單支持單一串口的驅(qū)動(dòng)。與CAN總線多設(shè)備驅(qū)動(dòng)的方法類似,在rt_uart_lpc結(jié)構(gòu)中加入寄存器基地址等成員變量,便可實(shí)現(xiàn)同時(shí)使用UART0、UART1兩個(gè)串口的功能。以CAN為接收協(xié)議為例,其轉(zhuǎn)換流程如圖2所示。
圖2 CAN接收過(guò)程流程圖Fig.2 Flowchart of CAN receiving process
實(shí)現(xiàn)CAN-RS232間的透明通信,實(shí)際上就是實(shí)現(xiàn)RS-232數(shù)據(jù)幀與CAN數(shù)據(jù)幀的無(wú)縫連接。為了方便轉(zhuǎn)換,參照CAN數(shù)據(jù)幀的格式,定義RS-232幀的數(shù)據(jù)結(jié)構(gòu)如下(RS-232應(yīng)用層的數(shù)據(jù)結(jié)構(gòu)可由用戶自定義)。
這樣,flag、CID、data域即可形成一個(gè)完整的CAN協(xié)議幀。在用戶的應(yīng)用線程里,通過(guò)RT-Thread設(shè)備控制函數(shù),利用環(huán)形緩沖區(qū)直接進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)即可[4]。
RT-Thread的用戶應(yīng)用程序入口在application.c文件的rt_application_init()中,在這個(gè)函數(shù)里,系統(tǒng)進(jìn)行基本線程的創(chuàng)建并開(kāi)始多線程調(diào)度。RT-Thread的線程調(diào)度算法是基于優(yōu)先級(jí)的全搶占式多線程調(diào)度算法,支持256個(gè)優(yōu)先級(jí),相同優(yōu)先級(jí)線程采用可設(shè)置時(shí)間片的輪轉(zhuǎn)調(diào)度算法。本文設(shè)計(jì)了“RS_TX_thread”、“RS_RX_thread”和“SYS_init_thread”三個(gè)線程。前兩個(gè)線程實(shí)現(xiàn)CAN-RS232轉(zhuǎn)換功能,“SYS_init_thread”線程是“RS_TX_thread”與“RS_RX_thread”線程的入口。TX線程負(fù)責(zé)CAN信息轉(zhuǎn)RS-232的工作,RX線程負(fù)責(zé)RS-232轉(zhuǎn)CAN的工作,創(chuàng)建代碼如下。
這里使用兩個(gè)LPC1768開(kāi)發(fā)板進(jìn)行試驗(yàn),將兩個(gè)開(kāi)發(fā)板A、B的CAN1接口進(jìn)行對(duì)連。在A開(kāi)發(fā)板的串口輸入信息,在B開(kāi)發(fā)板的串口上進(jìn)行監(jiān)測(cè)。試驗(yàn)驗(yàn)證,B開(kāi)發(fā)板可以成功接收到A開(kāi)發(fā)板串口輸入的數(shù)據(jù),CAN與RS-232間通信正確、有效。
本文設(shè)計(jì)的CAN-RS232轉(zhuǎn)換器在RT-Thread上進(jìn)行實(shí)現(xiàn),可以使用于CAN、RS-232通信方式并存的應(yīng)用環(huán)境,可以利用PC機(jī)的RS-232接口直接處理CAN總線上傳的數(shù)據(jù)信息。同時(shí),利用RT-Thread的LwIP網(wǎng)絡(luò)組件,可以擴(kuò)充以太網(wǎng)接口,實(shí)現(xiàn)與以太網(wǎng)間的協(xié)議轉(zhuǎn)換,適應(yīng)更加復(fù)雜的通信環(huán)境。
[1]李婷.CAN 總線綜述[J].數(shù)字技術(shù)與應(yīng)用,2010(4):129-130.
[2]甘永梅,劉曉娟,晁武杰,等.現(xiàn)場(chǎng)總線技術(shù)及其應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2004:5-14.
[3]包磊,徐梁飛,林辛凡,等.燃料電池客車用10msTTCAN通信網(wǎng)絡(luò)協(xié)議制訂與測(cè)試[J].汽車工程,2009,31(1):65 -68,82.
[4]楊宗德,張兵.μC/OS-II標(biāo)準(zhǔn)教程[M].北京:人民郵電出版社,2009:1 -6,239 -242.
[5]邱祎.嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2007.
[6]陳是知.μC/OS-II內(nèi)核分析、移植與驅(qū)動(dòng)程序開(kāi)發(fā)[M].北京:人民郵電出版社,2007:198-247.
[7]朱傳宏,張麗全.嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread在SEP4020上的移植[J].計(jì)算機(jī)與數(shù)字工程,2010(11):93-96.
[8]柳沁.基于 ARM7的 CAN-USB轉(zhuǎn)換器設(shè)計(jì)[J].設(shè)計(jì)天地,2007:109-110.
[9]蔣浩天.綜合網(wǎng)絡(luò)多協(xié)議轉(zhuǎn)換的研究和實(shí)現(xiàn)[D].成都:電子科技大學(xué),2007.
[10]宋琪,魏臻,吳永忠,等.CAN-RS-232接口電路及協(xié)議轉(zhuǎn)換軟件的設(shè)計(jì)[J].電子工程師,2005(1):69-71.