基于CAN總線的非智能適配卡設計
引言
控制器局域網can (controller area network)是目前被批準為國際標準的少數現場總線之一。can網絡可采用多主方式工作。它采用非破壞性的總線仲裁技術,其信號傳輸和控制采用短幀結構,因而具有較強的抗干擾能力和低耦合性;cah網絡的通訊速率范圍為5
kbs/10 km~lmbs//40m,驅動節點數可達110個。它的傳輸介質可以是雙絞線、同軸電纜或光纖,選擇十分靈活;每幀信息都有crc校驗及其它檢錯措施,因而數據出錯率極低,可靠性很高;當其傳輸的信息出錯嚴重時,節點可自動斷開與總線的聯系,以使總線上其它的操作不受影響。
雖然目前pci、usb等總線技術得到了快速發展,但在大量應用的測試微機及工控機中,用的最多的還是isa (industry standard
architecture.工業標準體系結構)總線。isa總線具有16位數據寬度,最高工作頻率為8mhz,數據傳輸速率達到16mb/s,地址總線有24條,可尋址16mb的地址單元,其總線信號分為5類,分別為地址線、數據線、控制線、時鐘線和電源線。
為了解決can控制器sja1000與isa總線各信號線的時序配合與邏輯配合問題,筆者設計了一種基于can總線的非智能適配卡。該適配卡已應用于筆者研制的"基于can總線的運動控制系統"中,運行情況良好。
非智能型isa總線can適配卡的總體結構
can控制器sja1000的地址數據總線是分時復用的,通過ale信號的下降沿可鎖存總線上的地址信號;isa總線上的地址和數據總線是單獨提供的,它不能直接和sja1000的地址數據總線相連。本設計利用地址譯碼電路來對地址信號線進行譯碼,從而為can適配卡分配出一定的端口地址。然后再利用74hc373芯片的數據鎖存功能鎖存第一次i/o操作中通過isa數據總線傳送的數據信號,以便作為訪問can控制器sja1000中寄存器的地址信號,最后在第二次i/o操作中完成對sja1000中相應地址寄存器的讀寫操作。其適配卡的總體結構如圖1所示。

適配卡硬件的設計
基地址譯碼電路設計
圖2所示是一種具體的基地址譯碼電路。一般情況下,根據系統需要,地址譯碼電路可對isa地址線的端口地址譯碼,并可用ao~a9來表示。基地址譯碼電路對a9~a2進行譯碼,則可作為卡上端口的基地址。

控制信號產生電路
該適配卡的控制信號產生電路如圖3所示。該電路的主要作用是把cpu送來的控制線和地址線按照一定的邏輯關系進行組合,以生成一組新的功能信號輸出。該信號可作為接口控制信號去控制sja1000、74hc373、74hc245等芯片的工作狀態。由于基地址譯碼電路的輸出信號為p=q的反(低電平有效),sja1000地址端口偏移地址為00h,數據端口偏移地址為01h,因此,根據控制邏輯,適配卡中各芯片的控制信號邏輯表達式為:

計算機通過isa總線對can控制器sja1000進行讀寫的時序分別如圖4和圖5所示。

sja1000正常工作前,只有通過復位引腳對其進行可靠的硬件復位,才能對sja1000中的寄存器進行正確的讀寫操作。使sja1000可靠復位的電平持續最小時間為0.1μs,pc系統復位電平持續時間可達幾微秒。系統復位信號reset在系統電源接通時為高電平,經反向器后可直接用于對sja1000進行復位。圖6所示是適配卡的復位電路,對sja1000的復位具有開機上電復位、程序復位以及按鍵復位等三種方式。

適配卡的軟件設計
軟件設計的關鍵部分是can通信程序的設計。通信程序(流程如圖7、8、9所示)可分為三部分:can初始化程序、接收程序、發送程序。初始化是通信的前提,主要完成對can控制器的一些寄存器的設置。由于sja1000支持中斷操作,因此可以用中斷服務程序來完成數據的接收和發送,以提高系統的工作效率。


實際上,只有在復位模式下才可以對sja1000進行初始化,初始化主要包括工作方式的設置、接收濾波方式的設置、接收屏蔽寄存器和接收代碼寄存器的設置、波特率參數設置和中斷允許寄存器的設置等。完成初始化后,即可將sja1000設置為工作狀態,以進行正常的通信。發送子程序負責節點報文的發送。發送時,讀取狀態寄存器并對各位進行適當判斷,并將待發送的數據按特定格式組合成一幀報文,送入sja1000發送緩存區中,然后啟動sja1000發送;接收子程序則負責節點報文的接收以及其它情況的處理。在處理接收報文的過程中,還要對總線關閉、錯誤報警、接收溢出等情況進行處理。
can適配卡與計算機可采用中斷方式通信。但在win api中不能直接控制中斷,只有在操作系統底層為can適配卡編寫虛擬設備驅動程序(vxd)才可以利用中斷。這需要在虛擬設備驅動程序中將中斷虛擬化,并在中斷事件響應函數中編寫所需代碼,同時為應用程序提供訪問接口。應當注意的是:計算機通過isa總線對can適配卡上的sja1000進行訪問采用的是兩次i/o操作,第一次往地址端口送地址,第二次對數據端口進行訪問。其具體的實現代碼如下:
//向指定的sja1000寄存器(地址為addr)寫一個字節數據(data),can_base為基地址
void canirq::writebyte(int can_base,unsigned char addr,unsigned char data)
{
_outp(can_base,addr);
_outp(can_base+1,data);
}
//從指定的sja1000寄存器(地址為addr)讀一個字節數據(data)
unsigned char canirq::readbyte(int can_base,unsigned char addr)
{
unsigned char result;
_outp(can_base,addr);
result=_inp(can_base+1);
return result;
}
在訪問sja1000的程序中,可以直接調用以上兩子函數。這樣,其發送程序段代碼為:
bool canirq::cantrans(int can_base,unsigned char*ptransbuf)
{
status=readbyte(can_base,sr); //sr為狀態寄存器地址
for(i=0;i
{
writebyte (can_base,*ptfansbuf,ptbuf;//ptransbuf為發送緩沖區地址
ptbuf++;ptransbuf++;
}
}
結束語
通過解決計算機isa總線與can控制器sja1000的邏輯配合與時序配合可完成基于can總線的非智能適配卡設計。該適配卡現已成功地應用于筆者所研制的基于can總線的測控系統中。實際上,若在適配卡上增加can通信控制器,也可使一卡帶多條can總線,以增加網絡節點,擴大網絡規模。另外,還可以在適配卡的應用程序中,根據應用系統需要編寫各種監控程序來擴展系統功能。
評論