1 引言
隨著汽車電子技術的不斷發展,車上的電子裝置越來越多,并與傳感器和執行器一起共同組成了許多復雜的電子控制系統。結果連接這些電子裝置的電子線路迅速膨脹,布線變得越來越困難,導致了車身重量明顯增加,車輛運行的可靠性降低。傳統點對點的連接方式已經無法滿足現代汽車電子技術發展的要求,多路傳輸的車載網絡技術成為解決這些問題的必然選擇。德國BOSCH 公司[1]推出的控制局域網CAN(Controller Area Network)依靠其穩定的性能、低廉的價格和很高的可靠性和實時性,現在已經被廣泛地應用于汽車內部網絡。CAN總線的采用使汽車內部的信息數據共享成為現實。然而,現在信息數據的共享不僅僅局限于汽車內部,許多數據信息需要與外界進行交換。這些信息主要用于汽車導航、汽車GPS 定位、汽車防盜、汽車遠程監控、汽車遠程調度和收費等方面。由于汽車可移動性的特點,很多與外界交互的信息需要通過無線傳輸,所以我們選擇具有覆蓋面廣、接入速度快、按流量計費等優點的通用分組無線業務GPRS(General Packet Radio Service)來承載無線數據通信。GPRS 是在GSM 基礎上發展起來的一種無線分組交換技術[2],被稱為2.5G,最高帶寬可達171.2Kb/s,可較好的滿足無線通信的要求。
2 總體網絡拓撲
總體網絡拓撲如圖 1 所示,汽車內部的電子控制單元都掛接到CAN 網上,汽車的內部數據信息通過CAN 總線進行傳遞,而需要與外界交互的數據則通過CAN/GPRS 無線車載網關進行收發。
數據經過基站收發信機 BTS(Base Transceiver Station)、基站控制器BSC(Base Station Controller)和GPRS 服務支持節點SGSN(Serving GPRS Support Node)進入GPRS 骨干網;然后再通過GPRS 網關支持節點GGSN(Gateway GPRS Support Node),進入Internet 互聯網;并可以通過TCP 或UDP 協議把數據傳送到Internet 遠程服務器。
3 CAN/GPRS 無線車載網關硬件實現
因為整個汽車內部CAN網與外界交互的數據都需要通過CAN/GPRS無線車載網關進行收發,所以網關需要配備一個性能較高的微處理器。我們選擇具有較高性價比的一款三星公司的32 位ARM9 微處理器S3C2410X 來作為網關的主控制器。S3C2410X 包含ARM920T核,最高處理速度為203MHz[6],豐富的外圍設備包括3 通道的UART、4 通道的DMA、2個SPI 接口、117 個通用I/O 口和24 個外部中斷源等。采用一片三星的K9F1208 NAND Flash芯片(64M *8Bit)來儲存網關軟件系統的Bootloader,Linux 內核,根文件系統和網關程序。由兩片HYNIX 的HY57V561620 DRAM 芯片(4Banks*4M*16Bit)構成64M 的SDRAM,用于加載Linux 操作系統和運行程序。采用12MHz 的有源晶振。設計了一個20 針JTAG 接口,用來燒寫Bootloader。使用1 片MAX3232 構成UART 調試接口。因為整個系統的輸入電壓為5V,所以需使用AMS1117-3.3 和AMS1117-1.8 分別得到穩定的3.3V 和1.8V 電壓。
CAN 控制器選擇Microchip 的MCP2510,CAN 收發器選擇Philips 的TJA1050 以組成網關的CAN 通信模塊。MCP2510 支持CAN 總線V2.0A 和V2.0B 技術規范,通信數率可達1Mb/s,擁有3 個發送緩沖器、2 個接收緩沖器,高速SPI 接口支持0,0 和1,1SPI 模式。TJA1050具有對總線差分信號的收發功能和抗汽車環境下的瞬間干擾等能力。網關的GPRS 接口采用SIMCOM 公司的SIM300 GSM/GPRS 模塊,該模塊可為GSM 語音、短消息和GPRS 上網等業務提供無線接口。采用6 腳SIM 卡座來連接SIM 卡。網關的硬件結構如圖2 所示。
在實際硬件連接時,S3C2410 的SPI 接口與MCP2510 的SPI 接口直接相連。MCP2510的TXCAN、RXCAN 引腳分別與TJA1050 的TXD、RXD 引腳相連,而TJA1050 的CANH和CANL 引腳分別接到CAN 總線的CANH 線和CANL 線上。因為S3C2410 的UART 口并沒有引出DCD、 DTR、DSR 和RI 信號引腳,要通過SIM300 無線聯網,最好使用全部的信號引腳,所以我們使用PHILIPS 的SC16C550 從S3C2410 上擴展出標準的UART 接口與
SIM300 的UART 接口進行連接。CAN/GPRS 網關主要通信模塊的硬件電路原理圖如圖3 所示。
4 CAN/GPRS 無線車載網關軟件實現
4.1 ARM-Linux 操作系統移植.使用韓國 MIZI 公司開發的VIVI 作為bootloader、選擇2.6 內核的ARM-Linux 作為嵌入式操作系統,并用busybox 制作Linux 的根文件系統。在K9F1208 NAND Flash 芯片上存儲區域的劃分如表1 所示。
4.2 ARM-Linux 下SPI 驅動程序編寫
使用 S3C2410 自帶的SPI 通道0 與MCP2510 進行通信,其SPI 驅動程序流程[3]如下:
(1)寫SPPRE0 寄存器,設置波特率。
(2)寫SPCON0 寄存器,設置數據傳輸為0,0SPI 模式。
(3)向SPIDAT0 寄存器寫10 次0xFF,以初始化MCP2510。
(4)設置GPIO 引腳,用來充當片選,設定低電平以激活MCP2510。
(5)檢查SPSTA0 寄存器的發送狀態位REDY 是否為1,若是,則可以向SPTDAT0 寄存器寫數據并發送出去。
(6)SPCON0 寄存器的TAGD 不使能,向SPTDAT0 寄存器寫入0xFF,在確認REDY 有效后,可從SPRDAT0 寄存器中讀數據;TAGD 使能,確認REDY 后,也可從SPRDAT0 寄存器中讀數據。
(7)設置GPIO 引腳,信號設為高電平,片選不使能。
4.3 ARM-Linux 下CAN 驅動程序編寫
因為 CAN 應用層協議是基于CAN2.0B 技術規范設計的,所以通信報文采用CAN2.0B擴展幀格式。
初始化:(1)發送0xc0 復位指令,MCP2510 復位;(2)進入配置模式,設置CAN 總線波特率,關中斷;(3) 設置屏蔽寄存器RXM(0、1)SID(L/H)、RXM(0、1)EID(8/0)和濾波寄存器RXF(0~5)SID(L/H)、RXF(0、1)EID(8/0)并啟動;(4)設置CAN 設備為普通模式并切換到正常模式;(5)清空接收和發送緩沖區。(6)開啟接收或發送緩沖區,開啟中斷。發送報文:(1)寫標識符寄存器TXB(0~2)SID(L/H)、TXB(0~2)EID(8/0);(2)向發送緩沖器數據長度寄存器TXB(0~2)DLC 寫入要發送的報文長度;(3) 寫數據時,需依次向MCP2510 發送0x02 寫指令、發送緩沖器數據寄存器TXB(0~2)DM 的8 位地址碼和需要發送的報文數據;(4)必須進行發送有效性檢測,即:檢測發送緩沖器控制寄存器TXB(0~2)CTRL 的TXREQ 位。為1 時,說明正在發送報文,須等待;當此報文發送完畢后,該位將被自動清零,這時才可寫入下一個將要發送的報文數據。接收報文:(1) 向MCP2510 發送0xA0 狀態讀指令,并不斷檢測中斷標志寄存器CANINTF,當發現RX(0、1)IF 位為1,說明接收緩沖器已收到報文;(2)這時可從接收緩沖器標識符寄存器中讀出幀的ID,從接收緩沖器數據長度寄存器RX(0、1)BDLC 讀出收到的報文長度;(3)讀數據時,需依次向MCP2510 發送0x03 讀指令、接收緩沖器數據寄存器RXB(0、1)DM 的8 位地址碼后MCP2510 才會將數據通過SO 引腳發送出來。讀完數據,RX(0、1)IF 位需清零。
4.4 ARM-Linux 下串口驅動程序修改及加載
因為我們使用的是與 16c550 寄存器兼容的UART 控制器芯片SC16C550,所以需要加載其在Linux 下的驅動程序serial_8250.c。但SC16C550 芯片是通過外部總線和S3C2410 微處理器連接的,所以在驅動程序的serial8250_isa_init_ports 函數中需加入對SC16C550 芯片所在Bank 空間的初始化,包括設置讀/寫時序、速度和總線寬度等信息[4]。
4.5 ARM-Linux 下GPRS 聯網
GPRS 通過PPP(Point-to-Point Protocol,點對點協議)來完成聯網。PPP 是在直接連接的串行鏈路上創建和運行IP 網際協議或其他網絡協議的一個方案。在ARM-Linux 下對PPP的支持需要內核和應用程序配合管理。對于Linux2.6 內核,在配置內核時需要選擇對PPP的支持,如:在Network device support 菜單下,選擇支持PPP 協議、PPP 異步/同步串口通信和PPP 壓縮。此外,還需要移植Linux 下PPP 的應用程序工具包,即把交叉編譯后得到的pppd、chat 程序加入根文件系統。在根文件系統的/etc/ppp 目錄下,還需編寫3 個腳本文件:options(pppd 配置腳本)、gprs-connect(pppd 連接腳本)、gprs-disconnect(pppd 斷開腳本)。在options 腳本中需指定串口控制臺設備/dev/ttse/0、連接波特率115200、連接和斷開腳本的存放路徑; 在gprs-connect 腳本中運行chat 程序, 并指定APN 接入點, 如:'AT+CGDCONT=1,"IP","CMNET","",0,0'和ISP 呼叫號碼:'ATD*99***1#'等。這樣系統啟動
后,直接使用pppd &命令即可實現GPRS 無線接入互聯網。
4.6 CAN 應用層協議與UDP 或TCP 協議轉換
因為 GPRS 網絡是建立在TCP/IP 協議基礎上的,所以通過GPRS 網絡與Internet 遠程服務器通信可以使用UDP 或TCP 協議。由于S3C2410 上不僅移植了Arm-Linux 操作系統,其本身已支持TCP/IP 協議,而且我們也把CAN 的應用層協議加載了上去。所以在網關上無線發送數據時,只需將汽車CAN 網上的CAN 數據包數據域中的數據加上UDP 或TCP包頭即可發送出去;當在網關上無線接收數據時,只需去掉UDP 或TCP 數據包的包頭,得
到的數據可以遵照CAN 應用層協議的報文格式向CAN 網上發送。協議轉換如圖4 所示。
4.7 心跳程序的實現
因為 CAN/GPRS 無線網關與Internet 遠程服務器通信時,可能會出現連接的異常情況,所以需要使用心跳程序來檢測異常情況的發生,并通過心跳程序重新撥號來保證無線通信鏈路的正常連接[5]。我們可以定時Ping 遠程服務器,若能Ping 通,則表示無線通信鏈路工作正常;若多次無法Ping 通,則必須斷開連接,重新撥號。
5 結論
本文詳細介紹了 CAN/GPRS 無線車載網關的實現,所實現的網關在實驗通信網絡中能較好地完成汽車內部CAN 網數據信息與外界的交互任務,并能長時間穩定運行,基本上達到了工作要求。
本文作者創新點:在CAN/GPRS 無線車載網關上能成功地運行ARM-Linux 嵌入式操作系統、心跳程序和底層硬件驅動程序,完成了CAN 應用層協議與TCP 或UDP 協議的轉換,使得汽車內部CAN 網能與外界進行無線數據通信。
評論