汪雙印 葉 峰 劉 順 陳 衡 魏紹明
(中廣核檢測技術有限公司,江蘇 蘇州 215004)
基于STM32的CAN轉(zhuǎn)USB模塊設計
汪雙印 葉 峰 劉 順 陳 衡 魏紹明
(中廣核檢測技術有限公司,江蘇 蘇州 215004)
在有關CAN總線通信的嵌入式設計中,經(jīng)常需要PC機作為調(diào)試工具,以便在PC機上直觀地觀察數(shù)據(jù),這就需要CAN轉(zhuǎn)USB設備進行連接。筆者選用低成本的內(nèi)部集成了CAN控制器和串口的ARM內(nèi)核32位處理器STM32作為主體芯片完成CAN轉(zhuǎn)USB模塊的設計。該模塊速度快、可靠性高,能夠滿足大部分場合的要求。
CAN總線 STM32芯片 CAN轉(zhuǎn)USB
控制器局域網(wǎng)總線(Controller Area Network,CAN)是由德國Bosch公司為汽車應用而開發(fā)的多主機串行通信協(xié)議。由于它具有抗干擾能力強、可靠性高、實時性好及易于使用等特點,已經(jīng)廣泛應用于工業(yè)自動化、交通工具、醫(yī)療儀器及樓宇自動化等多個領域[1]。CAN總線是唯一成為國際標準的現(xiàn)場總線。CAN總線具有以下特點:多主控制,總線空閑時所有單元節(jié)點都可發(fā)送消息;數(shù)據(jù)傳輸距離遠,低速下最遠距離可達10km;傳輸速率高,最高速度可達1Mb/s;無破壞的基于標識符的優(yōu)先級仲裁,仲裁失利后轉(zhuǎn)為接收;可靠的錯誤檢測與診斷,具有錯誤通知和恢復功能,支持自動重發(fā);系統(tǒng)的柔軟性強,增減節(jié)點不影響其他節(jié)點[2]。正是基于以上的優(yōu)點,使得CAN總線在工業(yè)現(xiàn)場應用廣泛。而大多數(shù)CAN總線的使用場合都以電腦作為上位機采集數(shù)據(jù),故需要使用CAN轉(zhuǎn)USB模塊進行接口轉(zhuǎn)換。因此,筆者給出了一種高可靠性、低成本的CAN轉(zhuǎn)USB的設計方案。
首先通過CAN收發(fā)器的CAN_H和CAN_L將STM32連入CAN網(wǎng)絡中。收發(fā)器負責從總線上進行數(shù)據(jù)的收發(fā),然后數(shù)據(jù)通過STM32內(nèi)部集成的CAN控制器進行邏輯處理,得到的數(shù)據(jù)進行組織后再通過TTL轉(zhuǎn)芯片USB(CH340G)與電腦的虛擬串口進行通信。整體模塊結(jié)構(gòu)框圖如圖1所示。
圖1 整體模塊結(jié)構(gòu)框圖
2.1STM32F103C8T6微控制器
STM32F103C8T6芯片是由ST公司推出的基于ARM Cortex-M3內(nèi)核的32位MCU,最高頻率72MHz。該控制器集成度高,片上外設豐富,集成單周期硬件乘法器。內(nèi)部集成多個定時器,支持3路串口。它本身集成了CAN控制器,支持CAN協(xié)議2.0A和2.0B,位通信比特率可達1Mbit/s,完全符合J1939規(guī)范[3]。
STM32內(nèi)部的CAN控制器有如下特性:比特率最高1Mbit/s;發(fā)送方面,內(nèi)部有3個發(fā)送郵箱,發(fā)送報文的優(yōu)先級可配置;接收方面,兩個3級深度的FIFO,14組過濾器,支持標識符列表和標識符屏蔽模式。這樣在報文的處理上可最大程度地減少CPU的開銷。
2.2SN65HVD230 CAN收發(fā)器
SN65HVD230芯片為德州儀器推出的3.3V電壓的高速CAN收發(fā)器,支持ISO 11898標準,最高速度可達1Mbit/s,最多支持120個節(jié)點,具有良好的抗干擾能力和高可靠性,具有熱保護,抗瞬間干擾,開路失效保護功能。CAN收發(fā)器的電路設計如圖2所示。圖2中P4 Header為兩腳插針,可用跳線帽來決定本模塊接入CAN總線后是否啟用R4終端電阻。
圖2 CAN收發(fā)器電路
2.3CH340G TTL轉(zhuǎn)USB芯片
CH340G是一個USB總線的轉(zhuǎn)接芯片,可以實現(xiàn)USB轉(zhuǎn)串口、USB轉(zhuǎn)IrDA紅外或者USB轉(zhuǎn)打印口。在串口方式下,CH340還可以將普通的串口設備直接升級到USB總線。外圍元器件需求很少,只需要晶振和電容即可。硬件全雙工串口,支持通信比特率50bit/s~2Mbit/s,內(nèi)置收發(fā)緩沖區(qū)。電路設計如圖3所示。
圖3 CH340G電路
模塊的功能為實現(xiàn)CAN網(wǎng)絡與PC機通信,因此需設計相關的下位機軟件進行數(shù)據(jù)處理、發(fā)送等。軟件設計主要以KEIL MDK5作為集成開發(fā)環(huán)境,PC機端軟件可以采用現(xiàn)成的串口助手。下位機軟件流程框圖如圖4所示。
圖4 下位機軟件流程
程序開始,首先進行相關的片上外設初始化,需要初始化的有系統(tǒng)時鐘、CAN控制器相關寄存器、串口相關寄存器及中斷向量表等。然后程序進入main()函數(shù)中的主循環(huán)。主循環(huán)中包含CanConfig()、UartConfig()、CanToUartProcess()、UartToCanProcess()、UartSend()及CanSend()等函數(shù)。
當PC機有數(shù)據(jù)通過串口發(fā)送到STM32時,會產(chǎn)生串口接收中斷。PC機每次發(fā)送15個Byte(除掉了起始和結(jié)束標志),Byte0用于區(qū)分后續(xù)的數(shù)據(jù)是配置數(shù)據(jù)還是需要發(fā)送到CAN總線上的數(shù)據(jù),若為配置數(shù)據(jù),則調(diào)用CanConfig()、UartConfig()函數(shù)對CAN的標識符、掩碼、幀格式、幀類別和串口的比特率及停止位等信息按后續(xù)14Byte數(shù)據(jù)的要求進行配置;若為要發(fā)送到CAN總線上的數(shù)據(jù),則后續(xù)的14Byte遵循如下格式(可由上位機軟件按此格式生成):將ID(報文標識符,標準幀11位,擴展幀29位)、IDE(區(qū)分擴展標識符和標準標識符)和RTR(區(qū)分數(shù)據(jù)幀和遠程幀)最多共計31bit數(shù)據(jù)放入Byte1~Byte4中,DLC(數(shù)據(jù)字節(jié)數(shù))放入Byte5中,DATA0~7(數(shù)據(jù))共計8Byte數(shù)據(jù)存入Byte6~Byte13中,最后為了防止數(shù)據(jù)出錯將所有數(shù)據(jù)進行求和校驗放入Byte14中。串口接收完15Byte后將數(shù)據(jù)存入temp[0]~temp[14],此時可以對數(shù)據(jù)求校驗和來與temp[14]比較,查看數(shù)據(jù)是否出錯,未出錯則調(diào)用UartToCanProcess()將數(shù)據(jù)提取出來,放入CAN控制器的發(fā)送郵箱中,然后調(diào)用CanSend()將報文發(fā)送到CAN總線上,至此由PC機到CAN總線的數(shù)據(jù)發(fā)送完畢。
當有CAN接收FIFO中斷產(chǎn)生后,說明標識符過濾已經(jīng)通過,得到的都是需要的報文,CanToUartProcess()函數(shù)將接收到的報文信息進行提取,將得到的ID、IDE、RTR、DLC、DATA[0]~DATA[7]重新組織,放在一個unsigned char buff[14]中,將ID、IDE和RTR最多共計31bit數(shù)據(jù)放入buff[0]~buff[3]中,DLC放入buff[4]中,將DATA0~7共計8byte數(shù)據(jù)存入buff[5]~buff[12]中,最后為了防止數(shù)據(jù)出錯將所有數(shù)據(jù)進行求和校驗放入buff[13]中。組織完成之后,利用UartSend()函數(shù),將數(shù)據(jù)加上起始和結(jié)束標志后發(fā)送出去,這樣CAN總線中的數(shù)據(jù)發(fā)送到PC機就完成了。當PC機接到數(shù)據(jù)后可以選擇是否利用buff[13]對數(shù)據(jù)進行校驗。
將設計的模塊與另一CAN節(jié)點相連接,該節(jié)點為一單片機不停地向CAN總線發(fā)送8Byte標準幀數(shù)據(jù)1、2、3、4、5、6、7、8,ID為0x211。PC機連接上模塊后,利用串口助手接收的數(shù)據(jù)如圖5所示。
圖5 串口助手接收到的CAN數(shù)據(jù)
收到的數(shù)據(jù)中AA為起始和結(jié)束標志,由于ID為0x211,數(shù)據(jù)幀RTR為0,標準幀IDE為0,這樣得到前4位數(shù)據(jù)位分別為42(標準幀ID前8位)、20(標準幀ID后3位+擴展幀ID前5位得到)、0(擴展幀ID中間8位)、0(擴展幀ID后5位+0+IDE+RTR)、08(DLC),后面緊接著的8位為數(shù)據(jù)內(nèi)容,之后的8E是除了起始和結(jié)束標志之外的所有數(shù)據(jù)的校驗和。實驗結(jié)果與設計相吻合。
基于STM32 32位ARM內(nèi)核微控制器設計CAN轉(zhuǎn)USB模塊,很好地利用了微控制器內(nèi)部豐富的片上外設,72MHz的頻率使處理高速度的數(shù)據(jù)也不會有任何延遲。直接使用內(nèi)部的CAN控制器、USART串口模塊、外部的CAN收發(fā)器和USB轉(zhuǎn)TTL芯片進行相關設計,整體設計硬件簡單,軟件穩(wěn)定可靠,并且用戶可根據(jù)自身需求編寫相應的上位機軟件,電腦上基于虛擬串口二次開發(fā)容易,是不錯的低成本CAN轉(zhuǎn)USB的解決方案。
[1] 高軍,劉曉莉,趙延明.基于LPC2292的CAN總線USB接口適配器的設計[J].化工自動化及儀表,2007,34(4):49~52.
[2] 牛躍聽,周立功,方丹.CAN總線嵌入式開發(fā)-從入門到實踐[M].北京:北京航空航天大學出版社,2012:3~8.
[3] 張河新,王曉輝,黃曉東.基于STM32和CAN總線的智能數(shù)據(jù)采集節(jié)點設計[J].化工自動化及儀表,2012,39(1):78~80.
DesignofCAN-USBConversionBasedonSTM32
WANG Shuang-yin, YE Feng, LIU Shun, CHEN Heng, WEI Shao-ming
(CGNPCInspectionTechnologyCo.,Ltd.,Suzhou215004,China)
In the embedded design concerning CAN bus, PC as a debugging tool and data displayer asks for CAN-USB conversion. The commercial conversion always cost too much and it’s difficult to popularize in low cost applications. The STM32 micro controller which internally integrating CAN controller and serial port controller was adopted to implement CAN-USB conversion. This module can satisfy most application because of high running speed and high reliability.
CAN bus, STM32 chip, CAN-USB conversion
TH862
A
1000-3932(2016)11-1189-04
2016-09-30(修改稿)