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