楊曄,曲波
(蘇州大學(xué) 電子信息學(xué)院,江蘇 蘇州 215021)
USB是電腦主流的外圍串行總線,是一種新型、快速、雙向、同步傳輸、并可以熱插拔的數(shù)據(jù)傳輸總線。CAN總線是擁有多主節(jié)點(diǎn)、開放式架構(gòu)、錯(cuò)誤檢測(cè)及自恢復(fù)能力等優(yōu)勢(shì)的一種總線。但一般工控機(jī)不具有CAN總線接口,需要專門的接口卡才能連接,并且專用接口卡成本較高,連接不便。而USB的即插即用特性可以解決了上述問題。目前性價(jià)比高的USB-CAN數(shù)據(jù)轉(zhuǎn)換器比較少見,而且能應(yīng)用的CAN通道數(shù)較少,一般只有1~2路。如要應(yīng)用于大型的CAN總線網(wǎng)絡(luò),CAN接口不夠用,而使用開發(fā)商提供的各種USB-CAN接口適配器,就會(huì)出現(xiàn)各參數(shù)及CAN總線的配置不統(tǒng)一的問題。為了解決了這個(gè)問題,本文提出了一種 USB與多通道CAN轉(zhuǎn)換器的設(shè)計(jì)方案。
本設(shè)計(jì)基于ARM9處理器和SJA1000 CAN控制器,能較好地以低成本實(shí)現(xiàn)USB與CAN之間的傳輸。此轉(zhuǎn)換器可以作為“測(cè)試工具”應(yīng)用于汽車電子,也可以作為“工業(yè)控制設(shè)備”應(yīng)用于工業(yè)控制現(xiàn)場(chǎng)。
本設(shè)計(jì)將具有遠(yuǎn)距離傳輸能力的CAN總線與即插即用的USB接口相結(jié)合,即利用USB接口方便的特性來實(shí)現(xiàn)CAN總線和主機(jī)的連接。并且擴(kuò)展了8路通道的CAN總線,高效地?cái)U(kuò)大了CAN總線的應(yīng)用范圍。USB-CAN轉(zhuǎn)換器的總體框圖如圖1所示。
圖中,RS232串口用于系統(tǒng)的調(diào)試,RJ45接口用于調(diào)試同時(shí)也作為將來系統(tǒng)的擴(kuò)展使用。本設(shè)計(jì)自帶8路CAN接口和2路LIN接口,實(shí)現(xiàn)USB與 CAN總線的數(shù)據(jù)雙向傳輸。
圖1 接口模塊總體框圖
本設(shè)計(jì)的核心處理器是ARM9系列的S3C2440??紤]到三星S3C2440是BGA封裝,需要特殊的焊接工藝,所以本設(shè)計(jì)采用核心板+底板的形式。核心板的外部存儲(chǔ)器配置是64 MB SDRAM和64 MB NAND Flash。
更重要的是,S3C2440內(nèi)置了USB控制器,無需再外擴(kuò)USB控制器,節(jié)省了成本。其內(nèi)置USB控制器完全兼容USB1.1協(xié)議,支持全速設(shè)備;集成USB收發(fā)器,支持Control、Interrupt和Bulk 3種傳輸模式;具備5個(gè)FIFO的通信端點(diǎn),其中Bulk端點(diǎn)支持DMA操作方式,接收和發(fā)送均由64 B的FIFO完成;支持掛起和遠(yuǎn)程喚醒功能。
在USB接口設(shè)計(jì)上,為了避免由于外部設(shè)備或電纜中介入高電壓干擾,造成計(jì)算機(jī)USB接口甚至主板的燒壞,本設(shè)計(jì)還考慮了USB接口的隔離保護(hù),并選用SN65220芯片作為接口的保護(hù)芯片,其電路如圖2所示。
圖2 USB接口原理圖
圖中,USB_SELECT是微處理器用來控制USB設(shè)備與主機(jī)連接的信號(hào)。當(dāng)主機(jī)集線器檢測(cè)新設(shè)備時(shí),集線器監(jiān)視著每個(gè)USB設(shè)備端口的信號(hào)電壓,集線器端口的2根信號(hào)線的每1根都有15 kΩ的下拉電阻,而每一個(gè)設(shè)備在 DP1(即 D+)都有1個(gè)1.5 kΩ的上拉電阻。當(dāng)用USB線將PC和USB設(shè)備接通后,設(shè)備的上拉電阻使信號(hào)線的電位升高,因此主機(jī)集線器可以檢測(cè)到USB設(shè)備[1]。本設(shè)計(jì)使用 USB_SELECT來控制 1.5 kΩ的上拉電阻,當(dāng)處理器給USB_SELECT 1個(gè)高電平時(shí),這時(shí)DP1信號(hào)線上的電壓升高,主機(jī)集線器就會(huì)檢測(cè)到此USB設(shè)備,然后開始USB的設(shè)備枚舉;當(dāng)USB_SELECT為低電平時(shí),則表示沒有設(shè)備連接到主機(jī)。這樣就可以通過USB_SELECT信號(hào)的高低來控制設(shè)備與主機(jī)的連接。
CAN節(jié)點(diǎn)使用Philips公司的獨(dú)立CAN總線控制器SJA1000,收發(fā)器采用高速的TJA1050,它增強(qiáng)了電磁兼容(EMC),且在不上電的時(shí)候使總線呈現(xiàn)無源特性。CAN單元模塊負(fù)責(zé)CAN信息幀的收發(fā)和CAN協(xié)議的實(shí)現(xiàn),接口管理邏輯負(fù)責(zé)同外部主控制器的接口,該單元的每1個(gè)寄存器都可以由主控制器通過SJA1000的地址/數(shù)據(jù)復(fù)用總線訪問。
SJA1000提供的微處理器的接口信號(hào)主要有AD0~AD7共 8根地址數(shù)據(jù)復(fù)用線, 以及 ALE、CS、RD、WR、MODE、RESET和 INT信號(hào)。其中,MODE為接口方式選擇信號(hào),本設(shè)計(jì)將 MODE接VCC高電平,選用Intel模式。接口電路如圖3所示。
RESET復(fù)位信號(hào)由主控制器S3C2440統(tǒng)一控制,振蕩信號(hào)CLK由1個(gè)16 MHz的晶振統(tǒng)一提供。另外,ALE、CS、RD、WR和 INT信號(hào)需要經(jīng)過 CPLD接口邏輯轉(zhuǎn)換后才能與SJA1000連接。當(dāng)芯片被片選信號(hào)CS選中后,地址信號(hào)首先出現(xiàn)在復(fù)用總線上,經(jīng)ALE信號(hào)鎖存后才可以對(duì)數(shù)據(jù)進(jìn)行讀寫操作[2]。
由于系統(tǒng)設(shè)計(jì)的是8通道CAN的轉(zhuǎn)換器,所以共有8個(gè)CAN單元并列組成CAN通信模塊。其8通道的數(shù)據(jù)地址總線擴(kuò)展的主要思想是把每個(gè)SJA1000(CAN控制器)的寄存器映射到ARM9內(nèi)存地址空間的某個(gè)地址,通過內(nèi)存訪問指令,訪問SJA1000的內(nèi)部寄存器。
由于微處理器S3C2440的地址與數(shù)據(jù)總線是分離的,而SJA1000的數(shù)據(jù)與地址線是分時(shí)復(fù)用的,兩者總線接口之間存在差異性,因此必須對(duì)S3C2440的讀寫時(shí)序進(jìn)行邏輯變換,使其滿足SJA1000的接口要求才能使二者配合工作。
圖3 CAN節(jié)點(diǎn)原理圖
本模塊選用了Altera公司的MAX3000系列可編程邏輯器件EPM3128芯片。EPM3128具有128個(gè)宏單元,80個(gè)用戶I/O管腳,2 500個(gè)可用門和ISP,管腳間延遲為 10 ns,計(jì)數(shù)器速度可高達(dá) 100 MHz,可以很好地滿足系統(tǒng)的需要。
在本設(shè)計(jì)中,CPLD需要完成2個(gè)功能:(1)完成S3C2440的地址數(shù)據(jù)非復(fù)用總線到SJA1000的地址數(shù)據(jù)復(fù)用總線的雙向轉(zhuǎn)換;(2)通過對(duì)S3C2440的地址線譯碼,進(jìn)行多通道擴(kuò)展(本設(shè)計(jì)擴(kuò)展為8通道)。
通過對(duì)S3C2440與SJA1000讀寫時(shí)序的分析,可用如下的邏輯關(guān)系來完成2種不同總線的轉(zhuǎn)換:
其中,ALE、CS、WR、RD 是 SJA1000的總線控制信號(hào),nGCS2、nWE、nOE、A0為 S 3C2440的總線控制與地址信號(hào)。根據(jù)以上的邏輯關(guān)系,利用QuartusII的原理圖輸入方式,可以得到如圖4所示的單通道的硬件圖。
8通道的擴(kuò)展,則利用更多的地址線編碼,再通過CPLD譯碼即可實(shí)現(xiàn)。
USB-CAN轉(zhuǎn)換器的工作方案如下[3-4]:
(1)下行傳輸:上位機(jī)輸出數(shù)據(jù)發(fā)送到USB設(shè)備。上位機(jī)可以在任意時(shí)間按照協(xié)議要求把數(shù)據(jù)發(fā)送到USB設(shè)備的緩沖區(qū),USB設(shè)備盡快把緩沖區(qū)中的數(shù)據(jù)發(fā)送到CAN總線。
(2)上行傳輸:USB緩沖區(qū)中的數(shù)據(jù)輸入到上位機(jī)。首先,USB設(shè)備通過查詢方式不斷檢查CAN總線是否有輸入的數(shù)據(jù),若有數(shù)據(jù)存入CAN緩沖區(qū),上位機(jī)輸出“讀CAN總線請(qǐng)求”到USB設(shè)備,USB設(shè)備再根據(jù)請(qǐng)求的內(nèi)容確定是否獲取到需要的數(shù)據(jù),將獲取到的數(shù)據(jù)寫入U(xiǎn)SB設(shè)備的發(fā)送緩沖區(qū);若沒有數(shù)據(jù)存入CAN緩沖區(qū),則按照協(xié)議的格式,回應(yīng)“沒有收到數(shù)據(jù)”。
CAN總線節(jié)點(diǎn)的通信程序主要包括3個(gè)部分:CAN初始化、數(shù)據(jù)的發(fā)送和數(shù)據(jù)的接收。初始化程序主要是對(duì)SJA1000的初始化設(shè)置,包括:工作方式的設(shè)置、接收濾波方式的設(shè)置、接收屏蔽寄存器和驗(yàn)收代碼寄存器的設(shè)置、波特率的設(shè)置和中斷允許寄存器的設(shè)置。SJA1000的初始化工作要在復(fù)位模式下才能進(jìn)行。初始化設(shè)置后就可以回到工作狀態(tài),進(jìn)行正常的通信任務(wù)。CAN控制器的初始化是CAN總線系統(tǒng)設(shè)計(jì)中極為重要的一個(gè)部分,是系統(tǒng)正常工作的前提[5]。初始化過程如圖5所示。CAN控制器從上電到正常工作,一般需要經(jīng)過硬件和軟件的配置。軟件的初始化函數(shù)為:
int SJA1000_Init(struct CanConfig&config,unsigned char channel);
參數(shù)說明:struct CanConfig是 SJA1000配置信息的結(jié)構(gòu)體;channel是通道選擇,如果成功則返回 0,如果不成功,則返回不為0。
圖5 SJA1000初始化流程圖
對(duì)于數(shù)據(jù)的發(fā)送程序,發(fā)送時(shí)用戶只需將待發(fā)送的數(shù)據(jù)按特定格式組合成1幀報(bào)文,送入SJA1000發(fā)送緩沖區(qū)中,然后啟動(dòng)SJA1000發(fā)送即可。每幀發(fā)送之后,可以通過發(fā)送中對(duì)安置軟件發(fā)送成功標(biāo)志,發(fā)送程序通過對(duì)成功標(biāo)志的查詢來進(jìn)行相應(yīng)的處理。其實(shí)現(xiàn)函數(shù)如下:
void SJA1000_Write (structCanFrame&frame,unsigned char channel);
參數(shù)說明:struct CanFrame結(jié)構(gòu)體是CAN的幀格式,channel是通道選擇。
接收程序要比發(fā)送程序復(fù)雜,采用中斷接收方式,這樣可以更有效地接收數(shù)據(jù)。通過讀取SJA1000中斷狀態(tài)寄存器進(jìn)行接收及出錯(cuò)處理。其中斷函數(shù)如下:
void__irq SJA1000_ReadData(void)。
CAN總線是一種比較成熟的現(xiàn)場(chǎng)總線,目前被廣泛應(yīng)用于汽車電子和工業(yè)控制。而USB總線是PC機(jī)廣泛采用的接口設(shè)備。多通道的USB-CAN轉(zhuǎn)換器可以在大型的CAN網(wǎng)絡(luò)的應(yīng)用中提供一個(gè)方便的USB接口,大大簡化了現(xiàn)場(chǎng)總線與PC機(jī)之間的數(shù)據(jù)通信。因此本設(shè)計(jì)具有很強(qiáng)的實(shí)用性,具有良好的應(yīng)用前景。
[1]蕭世文,宋延清.USB2.0硬件設(shè)計(jì)[M].北京:清華大學(xué)出版社,2006:23-49.
[2]廖濟(jì)林.USB2.0應(yīng)用系統(tǒng)開發(fā)實(shí)例精講[M].北京:電子工業(yè)出版社,2006:72-75.
[3]王黎明.CAN現(xiàn)場(chǎng)總線系統(tǒng)的設(shè)計(jì)與應(yīng)用[M].北京:電子工業(yè)出版社,2008:103-127.
[4]林新兵.基于嵌入式系統(tǒng)的USB-CAN協(xié)議轉(zhuǎn)換器的設(shè)計(jì)與實(shí)現(xiàn)[D].中國海洋大學(xué),2006:32-35.
[5]彭廣.支持多點(diǎn)通信的USB-TO-CAN轉(zhuǎn)換器的設(shè)計(jì)與實(shí)現(xiàn)[D].長沙:中南大學(xué),2007:8-12.