宋天楹 張紅梅 馮 歡
(桂林電子科技大學信息與通信學院,廣西 桂林 541004)
Bosch公司開發的控制器局域網網絡(controller area network,CAN)是國際上應用較為廣泛的現場總線之一,由于其具有較高的可靠性和良好的糾錯特性,在智能大廈、航空工業、礦山煤場等領域得到了廣泛的重視與應用[1-2]。
CAN總線應用一般是針對各種工業現場、汽車內部的低速測量、控制設備等[3]。作為上位機的通用PC機,大部分沒有配備CAN接口,一般只提供RS-232接口,而RS-232接口作為傳統的工業控制通信方式,在生產生活中仍然大量使用。因此,實現CAN-RS232的通信轉換具有重要的實際意義。
當今市場上相關的轉換器產品大多數為單一功能的專門設備,考慮到實際應用場合中的通信環境復雜多變,本文采用嵌入式操作系統來實現轉換功能,以便進行功能擴展。通過在性能、成本等方面與流行嵌入式系統μC/OS-II、RT-Linux等作比較,決定采用實時操作系統RT-Thread作為系統平臺。硬件方面采用以LPC1768為核心的第二代Cortex-M3開發板作為硬件平臺來進行設計。
本文硬件平臺采用以NXP公司的LPC1768為核心的開發平臺,其MCU是第二代ARM Cortex-M3處理器,操作頻率可達100 MHz。ARM Cortex-M3 CPU具有3級流水線和哈佛結構,帶獨立的本地指令和數據總線,以及用于外設的、性能略低的第三條總線;外設包含512 kB的Flash存儲器、64 kB的SRAM、以太網控制器、USB主機/從機OTG接口、8通道的通用DMA控制器、4個UART接口(其中UART3連接 RS-485接口)以及SPI接口等,完全可以實現轉換器的功能。系統硬件總體框圖如圖1所示。

圖1 系統硬件總體框圖Fig.1 Overall block diagram of system hardware
此開發平臺使用的CAN收發器為SN65HVD230;RS-232電平轉換器使用常用的MAX3232;開發過程中的程序燒寫與調制使用JTAG接口。
目前常用的嵌入式實時操作系統有μC/OS-II、RT-Linux、μCLinux、Vxworks等。RT-Linux與 μCLinux的實時性并不盡如人意,一般用于手持設備等應用;Vxworks高額的授權費用令一般的商家與開發者望而卻步;針對小型設備設計的μC/OS-II體積小、實時性高,性能較為優秀,而其商用的文件系統組件μc/FS和網絡組件μTCP/IP同樣價格不菲[4]。考慮到轉換器系統的網絡化擴展方向,決定采用商用許可授權寬松靈活、源碼免費、內核穩定的RT-Thread系統作為轉換器的系統平臺。RT-Thread與μC/OS-II的相關比較如表1 所示[5]。

表1 RT-Thread與μC/OS-II的相關比較Tab.1 Comparison of RT-Thread and μC/OS-II
RT-Thread作為國內優秀的開源實時操作系統,用C語言實現了非常友好的面向對象程序設計風格。RT-Thread將任務、信號量、接口設備均看作內核對象來進行處理,所有的內核對象從基對象進行派生。基對象派生為線程對象、IPC對象和定時器對象等。其中,在I/O管理模塊中,RT-Thread的設備驅動框架從基對象中派生而來,分為字符型設備對象、塊設備對象和網絡設備對象等。設計風格與Linux的設備管理方式類似,同μC/OS-II等沒有設備驅動框架的系統相比,驅動函數的代碼結構不會因為開發者的不同而有大的改變,具有非常好的可讀性與重用性[6]。RT-Thread系統的最小型配置為8 kB ROM、3 kB RAM。本文采用RT-Thread最近版本rt-thread-0.4.0 beta1來進行開發。此版本在LPC176x分支上已經提供了基本的系統功能以及UART基本驅動、LwIP網絡協議棧與文件系統(SD卡)等組件功能[5]。RT-Thread的設備驅動框架為一個名為rt_device的結構體,其中定義了一些基本的關鍵成員與接口函數,具體如下。


其中,void* user_data為用戶的私有數據域。用戶可以定義自己的私有數據結構,然后賦值到此指針上,當然也可以在此rt_device對象基礎上進行派生。本文采用的是第二種方法。如果實現了rt_device中規定的接口函數,系統就可以利用接口操作函數對接口設備進行初始化、控制與讀寫等操作[6]。
由上述分析可知,為了在RT-Thread系統上添加CAN通信設備,需要從rt-device對象中派生出CAN設備對象,并且實現 init、open、read、write、close 等接口函數。在rt_device中已經設計了基本的成員變量,只要增加CAN設備的接收緩沖區、讀寫索引標示、初始化相關參數等即可。轉換器設計使用CAN1、CAN2兩個接口,這種有多個相同設備的情況下,設備接口函數可以共用一套,而在各自的數據域進行區分。這里使用CAN設備寄存器的基地址來對CAN1、CAN2設備進行區分。
由于CAN總線在短距離上的傳輸速率最大為1 MB/s,RS-232的波特率大約為15 kB/s,因此兩者的速率存在較大差別。為了使通信過程不會因為此差異的影響而產生大量數據成塊丟失的現象,這里采用環形緩沖區結構來進行緩解。CAN接口與RS-232接口分別設計環形緩沖區結構來緩存數據,以CAN接口接收環形緩沖區為例,其緩沖區結構如下。

