引言 雖然目前PCI、USB等總線技術(shù)得到了快速發(fā)展,但在大量應用的測試微機及工控機中,用的最多的還是ISA (Industry Standard Architecture.工業(yè)標準體系結(jié)構(gòu))總線。ISA總線具有16位數(shù)據(jù)寬度,最高工作頻率為8MHz,數(shù)據(jù)傳輸速率達到16MB/s,地址總線有24條,可尋址16MB的地址單元,其總線信號分為5類,分別為地址線、數(shù)據(jù)線、控制線、時鐘線和電源線。 非智能型ISA總線CAN適配卡的總體結(jié)構(gòu) CAN控制器SJA1000的地址數(shù)據(jù)總線是分時復用的,通過ALE信號的下降沿可鎖存總線上的地址信號;ISA總線上的地址和數(shù)據(jù)總線是單獨提供的,它不能直接和SJA1000的地址數(shù)據(jù)總線相連。本設(shè)計利用地址譯碼電路來對地址信號線進行譯碼,從而為CAN適配卡分配出一定的端口地址。然后再利用74HC373芯片的數(shù)據(jù)鎖存功能鎖存第一次I/O操作中通過ISA數(shù)據(jù)總線傳送的數(shù)據(jù)信號,以便作為訪問CAN控制器SJA1000中寄存器的地址信號,最后在第二次I/O操作中完成對SJA1000中相應地址寄存器的讀寫操作。其適配卡的總體結(jié)構(gòu)如圖1所示。 | |||||
圖1中,地址鎖存器74HC373可看作SJA1000的地址端口,而SJA1000本身可看作SJA1000的數(shù)據(jù)端口,另外還有對SJA1000進行硬件復位的復位端口。圖中的基地址譯碼電路以AEN作為使能信號,對A2~A9地址信號進行譯碼就可得到適配卡的基地址;組合AO和A1地址信號可得到各端口的偏移地址。SJA1000與ISA的通訊采用兩次I/O操作的方法,第一次先往地址端口送地址,第二次再對數(shù)據(jù)端口進行訪問。這里所說的地址及數(shù)據(jù)端口都是對SJAl000而言的,通過ISA總線的數(shù)據(jù)線可獲得被訪問的SJA1000寄存器的地址及所傳送的數(shù)據(jù)??刂贫丝谧g碼電路可將CPU送來的控制信號和地址信號按一定的邏輯關(guān)系進行組合,從而生成一組新的功能信號作為接口控制信號。通過SJA1000復位電路可對SAJ1000進行復位,具體操作可采用上電復位、程序復位及按鍵復位三種硬件復位方式。
適配卡硬件的設(shè)計 基地址譯碼電路設(shè)計 圖2所示是一種具體的基地址譯碼電路。一般情況下,根據(jù)系統(tǒng)需要,地址譯碼電路可對ISA地址線的端口地址譯碼,并可用AO~A9來表示?;刂纷g碼電路對A9~A2進行譯碼,則可作為卡上端口的基地址。 控制信號產(chǎn)生電路 計算機通過ISA總線對CAN控制器SJA1000進行讀寫的時序分別如圖4和圖5所示。 SJA1000正常工作前,只有通過復位引腳對其進行可靠的硬件復位,才能對SJA1000中的寄存器進行正確的讀寫操作。使SJA1000可靠復位的電平持續(xù)最小時間為0.1μs,PC系統(tǒng)復位電平持續(xù)時間可達幾微秒。系統(tǒng)復位信號RESET在系統(tǒng)電源接通時為高電平,經(jīng)反向器后可直接用于對SJA1000進行復位。圖6所示是適配卡的復位電路,對SJA1000的復位具有開機上電復位、程序復位以及按鍵復位等三種方式。 適配卡的軟件設(shè)計
實際上,只有在復位模式下才可以對SJA1000進行初始化,初始化主要包括工作方式的設(shè)置、接收濾波方式的設(shè)置、接收屏蔽寄存器和接收代碼寄存器的設(shè)置、波特率參數(shù)設(shè)置和中斷允許寄存器的設(shè)置等。完成初始化后,即可將SJA1000設(shè)置為工作狀態(tài),以進行正常的通信。發(fā)送子程序負責節(jié)點報文的發(fā)送。發(fā)送時,讀取狀態(tài)寄存器并對各位進行適當判斷,并將待發(fā)送的數(shù)據(jù)按特定格式組合成一幀報文,送入SJA1000發(fā)送緩存區(qū)中,然后啟動SJA1000發(fā)送;接收子程序則負責節(jié)點報文的接收以及其它情況的處理。在處理接收報文的過程中,還要對總線關(guān)閉、錯誤報警、接收溢出等情況進行處理。 CAN適配卡與計算機可采用中斷方式通信。但在WIN API中不能直接控制中斷,只有在操作系統(tǒng)底層為CAN適配卡編寫虛擬設(shè)備驅(qū)動程序(VxD)才可以利用中斷。這需要在虛擬設(shè)備驅(qū)動程序中將中斷虛擬化,并在中斷事件響應函數(shù)中編寫所需代碼,同時為應用程序提供訪問接口。應當注意的是:計算機通過ISA總線對CAN適配卡上的SJA1000進行訪問采用的是兩次I/O操作,第一次往地址端口送地址,第二次對數(shù)據(jù)端口進行訪問。其具體的實現(xiàn)代碼如下: //向指定的SJA1000寄存器(地址為addr)寫一個字節(jié)數(shù)據(jù)(data),CAN_BASE為基地址 void CanIRQ::writeByte(int CAN_BASE,unsigned char addr,unsigned char data) { _outp(CAN_BASE,addr); } unsigned char CanIRQ::ReadByte(int CAN_BASE,unsigned char addr) { unsigned char result; _outp(CAN_BASE,addr); } Bool CanIRQ::CanTrans(int CAN_BASE,unsigned char*pTransBuf) { status=ReadByte(CAN_BASE,SR); //SR為狀態(tài)寄存器地址 for(i=0;i ptbuf++;pTransBuf++; } 結(jié)束語 |