摘 要:隨著現場總線技術和計算機外設接口技術的發展,現場總線與計算機快速有效的連接又有了更多的方案,USB作為一種新型的接口技術,以其簡單易用、速度快等特點而備受青睞。本文簡要提出了USB 接口與CAN總線連接方案,論述了系統的硬件構成,固件開發和驅動程序等內容。
關鍵詞:現場總線; USB; CAN總線
引 言:
隨著信息技術的飛速發展,各種數據的實時采集和處理在現代工業控制中已成為必不可少的部分。這要求我們設計的接口簡單靈活且具有較高的數據傳輸率。現場總線是連接智能現場設備和自動化系統的數字式、雙向傳輸、多分支結構的通信網絡。如何將其與PC機安全可靠低成本的互連,是一個亟待解決的問題。傳統的外設與主機的通信接口難以滿足上述要求。這些接口一般采用PCI總線或RS-232串行總線。PCI總線雖然有很高的傳輸率(可達132Mbps),但是它們的擴充槽相當有限,且設計復雜。RS-232串行總線連接方便,可是它的帶寬非常有限,傳輸速度慢。USB技術正是順應這一要求提出的一種快速的,雙向的,同步傳輸的,廉價的并可以進行熱插拔的通用串行總線。它還提供了內置電源,可向低壓設備提供5伏的電源。正是由于USB的這些特點,使其獲得了廣泛的應用。CAN總線是現場總線的一種有效支持分布式控制或實時控制的串行通信網絡,具有卓越的特性和極高的可靠性,特別適合工業過程監控設備的互連,被公認為幾種最有前途的現場設備總線之一。
整個系統設計目的就是設計一個適配器,可以將CAN總線數據通過USB接口迅速轉送到PC機進行處理分析,也可以通過它向CAN節點傳送數據或命令,以實現計算機與現場設備的通訊。
一、硬件電路的設計
該系統主要由AT89C52控制電路、USB 接口電路、CAN總線電路、掛起復位電路、光電隔離電路等組成,本設計系統主要部件結構圖如下:
[align=center]

圖1 硬件電路結構圖[/align]
1.1 AT89C52控制電路
AT89C52 是一個低電壓,高性能CMOS 8位單片機,片內置8k bytes的可反復擦寫的Flash存儲單元和256 bytes的隨機存取數據存儲器(RAM),功能強大。89C52是該接口電路的控制核心,其中P0,P2口用做16位數據I/O口,P1,P3口用做控制。
1.2 CAN總線
在本系統中,CAN控制器采用Philips公司生產的SJA1000,它作為一個發送、接受緩沖器,實現主控制器和總線之間的數據傳輸;CAN收發器采用TJA1050芯片,它是CAN控制器和物理總線的接口,主要可以提供對總線的差動發送能力和對CAN控制器的差動接受能力。 在CAN總線結構中,總線的兩端還要配置兩個120Ω的電阻,其作用是總線匹配阻抗,可以增加總線傳輸的穩定性和抗干擾能力,減少數據傳輸中的出錯率。為了增強CAN總線節點的抗干擾能力,SJA1000的TXO和RX0可通過高速光耦6N137與TJA1050相連,這樣就很好的實現了總線上各節點的電氣隔離。光耦部分電源與CAN_V必須用小功率電源隔離模塊進行隔離,這樣就提高了節點的穩定性和安全性。
1.3 USB接口
本設計中的PDIUSBD12是一個性能優化的USB器件,通常用于基于微控制器的系統并與微控制器通過高速通用并行接口進行通信。
PDIUSBD12與MCU的接口有2種方式:多路地址/數據總線方式、單地址/數據總線方式。在這個系統中,我們采用的是前一種方式:使用了AT89C52的INT0、ALE、WR、RD和P0口,A0 腳接地,當PDIUSBD12接收到主機的有效信息時,會產生一個中斷通知89C52進行處理。若單片機的輸出地址為奇數,則表示對PDIUSBD12發送指令;若輸出地址為偶數,則表示對PDIUSBD12進行數據傳輸。AT89C52將數據經PDIUSBD12的并行接口送入FIFO存儲器。對一個單片機而言,PDIUSBD12看起來就像1個帶8位數據總線和1個地址位的存儲器件。控制CLKOUT 時鐘輸出為SJA1000提供時鐘輸入。由于在USB的信號傳遞過程中會摻雜進瞬間的高壓噪聲,這些噪聲對USB口的收發電路將產生致命的危害,因此需要對這些噪聲電壓進行抑制。在USB接口電路中使用了SN75240,它可以對USB接口中的不正常電壓進行有效的抑制,以保證硬件設備的安全。
二、微控制器的固件編程
2.1 CAN總線的軟件設計
CAN總線的三層結構模型為:物理層、數據鏈路層和應用層。其中物理層和數據鏈路層的功能由SJA1000完成,系統的開發主要在應用層軟件的設計上,它主要由三個子程序:初始化子程序、發送數據和接收數據程序。同時,還包括一些數據溢出中斷以及幀出錯的處理。
SJA1000在上電硬件復位之后,必須對其進行軟件初始化之后才可以進行數據通訊,初始化過程主要包括對其復位模式下配置時鐘分頻寄存器CDR、總線定時寄存器BTR0和BTR1、驗收代碼寄存器ACR、驗收屏蔽寄存器AMR及輸出控制寄存器OCR等,實現對總線的速率、驗收屏蔽碼、輸出引腳驅動方式、總線模式及時鐘分頻進行定義。下面為SJA1000發送和接收數據的流程,基本過程為主控制器將數據保存到SJA1000發送緩沖器,然后對命令寄存器的發送請求TR標志位進行置位開始發送;接收過程為SJA1000將從總線上接收到的數據存入接收緩沖器,通過其中斷標志位通知主控制器來處理接收到的信息,接收完畢之后清空緩沖器,等待下次接收[3]。
[align=center]