其中rt_CANMsg_t為CAN數據幀的數據結構。CAN設備對象的結構CAN_device設計如下。

要實現設備驅動框架規定的 init、open、read、write、close等接口函數,需把LPC1768通用的CAN接口操作函數,按照RTT-Thread系統中設備操作函數的形式進行改寫,這里不一一贅述。特別需要注意的是在注冊CAN設備中斷處理函數時,需要修改/rt-thread-0.4.0 beta1/libcpu/arm/lpc17xx下的 start_rvds.S 文件中關于CAN中斷服務處理函數的行,把中間項改為用戶定義的中斷服務處理函數名即可。
RT-Thread在LPC176x下的分支已經把UART的基本驅動寫好,不過只是簡單支持單一串口的驅動。與CAN總線多設備驅動的方法類似,在rt_uart_lpc結構中加入寄存器基地址等成員變量,便可實現同時使用UART0、UART1兩個串口的功能。以CAN為接收協議為例,其轉換流程如圖2所示。

圖2 CAN接收過程流程圖Fig.2 Flowchart of CAN receiving process
實現CAN-RS232間的透明通信,實際上就是實現RS-232數據幀與CAN數據幀的無縫連接。為了方便轉換,參照CAN數據幀的格式,定義RS-232幀的數據結構如下(RS-232應用層的數據結構可由用戶自定義)。

這樣,flag、CID、data域即可形成一個完整的CAN協議幀。在用戶的應用線程里,通過RT-Thread設備控制函數,利用環形緩沖區直接進行數據的轉發即可[4]。
RT-Thread的用戶應用程序入口在application.c文件的rt_application_init()中,在這個函數里,系統進行基本線程的創建并開始多線程調度。RT-Thread的線程調度算法是基于優先級的全搶占式多線程調度算法,支持256個優先級,相同優先級線程采用可設置時間片的輪轉調度算法。本文設計了“RS_TX_thread”、“RS_RX_thread”和“SYS_init_thread”三個線程。前兩個線程實現CAN-RS232轉換功能,“SYS_init_thread”線程是“RS_TX_thread”與“RS_RX_thread”線程的入口。TX線程負責CAN信息轉RS-232的工作,RX線程負責RS-232轉CAN的工作,創建代碼如下。
這里使用兩個LPC1768開發板進行試驗,將兩個開發板A、B的CAN1接口進行對連。在A開發板的串口輸入信息,在B開發板的串口上進行監測。試驗驗證,B開發板可以成功接收到A開發板串口輸入的數據,CAN與RS-232間通信正確、有效。
本文設計的CAN-RS232轉換器在RT-Thread上進行實現,可以使用于CAN、RS-232通信方式并存的應用環境,可以利用PC機的RS-232接口直接處理CAN總線上傳的數據信息。同時,利用RT-Thread的LwIP網絡組件,可以擴充以太網接口,實現與以太網間的協議轉換,適應更加復雜的通信環境。
[1]李婷.CAN 總線綜述[J].數字技術與應用,2010(4):129-130.
[2]甘永梅,劉曉娟,晁武杰,等.現場總線技術及其應用[M].北京:機械工業出版社,2004:5-14.
[3]包磊,徐梁飛,林辛凡,等.燃料電池客車用10msTTCAN通信網絡協議制訂與測試[J].汽車工程,2009,31(1):65 -68,82.
[4]楊宗德,張兵.μC/OS-II標準教程[M].北京:人民郵電出版社,2009:1 -6,239 -242.
[5]邱祎.嵌入式實時操作系統RT-Thread的設計與實現[D].成都:電子科技大學,2007.
[6]陳是知.μC/OS-II內核分析、移植與驅動程序開發[M].北京:人民郵電出版社,2007:198-247.
[7]朱傳宏,張麗全.嵌入式實時操作系統RT-Thread在SEP4020上的移植[J].計算機與數字工程,2010(11):93-96.
[8]柳沁.基于 ARM7的 CAN-USB轉換器設計[J].設計天地,2007:109-110.
[9]蔣浩天.綜合網絡多協議轉換的研究和實現[D].成都:電子科技大學,2007.
[10]宋琪,魏臻,吳永忠,等.CAN-RS-232接口電路及協議轉換軟件的設計[J].電子工程師,2005(1):69-71.