低基于CAN總線(xiàn)的非智能適配卡設計
控制器局域網(wǎng)CAN (Controller Area Network)是目前被批準為國際標準的少數現場(chǎng)總線(xiàn)之一。CAN網(wǎng)絡(luò )可采用多主方式工作。它采用非破壞性的總線(xiàn)仲裁技術(shù),其信號傳輸和控制采用短幀結構,因而具有較強的抗干擾能力和低耦合性;CAH網(wǎng)絡(luò )的通訊速率范圍為5 kbs/10 km~lMbs//40m,驅動(dòng)節點(diǎn)數可達110個(gè)。它的傳輸介質(zhì)可以是雙絞線(xiàn)、同軸電纜或光纖,選擇十分靈活;每幀信息都有CRC校驗及其它檢錯措施,因而數據出錯率極低,可靠性很高;當其傳輸的信息出錯嚴重時(shí),節點(diǎn)可自動(dòng)斷開(kāi)與總線(xiàn)的聯(lián)系,以使總線(xiàn)上其它的操作不受影響。
雖然目前PCI、USB等總線(xiàn)技術(shù)得到了快速發(fā)展,但在大量應用的測試微機及工控機中,用的最多的還是ISA (Industry Standard Architecture.工業(yè)標準體系結構)總線(xiàn)。ISA總線(xiàn)具有16位數據寬度,最高工作頻率為8MHz,數據傳輸速率達到16MB/s,地址總線(xiàn)有24條,可尋址16MB的地址單元,其總線(xiàn)信號分為5類(lèi),分別為地址線(xiàn)、數據線(xiàn)、控制線(xiàn)、時(shí)鐘線(xiàn)和電源線(xiàn)。
為了解決CAN控制器SJA1000與ISA總線(xiàn)各信號線(xiàn)的時(shí)序配合與邏輯配合問(wèn)題,筆者設計了一種基于CAN總線(xiàn)的非智能適配卡。該適配卡已應用于筆者研制的"基于CAN總線(xiàn)的運動(dòng)控制系統"中,運行情況良好。
非智能型ISA總線(xiàn)CAN適配卡的總體結構
CAN控制器SJA1000的地址數據總線(xiàn)是分時(shí)復用的,通過(guò)ALE信號的下降沿可鎖存總線(xiàn)上的地址信號;ISA總線(xiàn)上的地址和數據總線(xiàn)是單獨提供的,它不能直接和SJA1000的地址數據總線(xiàn)相連。本設計利用地址譯碼電路來(lái)對地址信號線(xiàn)進(jìn)行譯碼,從而為CAN適配卡分配出一定的端口地址。然后再利用74HC373芯片的數據鎖存功能鎖存第一次I/O操作中通過(guò)ISA數據總線(xiàn)傳送的數據信號,以便作為訪(fǎng)問(wèn)CAN控制器SJA1000中寄存器的地址信號,最后在第二次I/O操作中完成對SJA1000中相應地址寄存器的讀寫(xiě)操作。其適配卡的總體結構如圖1所示。
圖1中,地址鎖存器74HC373可看作SJA1000的地址端口,而SJA1000本身可看作SJA1000的數據端口,另外還有對SJA1000進(jìn)行硬件復位的復位端口。圖中的基地址譯碼電路以AEN作為使能信號,對A2~A9地址信號進(jìn)行譯碼就可得到適配卡的基地址;組合AO和A1地址信號可得到各端口的偏移地址。SJA1000與ISA的通訊采用兩次I/O操作的方法,第一次先往地址端口送地址,第二次再對數據端口進(jìn)行訪(fǎng)問(wèn)。這里所說(shuō)的地址及數據端口都是對SJAl000而言的,通過(guò)ISA總線(xiàn)的數據線(xiàn)可獲得被訪(fǎng)問(wèn)的SJA1000寄存器的地址及所傳送的數據??刂贫丝谧g碼電路可將CPU送來(lái)的控制信號和地址信號按一定的邏輯關(guān)系進(jìn)行組合,從而生成一組新的功能信號作為接口控制信號。通過(guò)SJA1000復位電路可對SAJ1000進(jìn)行復位,具體操作可采用上電復位、程序復位及按鍵復位三種硬件復位方式。
適配卡硬件的設計
基地址譯碼電路設計
圖2所示是一種具體的基地址譯碼電路。一般情況下,根據系統需要,地址譯碼電路可對ISA地址線(xiàn)的端口地址譯碼,并可用AO~A9來(lái)表示?;刂纷g碼電路對A9~A2進(jìn)行譯碼,則可作為卡上端口的基地址。
圖2中,74HC688是一個(gè)8位量值比較器,當時(shí)Pi=Qi(i=0…7),P=Q的反端輸出低電平。當ISA總線(xiàn)的AEN為高電平時(shí),總線(xiàn)工作在DMA方式;而當AEN為低電平時(shí),CPU擁有對總線(xiàn)的控制權。非智能型適配卡的工作過(guò)程實(shí)際上就是CPU對I/O的操作過(guò)程,期間,AEN始終為低電平,可用于控制74HC688的選通端G反。只有在I/O操作時(shí),才允許它選擇地址。由于使用的是撥碼開(kāi)關(guān),用戶(hù)可預先設定適配卡的基地址??ㄉ细鞫丝诘钠朴葾1和A0選擇,并可通過(guò)軟件控制,本設計中的定義地址端口偏移為00,數據端口偏移為01,復位端口偏移為11。
控制信號產(chǎn)生電路
該適配卡的控制信號產(chǎn)生電路如圖3所示。該電路的主要作用是把CPU送來(lái)的控制線(xiàn)和地址線(xiàn)按照一定的邏輯關(guān)系進(jìn)行組合,以生成一組新的功能信號輸出。該信號可作為接口控制信號去控制SJA1000、74HC373、74HC245等芯片的工作狀態(tài)。由于基地址譯碼電路的輸出信號為P=Q的反(低電平有效),SJA1000地址端口偏移地址為00H,數據端口偏移地址為01H
適配卡在工作過(guò)程中,各芯片的邏輯時(shí)序關(guān)系是:當74HC373輸出數據有效時(shí),74HC245輸出為高阻態(tài);當74HC373輸出呈高阻態(tài),且SJA1000的數據直接傳回ISA總線(xiàn)時(shí),74HC245輸入輸出工作正常。具體來(lái)講,假設CAN的基地址為300H,且訪(fǎng)問(wèn)SJA1000是分兩次I/O操作完成的,那么,第一次往端口300H送出的數據可在寫(xiě)信號的后沿被鎖存在74HC373中,這個(gè)操作中,74HC245的E與74HC373的LE端有效,而74HC373的OE端為高電平,74HC373輸出端為高阻態(tài);當第二次訪(fǎng)問(wèn)數據端口301H時(shí),SJA1000被選中,此時(shí)CPU可對SJA1000的相應單元進(jìn)行讀/寫(xiě)操作。具體的操作過(guò)程分為讀、寫(xiě)兩種情況。當第二次I/O操作到來(lái)時(shí),SJA1000會(huì )在BALE信號下降沿將第一次I/O操作時(shí)鎖存在74HC373中的數據作為地址鎖存,該過(guò)程中,74HC245的E反為高電平,輸出呈高阻態(tài),74HC373的OE的反為低電平,輸出端有效,可向SJA1000傳送地址信號。當地址被SJA1000鎖存以后,此時(shí)如果進(jìn)行的是讀操作,那么,在讀信號有效期間(低電平),74HC373的輸出允許OE反端為高電平,74HC373輸出端呈高阻態(tài),這時(shí)SJA1000可將選中單元的寄存器內容輸出到數據總線(xiàn),并通過(guò)74HC245驅動(dòng)送入CPU中。而在地址鎖存后,如果進(jìn)行的是寫(xiě)操作,那么,74HC373的輸出允許端始終有效,此時(shí)可在寫(xiě)信號有效期間,將數據寫(xiě)入SJA1000的相應單元中。
計算機通過(guò)ISA總線(xiàn)對CAN控制器SJA1000進(jìn)行讀寫(xiě)的時(shí)序分別如圖4和圖5所示。
復位電路
SJA1000正常工作前,只有通過(guò)復位引腳對其進(jìn)行可靠的硬件復位,才能對SJA1000中的寄存器進(jìn)行正確的讀寫(xiě)操作。使SJA1000可靠復位的電平持續最小時(shí)間為0.1μs,PC系統復位電平持續時(shí)間可達幾微秒。系統復位信號RESET在系統電源接通時(shí)為高電平,經(jīng)反向器后可直接用于對SJA1000進(jìn)行復位。圖6所示是適配卡的復位電路,對SJA1000的復位具有開(kāi)機上電復位、程序復位以及按鍵復位等三種方式。
在圖6中,A1和A0經(jīng)過(guò)與非門(mén)74LSl0后,為復位電路產(chǎn)生的偏移地址為11,該地址信號與IOW反、P=Q反等信號經(jīng)過(guò)邏輯組合,同時(shí)配合程序設計可產(chǎn)生對SJA1000的復位信號。程序設計時(shí)只需對復位端口寫(xiě)入一個(gè)數據即可實(shí)現程序復位。而按鍵復位則可在系統運行出現通信故障時(shí),直接用于對CAN控制器SJA1000進(jìn)行硬件復位。
適配卡的軟件設計
軟件設計的關(guān)鍵部分是CAN通信程序的設計。通信程序(流程如圖7、8、9所示)可分為三部分:CAN初始化程序、接收程序、發(fā)送程序。初始化是通信的前提,主要完成對CAN控制器的一些寄存器的設置。由于SJA1000支持中斷操作,因此可以用中斷服務(wù)程序來(lái)完成數據的接收和發(fā)送,以提高系統的工作效率。
實(shí)際上,只有在復位模式下才可以對SJA1000進(jìn)行初始化,初始化主要包括工作方式的設置、接收濾波方式的設置、接收屏蔽寄存器和接收代碼寄存器的設置、波特率參數設置和中斷允許寄存器的設置等。完成初始化后,即可將SJA1000設置為工作狀態(tài),以進(jìn)行正常的通信。發(fā)送子程序負責節點(diǎn)報文的發(fā)送。發(fā)送時(shí),讀取狀態(tài)寄存器并對各位進(jìn)行適當判斷,并將待發(fā)送的數據按特定格式組合成一幀報文,送入SJA1000發(fā)送緩存區中,然后啟動(dòng)SJA1000發(fā)送;接收子程序則負責節點(diǎn)報文的接收以及其它情況的處理。在處理接收報文的過(guò)程中,還要對總線(xiàn)關(guān)閉、錯誤報警、接收溢出等情況進(jìn)行處理。
CAN適配卡與計算機可采用中斷方式通信。但在WIN API中不能直接控制中斷,只有在操作系統底層為CAN適配卡編寫(xiě)虛擬設備驅動(dòng)程序(VxD)才可以利用中斷。這需要在虛擬設備驅動(dòng)程序中將中斷虛擬化,并在中斷事件響應函數中編寫(xiě)所需代碼,同時(shí)為應用程序提供訪(fǎng)問(wèn)接口。應當注意的是:計算機通過(guò)ISA總線(xiàn)對CAN適配卡上的SJA1000進(jìn)行訪(fǎng)問(wèn)采用的是兩次I/O操作,第一次往地址端口送地址,第二次對數據端口進(jìn)行訪(fǎng)問(wèn)。其具體的實(shí)現代碼如下:
?。蛑付ǖ腟JA1000寄存器(地址為addr)寫(xiě)一個(gè)字節數據(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)讀一個(gè)字節數據(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;
}
在訪(fǎng)問(wèn)SJA1000的程序中,可以直接調用以上兩子函數。這樣,其發(fā)送程序段代碼為:
Bool CanIRQ::CanTrans(int CAN_BASE,unsigned char*pTransBuf)
{
status=ReadByte(CAN_BASE,SR); //SR為狀態(tài)寄存器地址
for(i=0;i
{
WriteByte (CAN_BASE,*pTFansBuf,ptbuf;//pTransBuf為發(fā)送緩沖區地址
ptbuf++;pTransBuf++;
}
}
結束語(yǔ)
通過(guò)解決計算機ISA總線(xiàn)與CAN控制器SJA1000的邏輯配合與時(shí)序配合可完成基于CAN總線(xiàn)的非智能適配卡設計。該適配卡現已成功地應用于筆者所研制的基于CAN總線(xiàn)的測控系統中。實(shí)際上,若在適配卡上增加CAN通信控制器,也可使一卡帶多條CAN總線(xiàn),以增加網(wǎng)絡(luò )節點(diǎn),擴大網(wǎng)絡(luò )規模。另外,還可以在適配卡的應用程序中,根據應用系統需要編寫(xiě)各種監控程序來(lái)擴展系統功能。
評論