圖 2 CAN的發送數據流程[/align]
[align=center]

圖 3 CAN接收數據的流程[/align]
2.2 USB總線的軟件設計
PDIUSBD12 是一款帶有并行總線和局部DMA傳輸能力的高速USB 接口器件,它支持USB1.1協議的所有傳輸方式,在本設計中用到了控制傳輸,中斷傳輸和批量傳輸。控制傳輸處理主機到USB設備的控制信息,固定使用端點0。中斷傳輸用來傳送數據量很小,但需要及時處理,以達到實時效果的數據,使用端點1。批量傳輸用來實現CAN節點與主機之間大數據快傳送,使用主端點(端點2),一次最大可發送64字節。PDIUSBD12 的固件設計成完全的中斷驅動,當MCU 處理前臺任務時USB 的傳輸可在后臺進行。這就確保了最佳的傳輸速率和更好的軟件結構,同時簡化了編程和調試。后臺ISR 中斷服務程序和前臺主程序循環之間的數據交換通過事件標志和數據緩沖區來實現,當PDIUSBD12 從USB 收到一個數據包那么就對MCU 產生一個中斷請求,MCU立即響應中斷,在ISR中固件將數據包從PDIUSBD12 內部緩沖區移到數據緩沖區,并在隨后清零PDIUSBD12 的內部緩沖區,以使能接收新的數據包。MCU 可以繼續它當前的前臺任務,返回到主循環檢查循環緩沖區內是否有新的數據[1]。
[align=center]

