基于C8051F040的CAN總線與RS-232通信設計
摘要:為了實現(xiàn)對CAN總線和RS-232串口雙向通信需求,提出了一種基于C8051F040單片機的數(shù)據(jù)通信方案,并完成系統(tǒng)設計。分析了CAN總線和RS-232串口的通信特點,介紹了單片機硬件,并對軟件的設計思路與流程做了詳盡描述,完成功能檢測。實驗結果表明,該設計達到了要求。
目前工業(yè)設備之間的通信很多采用RS-232接口,但由于RS-232通信距離短、接口易損,而且只能進行點到點通信,不能直接組成多點通信網(wǎng)絡。而CAN通信速率高、容易實現(xiàn)、且性價比高等諸多特點,本文介紹一種可以實現(xiàn)RS-232與CAN總線通信的方法,以更好地適應現(xiàn)代工業(yè)發(fā)展的需要。
控制器局域網(wǎng)CAN(Controller Area Network)是德國Bosch公司為解決現(xiàn)代汽車中眾多的控制與測試儀器之間的數(shù)據(jù)交換而應用開發(fā)的一種通信協(xié)議。在國外,尤其是歐洲,CAN網(wǎng)絡已被廣泛地應用在汽車上,如BENZ、BMW、PORSCHE、ROLLS、ROYCE、JAGUAR等車。
它是一種串行通信網(wǎng)絡,支持分布式實時控制,最大傳輸速度可達1 Mbids,最大傳輸距離為10 km。CAN規(guī)范已被ISO國際標準組織制訂為國際標準,即CAN標準,現(xiàn)在最常用的是2.0標準,分為2.0A和2.0B。其區(qū)別僅在通信數(shù)據(jù)位數(shù),前者是11位的標準幀,后者是29位的擴展幀。CAN協(xié)議建立在國際標準組織的開放系統(tǒng)互連參考模型基礎上的,主要工作在數(shù)據(jù)鏈路層和物理層,用戶可在其基礎上開發(fā)適合系統(tǒng)實際需要的應用層通信協(xié)議。而串口RS-232作為標準計算機串行接口,與CAN網(wǎng)的結構、通信協(xié)議、傳輸特性等方面都不相同,所以不同設備間無法進行直接通信。因此實現(xiàn)二者之間的信息數(shù)據(jù)交互成為問題的關鍵。
本設計完成了CAN總線與RS-232軟件設計。本設計的創(chuàng)新點是:CAN總線與RS-232接口數(shù)據(jù)通信速率以及通信幀格式都不同,解決了這兩點不同,從而實現(xiàn)了數(shù)據(jù)在CAN總線與RS-232接口之間的交互傳輸。本文完成了基于C8051F040單片機控制的CAN與RS-232轉換的研究與設計,設計了C8051F040單片機對RS-232串口和CAN總線的控制,解決了CAN總線與RS-232接口數(shù)據(jù)通信速率以及通信幀格式不同的技術問題,實現(xiàn)了RS-232接口數(shù)據(jù)與CAN總線數(shù)據(jù)的相互傳輸。
1 概述
1. 1 CAN總線
Silicon Labs CAN的工作位速率可達1M位/秒,實際速率可能受CAN總線上所選擇的傳輸數(shù)據(jù)的物理層的限制。CAN處理器有32個消息對象,可以被配置為發(fā)送或接收數(shù)據(jù)。輸入數(shù)據(jù)、消息對象及其標識掩碼存儲在CAN消息RAM中。
標準CAN的標志符長度是11位,而擴展格式CAN的標志符長度可達29位。CAN協(xié)議2.0A版本規(guī)定CAN控制器必須有一個11位的標識符。而2.0B版本中規(guī)定,CAN控制器的標志符長度可以是11位或者29位。遵循CAN2.0B協(xié)議的CAN控制器可以發(fā)送和接收11位標識符的標準格式報
文或29位標識符的標準格式報文。如果禁止CAN2.0B,則CAN控制器只能發(fā)送和接收11位標識符的標準格式報文,而忽略擴展格式的報文結構,但不會出現(xiàn)錯誤。C8051F040所集成的CAN控制器為2.0B。
數(shù)據(jù)幀是攜帶數(shù)據(jù)由發(fā)送器至接收器的幀,是CAN的4種幀格式之一,這4種幀格式分別是數(shù)據(jù)幀、遠程幀、出錯幀和超載幀,其中數(shù)據(jù)幀結構如圖1所示。
CAN總線數(shù)據(jù)幀由7個不同的位場組成:幀起始(stsrt of frame)、仲裁場(arbitration frame)、控制場(control frame)、數(shù)據(jù)場(data frame)、CRC場(CRC frame)、應答場(ACK frame)和幀結尾(end of frame)。數(shù)據(jù)場的長度可以為0。
1)幀起始:標志數(shù)據(jù)幀的起始,僅由一個“顯性”位組成,只在總線空閑時才允許節(jié)點開始發(fā)送信號;2)仲裁場:標準格式幀與擴展格式幀的仲裁場格式不同。標準格式里,仲裁場由11位識別符和遠程發(fā)送請求位組成,識別符位為ID-28~ID-18。擴展格式里,仲裁場包括29位識別符、替代遠程請求位、識別符擴展位和遠程發(fā)送請求位。其識別符為ID-28~ID-0;3)控制場:由6個位構成,前2位為保留位,為顯性,后4位為數(shù)據(jù)長度碼,表示數(shù)據(jù)場中數(shù)據(jù)的字節(jié)數(shù),必須在0~8范圍內(nèi)變化;4)數(shù)據(jù)場:由被發(fā)送數(shù)據(jù)組成,數(shù)目為控制場中決定的0~8個字節(jié),第一個字節(jié)的最高位首先被發(fā)送;5)CRC場:包括CRC序列和CRC界定符;6)ACK場:長度為2位,包含應答間隙和應答界定符;7)幀結尾:由7個位“隱形”位組成,此期間無位填充。
1. 2 RS-232
RS-232是PC機與通信工業(yè)中應用最廣泛的一種串行接口,具有連線簡單、通訊距離長等優(yōu)點。同樣也有一些缺點,接口的信號電平值較高,易損壞接口電路的芯片,傳輸速率較低,傳輸距離有限等。RS-232被定義為在低速率串行通訊中增加通訊距離的單端標準。RS-232采取不平衡傳輸方式,即所謂單端通訊。UART通信可用查詢TI和RI或通過中斷來控制通信。UART有兩種中斷源:數(shù)據(jù)發(fā)送完畢時,TI置1;數(shù)據(jù)完整接受到時,RI置1。TI和RI中任何一個標志位置1,均能引發(fā)UART中斷。TI和RI中斷標志位需軟件清0。
2 系統(tǒng)硬件描述
Cygnal公司的51系列單片機C8051F040是集成在一塊芯片上的混合信號系統(tǒng)級單片機,在一個芯片內(nèi)集成了構成一個單片機數(shù)據(jù)采集或控制的智能節(jié)點所需要的幾乎所有模擬和數(shù)字外設以及其他功能部件,代表了目前8位單片機控制系統(tǒng)的發(fā)展方向。芯片上有1個12位多通道ADC,2個12位DAC,2個電壓比較器,1個電壓基準,1個32kB的FLASH存儲器,與MCS-51指令集完全兼容的高速CIP-51內(nèi)核,峰值速度可達25 MIPS,并且還有硬件實現(xiàn)的UART串行接口和完全支持CAN2.0A和CAN2.0B的CAN控制器。
控制器局域網(wǎng)(CAN2.0B)控制器,具有32個消息對象,每個消息對象有其自己的標識全速、非侵入式的在系統(tǒng)調(diào)試接口 (片內(nèi))。C8051 F040器件內(nèi)部有一個控制器局域網(wǎng)(CAN)控制器,使用CAN協(xié)議實現(xiàn)串行通信。該CAN控制器符合Bosch規(guī)范2.0A(基本CAN)和2.0B(全功能CAN),方便了CAN網(wǎng)絡通信設計。CAN控制器包含一個CAN核、消息RAM(獨立于C8051的RAM)、一個消息處理狀態(tài)機以及控制寄存器。CAN控制器可以工作在高達1M位/秒的位速率。Silicon Labs的CAN有32個消息對象,每個消息對象有其自己的標識掩碼,該標識掩碼用于對接收到的消息進行過濾。輸入數(shù)據(jù)、消息對象和標識掩碼存儲在CAN消息RAM中。與數(shù)據(jù)發(fā)送和接收過濾有關的所有協(xié)議處理均由CAN控制器完成,不需C8051 MCU干預。這就使得用于CAN通信的CPU帶寬最小。C8051通過特殊功能控制器(SFR)配置CAN控制器,讀取接收的數(shù)據(jù),寫入要發(fā)送的數(shù)據(jù)。
C8051F040的MCU內(nèi)部有兩個增強型全雙工UART、一個增強型SPI總線和SMBus/I2C。每種串行總線都完全用硬件實現(xiàn),都能向CIP-51產(chǎn)生中斷,因此需要很少的CPU干預。這些串行總線不“共享”定時器、中斷或端口I/O等資源,所以可以使用任何一個或同時使用多個。
CAN總線數(shù)據(jù)和RS-232串口數(shù)據(jù)的速率、數(shù)據(jù)格式都不同,為實現(xiàn)相互傳輸?shù)墓δ苄枨?,就需要RAM緩存。硬件結構圖如圖2所示。
3 軟件設計
系統(tǒng)采用Keil uVision4軟件編程,Keil uVision4是ARM公司推出軟件開發(fā)平臺,其編譯器、調(diào)試工具實現(xiàn)與ARM器件的完美匹配。程序由初始化和死循環(huán)兩部分構成。初始化完成對器件數(shù)據(jù)設置,循環(huán)完成數(shù)據(jù)在RS-232和CAN總線之間的雙向通信。
3. 1 初始化
初始化就是通過單片機向其片內(nèi)的各個寄存器寫入控制字的過程。void RS232_INI()函數(shù)設置UART為模式1,8位可變波特率通信。void CAN_INI()函數(shù)用來初始化CAN,總線接收、發(fā)送信道,并設置波特率。
3.2 RS-232轉CAN總線
RS-232傳輸1字節(jié),而CAN總線傳輸?shù)氖?字節(jié),這要求在通信過程中實現(xiàn)數(shù)據(jù)匹陪、格式匹配。該模塊采用,在串口接收中斷中,直接把接收到的串口數(shù)據(jù)存到8字節(jié)的緩存中,計數(shù)滿八位。則標志位置1,主函數(shù)中調(diào)用函數(shù)send_can1(),將數(shù)據(jù)發(fā)送到CAN總線。從而實現(xiàn)將數(shù)據(jù)從RS-232傳輸?shù)紺AN總線的功能。流程圖如圖3所示。
3.3 CAN總線轉RS-232
CAN總線數(shù)據(jù)發(fā)送到串口,原理相同,過程相反。CAN總線的數(shù)據(jù)接收也是在中斷中實現(xiàn),這樣實時性好。CAN總線的接收緩存中有數(shù)據(jù),則這8個字節(jié)的數(shù)據(jù)依次調(diào)用RS-232功能函數(shù)void RS232_PUTCHAR(),發(fā)送到串口。從而實現(xiàn)將數(shù)據(jù)從CAN總線傳輸?shù)絉S-232串口的功能。流程圖如圖4所示。
4 實驗檢測
為了驗證設計的正確性,文中使用Kvaser CanKing和SecureCRT軟件來測試。Kvaser CanKing用來接收、發(fā)送CAN總線數(shù)據(jù),SecureCRT用來接收、發(fā)送串口數(shù)據(jù),二者都有顯示功能。實驗結果如圖5所示,其證實了設計的正確性。
5 結束語
數(shù)據(jù)通信在嵌入式系統(tǒng)的功能中占據(jù)重要地位,串口通信與CAN總線相互通信都具有各自的重要作用,而兩者的交互通信也越來越重要,本文的設計功能明確、結構簡單、具有很強的通用性和實用性,并通過了測試驗證。