基于單片機的CAN與RS-232轉換器設計
1.概述
本文引用地址:http://www.j9360.com/article/173900.htmCAN(Controller Area Network)總線是德國BOSCH公司為解決現代汽車中眾多控制與測試之間的數據交換開發的一種串行數據通信協議,是一種多主方式的串行通信總線。CAN總線是一種開放式、數字化、多點通信的控制系統局域網,具有通信速率高、傳輸時間短、傳輸距離遠、糾錯能力強、控制簡單、擴展能力強以及性價比高等特點,是目前國際上應用最廣泛的現場總線之一。
基于CAN總線的CAN控制器具有完成CAN總線通信協議所要求的全部必要功能,因此CAN控制器與其它微處理器的接口成為設計CAN總線系統的首要工作。實際中很多設備帶有RS-232接口,為了方便具有RS-232接口的設備與CAN總線的數據通信,本文完成了基于單片機控制的CAN總線與RS-232轉換器電路設計和軟件設計,實現了CAN總線數據與RS-232接口設備的數據傳輸。
CAN總線與RS-232轉換器電路包括:主控制模塊、RS-232接口轉換電路和CAN控制模塊3個主要部分。
主控制模塊的功能是處理CAN總線以及RS-232接口的數據通信和控制,本設計應用AT89C51完成對轉換器各個接口的控制,實現CAN總線和RS-232接口兩種協議數據幀的轉換,使用帶有SPI總線接口的X25045實現硬件看門狗功能。主控模塊電路如圖1所示。
RS-232接口電路由MAX232芯片構成,實現將單片機串口的TTL電平與RS-232電平的相互轉換,完成RS-232接口信息的輸入輸出傳輸。
CAN控制器模塊,主要完成CAN協議的物理層和數據鏈路層協議的實現。其中物理接口采用PCA82C250芯片實現物理層的電平轉換和傳輸。CAN控制器使用SJA1000芯片,完成數據鏈路層功能,實現CAN總線信息的輸入輸出傳輸。
AT89C51是CAN總線與RS-232轉換器的控制器,提供以下標準功能:4k字節Flash閃速存儲器,1000次可擦寫周期,三級加密程序存儲器,128字節內部RAM,32個I/O口線,兩個16位定時/計數器,一個5向量中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM、定時/計數器、竄行通信口及中斷系統繼續工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止所有部件工作直到下一個硬件復位。
AT89C51使用的晶振信號由SJA1000提供(SJA1000用24MHz的片外晶振),SJA1000的CLKOUT引腳接入MCU的XTAL1引腳。
由于CAN總線速率與RS-232接口速率并不相同,因此本設計中增加了片外RAM芯片6116,用作轉換雙方的數據緩沖區。設計中使用P2.7接反向器連接6116的片選端,所以接口轉換電路中的片外RAM的起始地址實際上應為0X8000。
圖1 主控制模塊電路原理圖
2.1 AT89C51與RS-232轉換接口電路設計
應用MAX232芯片構成RS-232的接口轉換電路,實現AT89C51串口的TTL電平與RS-232電平的相互轉換。其中R1out和T1in引腳接單片機的RXD引腳和TXD引腳,R1in和T1out作為RS-232接口輸出連接標準DB9接口的引腳2和引腳3。DB9接口引腳5接地。為了使MAX232芯片正常工作,還需要外接4個1μF的電容用于芯片升壓,以完成電平轉換。
2.2 SJA1000與AT89C51接口電路設計
圖2 SJA1000與AT89C51接口電路原理圖
CAN控制器SJA1000芯片采用片外24MHz晶振,其CLKOUT引腳輸出工作頻率接入微處理器的XTAL1引腳。片選/CS端與單片機的P2.7引腳直接相連,因此SJA1000的尋址空間從地址0開始。AD0~AD7直接與AT89C51的低8位數據/地址復用口P0口相連,MODE接高電平設置為Intel模式,中斷輸出信號/INT與微處理器的/INT0連接,使CAN通信可以采用中斷和查詢兩種方式。TLP113的外接390Ω電阻為限流保護電阻,為避免當驅動器失效時出現過流導致控制器損壞。SJA1000與AT89C51接口電路如圖2所示。
2.3 CAN總線物理層接口電路設計
PCA82C250與CAN總線的接口部分采用一定的安全和抗干擾措施。CANH和CANL與地之間并聯了兩個30P的小電容,可以起到濾除總線的高頻干擾和一定的防電磁輻射的能力。另外在兩根CAN總線接入端與地之間分別反接一個保護二極管,當CAN總線有較高的負電壓時,通過二極管的短路可起到一定的過壓保護作用。PCA82C250的Rs腳上接有一個斜率電阻,電阻大小可根據總線通訊速度適當調整,一般在16K~140K之間。用光電隔離芯片TLP113將CAN控制器SJA1000和收發器PCA82C250隔離,以便有效地增加通訊距離和抗干擾能力。CAN總線物理層接口電路如圖3所示。
3.基于單片機控制的CAN總線與RS-232轉換器軟件設計
主程序分為初始化和循環檢測兩個主要部分。初始化部分完成對看門狗電路及RS-232 串口和CAN總線的初始化并開啟INT0中斷和串口中斷。循環檢測部分通過調用CAN總線接收函數(CAN_Receive())和RS-232接收函數(RS232_Receive())檢測緩沖區內是否收到到數據,如果有數據接收則調用RS-232發送函數(RS232_Send())和CAN總線發送函數(CAN_Send())轉發數據。數據的發送和接收都是通過中斷來進行的。每次循環檢測結束通過調用rst_wdog函數使看門狗復位。此外,由于CAN總線的速率與RS-232接口的速率并不相同,因此還需設置片外的存儲器(RAM),用于轉換雙方的數據緩沖區。主程序流程圖如圖4所示。
3.1 基于RS-232協議的數據接收與發送程序設計
由于RS-232接口發送數據是以字節為單位,而CAN總線接收數據以多字節組成的數據幀為單位,因此為了避免指針指向的混亂,程序中統一使用相同長度的通用幀來保存數據。RS-232協議模塊將通用的幀使用SLIP協議進行封裝后發送,并將接收到的SLIP幀轉為通用幀格式轉入緩沖區。系統啟動后,主程序調用RS232_Receive函數檢測CAN接收緩沖區的內容,如果緩沖區內有數據,則調用RS_Read()函數讀取緩沖區中的一幀數據并將其送入RS232_Receive()函數參數buf指向的緩沖區后返回。在讀取CAN接收緩沖區數據后會交由RS232_Send()函數發送,并將幀數據保存至臨時發送緩沖區bufRS_S。程序通過ChkEndR()函數檢測數據幀是否發送完畢。
圖4 CAN總線與RS-232轉換器主程序流程圖
3.2 CAN控制器SJA1000初始化程序設計
CAN控制器SJA1000完成CAN總線幀的發送和接收任務。程序中,使用INITCAN()函數完成對CAN接口芯片的初始化。初始化程序設計對轉換器的正常工作相當重要。它主要完成模式設置、時鐘輸出寄存器設置、接受碼寄存器ACR設置、接收屏蔽碼寄存器AMR設置、總線定時器設置和輸出控制寄存器設置。
3.3 基于CAN總線協議的數據接收與發送程序設計
主程序啟動后調用CAN_Recive()函數檢查CAN接收緩沖區中是否有數據存在,如果檢查到數據,則程序從緩沖區中讀取一幀數據并將其送入參數buf指定的緩沖區中。主程序如果發現RS-232接收緩沖區內有數據,則讀取該數據幀并將其交由CAN_Send()函數發送至CAN總線。這里CAN_Send()函數接收到的數據幀格式為通用幀格式,需要先將其中的DesDevID SouDevID Length 等信息從通用幀中提取出來,填入CAN總線格式幀的各個位置,再通過命令寄存器傳遞發送請求。此外,主程序通過ChkEndC()函數檢測數據幀是否發送完畢。
4. 結論
本設計完成了CAN總線與RS-232轉換器的電路與軟件設計。本設計的創新點是:由于CAN總線與RS-232接口數據通信速率以及通信幀格式都不同,本設計最大優點是解決了這兩點不同,從而實現了數據在CAN總線與RS-232接口之間的傳輸。在設計中由于使用了CAN總線進行數據傳輸這就使得通信方式多主性。網絡上任意節點可以任意時刻主動地向網絡上其他節點發送信息而不分主從。可以點對點,點對多點或全局廣播方式發送和接收數據。
圖4 CAN總線與RS-232轉換器主程序流程圖
評論