圖4 PDIUSBD12固件編程結構圖[/align]
這部分程序結構可包括[4]:
1) 請求處理程序
對USB的標準設備請求進行處理和對用戶添加的廠商請求進行處理;USB設備接入主機后要進入復雜的設備列舉過程,并安裝正確的驅動程序。
2)硬件提取層
對單片機的I/O口、數據總線等硬件接口進行操作,該層包含最底層的函數,這些函數在不同的MCU 平臺上需要進行改變,
void outportb(unsigned char port,unsigned char val);
void inportb(unsigned char port);
對PDIUSBD12 所有的I/O 訪問都可由它們實現;
3)PDIUSBD12 命令接口
對PDIUSBD12器件進行操作的模塊子程序集,以簡化器件的編程;
4)中斷服務程序
當PDIUSBD12向單片機發出中斷請求時,讀取PDIUSBD12的中斷傳輸來的數據,并設定事件標志和Setup包數據緩沖區,傳輸給主循環。
5)主循環
發送USB請求,處理USB總線事件和用戶功能處理等。MCU 一旦上電就需要初始化其所有端口存儲區,中斷服務程序。在主循環程序中MCU 對事件進行輪詢,如有CAN總線發來的數據,則送往PDIUSBD12進行發送,如有USB總線數據,則啟動CAN發送程序,它們在接口的接收工作分別由各自的中斷程序完成。要注意的是,我們在用了PDIUSBD12的端口最大一次可發送64字節,SJA1000一次最多能發8字節, 如果端口1傳輸的長度大于8 字節,MCU 在傳輸階段就必須根據數據大小,分數次完成CAN數據的發送工作。
三、USB驅動程序的編寫
在WINDOWS平臺下,與USB外設的任何通信必須通過USB設備驅動,這個驅動知道如何與系統的USB驅動接口和訪問設備的應用程序通信。設備驅動是保證應用程序訪問硬件設備的軟件組件,使得應用程序不必知道物理連接、信號和與一個設備通信需要的協議等的細節,可以保證應用程序代碼只通過外設名字訪問外設或端口目的地。USB驅動程序(USBD)的功能可以概括為:配置管理、總線管理、數據傳輸管理、提供客戶服務。USBD把I/O請求分組(IRP)劃分為USB和設備需要大小的塊,確保每一個設備能分配到它所要求的USB資源,這樣它就可以支持USB設備配置。USB是使用標準Windows系統USB類驅動程序來訪問USB驅動程序接口(USBDI),USBD.sys就是USB類驅動程序,它使用通用主控制器驅動程序(UHCD)或開發主控制器接口(openHCI)來訪問通用主程序控制器接口設備。USBHUB.sys就是根集線器和外部集線器的USB驅動程序。在PCI枚舉器發現USB主控制器后,它會自動裝入相關驅動程序。
[align=center]

圖5 USB的WDM接口框圖[/align]
大量的客戶服務是由USB的驅動程序提供的,它幫助USB的客戶控制和訪問它們的功能單元。編寫USB設備驅動需要使用Visual C++,此外還需要Windows 98或2000驅動設備開發包(98DDK/NTDDK) [5]。
四 、應用程序設計
微處理器固件程序和USB設備驅動程序的設計是USB設備開發者的工作,對于廣大用戶而言,與系統的交互是通過應用程序實現,而且整個實時采集系統的主要數據處理都是在這里完成的。因此,運行效率高、界面友好、具有強大數據分析和處理的應用程序的設計,也是系統設計上一個不容忽視的關鍵因素。其關鍵是實現從USB 外設讀取或發送特定數量的數據,應用程序的主要功能有:啟動/關閉USB設備,檢測USB設備,設置USB數據傳輸管道/端口,顯示接收數據,發送數據。這里,我們采用Visual C++6.0作為程序的開發環境,
可以把USB設備當成文件來操作,利用Windows API:當設備成功插入USB總線,USBD被自動載入,CreateFile()就會返回一個句柄給驅動。用DeviceIoControl()來進行控制傳輸,用ReadFile()、WriteFile()進行數據傳輸。CloseHandle()用來結束與USB設備的通信,此時對于此設備驅動的句柄也就通過它釋放出來。使用上述API函數可編制USB數據收發的主機軟件[6]。
五、結 語
基于USB技術的CAN現場總線適配器系統的設計,從硬件和軟件兩方面看是可行的, 實驗結果較好的完成了通訊任務,這為在工業現場傳送的數據接收與處理方式提供了新的方案。隨著現場總線技術的發展,探索其與計算機的接口技術是很有實踐意義的。
參考文獻
[1] Philips Corp. PDIUSBD12 Users Manual
[2] Philips Corp. SJA1000 Users Manual
[3] 饒運濤 等 現場總線CAN原理與應用技術 北京航空航天大學出版社 2003.6
[4] 周立功 PDIUSBD12 USB固件編程與驅動開發 北京航空航天大學出版社 2003.2