<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 汽車電子 > 設(shè)計(jì)應(yīng)用 > 基于CAN總線的非智能適配卡設(shè)計(jì)

          基于CAN總線的非智能適配卡設(shè)計(jì)

          ——
          作者:柳吉齡 張洪彬 劉振偉 崔國(guó)瑞 中國(guó)人民解放軍63936部隊(duì) 時(shí)間:2007-01-26 來(lái)源:《電子元器件》 收藏

          引言

          控制器局域網(wǎng)can (controller area network)是目前被批準(zhǔn)為國(guó)際標(biāo)準(zhǔn)的少數(shù)現(xiàn)場(chǎng)總線之一。can網(wǎng)絡(luò)可采用多主方式工作。它采用非破壞性的總線仲裁技術(shù),其信號(hào)傳輸和控制采用短幀結(jié)構(gòu),因而具有較強(qiáng)的抗干擾能力和低耦合性;cah網(wǎng)絡(luò)的通訊速率范圍為5 kbs/10 km~lmbs//40m,驅(qū)動(dòng)節(jié)點(diǎn)數(shù)可達(dá)110個(gè)。它的傳輸介質(zhì)可以是雙絞線、同軸電纜或光纖,選擇十分靈活;每幀信息都有crc校驗(yàn)及其它檢錯(cuò)措施,因而數(shù)據(jù)出錯(cuò)率極低,可靠性很高;當(dāng)其傳輸?shù)男畔⒊鲥e(cuò)嚴(yán)重時(shí),節(jié)點(diǎn)可自動(dòng)斷開與總線的聯(lián)系,以使總線上其它的操作不受影響。

          本文引用地址:http://www.ex-cimer.com/article/21378.htm

          雖然目前pci、usb等總線技術(shù)得到了快速發(fā)展,但在大量應(yīng)用的測(cè)試微機(jī)及工控機(jī)中,用的最多的還是isa (industry standard architecture.工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu))總線。isa總線具有16位數(shù)據(jù)寬度,最高工作頻率為8mhz,數(shù)據(jù)傳輸速率達(dá)到16mb/s,地址總線有24條,可尋址16mb的地址單元,其總線信號(hào)分為5類,分別為地址線、數(shù)據(jù)線、控制線、時(shí)鐘線和電源線。

          為了解決can控制器sja1000與isa總線各信號(hào)線的時(shí)序配合與邏輯配合問(wèn)題,筆者設(shè)計(jì)了一種基于can總線的非智能適配卡。該適配卡已應(yīng)用于筆者研制的"基于can總線的運(yùn)動(dòng)控制系統(tǒng)"中,運(yùn)行情況良好。

          非智能型isa總線can適配卡的總體結(jié)構(gòu)

          can控制器sja1000的地址數(shù)據(jù)總線是分時(shí)復(fù)用的,通過(guò)ale信號(hào)的下降沿可鎖存總線上的地址信號(hào);isa總線上的地址和數(shù)據(jù)總線是單獨(dú)提供的,它不能直接和sja1000的地址數(shù)據(jù)總線相連。本設(shè)計(jì)利用地址譯碼電路來(lái)對(duì)地址信號(hào)線進(jìn)行譯碼,從而為can適配卡分配出一定的端口地址。然后再利用74hc373芯片的數(shù)據(jù)鎖存功能鎖存第一次i/o操作中通過(guò)isa數(shù)據(jù)總線傳送的數(shù)據(jù)信號(hào),以便作為訪問(wèn)can控制器sja1000中寄存器的地址信號(hào),最后在第二次i/o操作中完成對(duì)sja1000中相應(yīng)地址寄存器的讀寫操作。其適配卡的總體結(jié)構(gòu)如圖1所示。

          圖1中,地址鎖存器74hc373可看作sja1000的地址端口,而sja1000本身可看作sja1000的數(shù)據(jù)端口,另外還有對(duì)sja1000進(jìn)行硬件復(fù)位的復(fù)位端口。圖中的基地址譯碼電路以aen作為使能信號(hào),對(duì)a2~a9地址信號(hào)進(jìn)行譯碼就可得到適配卡的基地址;組合ao和a1地址信號(hào)可得到各端口的偏移地址。sja1000與isa的通訊采用兩次i/o操作的方法,第一次先往地址端口送地址,第二次再對(duì)數(shù)據(jù)端口進(jìn)行訪問(wèn)。這里所說(shuō)的地址及數(shù)據(jù)端口都是對(duì)sjal000而言的,通過(guò)isa總線的數(shù)據(jù)線可獲得被訪問(wèn)的sja1000寄存器的地址及所傳送的數(shù)據(jù)。控制端口譯碼電路可將cpu送來(lái)的控制信號(hào)和地址信號(hào)按一定的邏輯關(guān)系進(jìn)行組合,從而生成一組新的功能信號(hào)作為接口控制信號(hào)。通過(guò)sja1000復(fù)位電路可對(duì)saj1000進(jìn)行復(fù)位,具體操作可采用上電復(fù)位、程序復(fù)位及按鍵復(fù)位三種硬件復(fù)位方式。

          適配卡硬件的設(shè)計(jì)

          基地址譯碼電路設(shè)計(jì)

          圖2所示是一種具體的基地址譯碼電路。一般情況下,根據(jù)系統(tǒng)需要,地址譯碼電路可對(duì)isa地址線的端口地址譯碼,并可用ao~a9來(lái)表示。基地址譯碼電路對(duì)a9~a2進(jìn)行譯碼,則可作為卡上端口的基地址。

          圖2中,74hc688是一個(gè)8位量值比較器,當(dāng)時(shí)pi=qi(i=0…7),p=q的反端輸出低電平。當(dāng)isa總線的aen為高電平時(shí),總線工作在dma方式;而當(dāng)aen為低電平時(shí),cpu擁有對(duì)總線的控制權(quán)。非智能型適配卡的工作過(guò)程實(shí)際上就是cpu對(duì)i/o的操作過(guò)程,期間,aen始終為低電平,可用于控制74hc688的選通端g反。只有在i/o操作時(shí),才允許它選擇地址。由于使用的是撥碼開關(guān),用戶可預(yù)先設(shè)定適配卡的基地址??ㄉ细鞫丝诘钠朴蒩1和a0選擇,并可通過(guò)軟件控制,本設(shè)計(jì)中的定義地址端口偏移為00,數(shù)據(jù)端口偏移為01,復(fù)位端口偏移為11。

          控制信號(hào)產(chǎn)生電路

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

          適配卡在工作過(guò)程中,各芯片的邏輯時(shí)序關(guān)系是:當(dāng)74hc373輸出數(shù)據(jù)有效時(shí),74hc245輸出為高阻態(tài);當(dāng)74hc373輸出呈高阻態(tài),且sja1000的數(shù)據(jù)直接傳回isa總線時(shí),74hc245輸入輸出工作正常。具體來(lái)講,假設(shè)can的基地址為300h,且訪問(wèn)sja1000是分兩次i/o操作完成的,那么,第一次往端口300h送出的數(shù)據(jù)可在寫信號(hào)的后沿被鎖存在74hc373中,這個(gè)操作中,74hc245的e與74hc373的le端有效,而74hc373的oe端為高電平,74hc373輸出端為高阻態(tài);當(dāng)?shù)诙卧L問(wèn)數(shù)據(jù)端口301h時(shí),sja1000被選中,此時(shí)cpu可對(duì)sja1000的相應(yīng)單元進(jìn)行讀/寫操作。具體的操作過(guò)程分為讀、寫兩種情況。當(dāng)?shù)诙蝘/o操作到來(lái)時(shí),sja1000會(huì)在bale信號(hào)下降沿將第一次i/o操作時(shí)鎖存在74hc373中的數(shù)據(jù)作為地址鎖存,該過(guò)程中,74hc245的e反為高電平,輸出呈高阻態(tài),74hc373的oe的反為低電平,輸出端有效,可向sja1000傳送地址信號(hào)。當(dāng)?shù)刂繁籹ja1000鎖存以后,此時(shí)如果進(jìn)行的是讀操作,那么,在讀信號(hào)有效期間(低電平),74hc373的輸出允許oe反端為高電平,74hc373輸出端呈高阻態(tài),這時(shí)sja1000可將選中單元的寄存器內(nèi)容輸出到數(shù)據(jù)總線,并通過(guò)74hc245驅(qū)動(dòng)送入cpu中。而在地址鎖存后,如果進(jìn)行的是寫操作,那么,74hc373的輸出允許端始終有效,此時(shí)可在寫信號(hào)有效期間,將數(shù)據(jù)寫入sja1000的相應(yīng)單元中。

          計(jì)算機(jī)通過(guò)isa總線對(duì)can控制器sja1000進(jìn)行讀寫的時(shí)序分別如圖4和圖5所示。

          復(fù)位電路

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

          在圖6中,a1和a0經(jīng)過(guò)與非門74lsl0后,為復(fù)位電路產(chǎn)生的偏移地址為11,該地址信號(hào)與iow反、p=q反等信號(hào)經(jīng)過(guò)邏輯組合,同時(shí)配合程序設(shè)計(jì)可產(chǎn)生對(duì)sja1000的復(fù)位信號(hào)。程序設(shè)計(jì)時(shí)只需對(duì)復(fù)位端口寫入一個(gè)數(shù)據(jù)即可實(shí)現(xiàn)程序復(fù)位。而按鍵復(fù)位則可在系統(tǒng)運(yùn)行出現(xiàn)通信故障時(shí),直接用于對(duì)can控制器sja1000進(jìn)行硬件復(fù)位。

          適配卡的軟件設(shè)計(jì)

          軟件設(shè)計(jì)的關(guān)鍵部分是can通信程序的設(shè)計(jì)。通信程序(流程如圖7、8、9所示)可分為三部分:can初始化程序、接收程序、發(fā)送程序。初始化是通信的前提,主要完成對(duì)can控制器的一些寄存器的設(shè)置。由于sja1000支持中斷操作,因此可以用中斷服務(wù)程序來(lái)完成數(shù)據(jù)的接收和發(fā)送,以提高系統(tǒng)的工作效率。


          實(shí)際上,只有在復(fù)位模式下才可以對(duì)sja1000進(jìn)行初始化,初始化主要包括工作方式的設(shè)置、接收濾波方式的設(shè)置、接收屏蔽寄存器和接收代碼寄存器的設(shè)置、波特率參數(shù)設(shè)置和中斷允許寄存器的設(shè)置等。完成初始化后,即可將sja1000設(shè)置為工作狀態(tài),以進(jìn)行正常的通信。發(fā)送子程序負(fù)責(zé)節(jié)點(diǎn)報(bào)文的發(fā)送。發(fā)送時(shí),讀取狀態(tài)寄存器并對(duì)各位進(jìn)行適當(dāng)判斷,并將待發(fā)送的數(shù)據(jù)按特定格式組合成一幀報(bào)文,送入sja1000發(fā)送緩存區(qū)中,然后啟動(dòng)sja1000發(fā)送;接收子程序則負(fù)責(zé)節(jié)點(diǎn)報(bào)文的接收以及其它情況的處理。在處理接收?qǐng)?bào)文的過(guò)程中,還要對(duì)總線關(guān)閉、錯(cuò)誤報(bào)警、接收溢出等情況進(jìn)行處理。

          can適配卡與計(jì)算機(jī)可采用中斷方式通信。但在win api中不能直接控制中斷,只有在操作系統(tǒng)底層為can適配卡編寫虛擬設(shè)備驅(qū)動(dòng)程序(vxd)才可以利用中斷。這需要在虛擬設(shè)備驅(qū)動(dòng)程序中將中斷虛擬化,并在中斷事件響應(yīng)函數(shù)中編寫所需代碼,同時(shí)為應(yīng)用程序提供訪問(wèn)接口。應(yīng)當(dāng)注意的是:計(jì)算機(jī)通過(guò)isa總線對(duì)can適配卡上的sja1000進(jìn)行訪問(wèn)采用的是兩次i/o操作,第一次往地址端口送地址,第二次對(duì)數(shù)據(jù)端口進(jìn)行訪問(wèn)。其具體的實(shí)現(xiàn)代碼如下:

          //向指定的sja1000寄存器(地址為addr)寫一個(gè)字節(jié)數(shù)據(jù)(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è)字節(jié)數(shù)據(jù)(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;

          }
          在訪問(wèn)sja1000的程序中,可以直接調(diào)用以上兩子函數(shù)。這樣,其發(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ā)送緩沖區(qū)地址

          ptbuf++;ptransbuf++;

          }

          }

          結(jié)束語(yǔ)

          通過(guò)解決計(jì)算機(jī)isa總線與can控制器sja1000的邏輯配合與時(shí)序配合可完成基于can總線的非智能適配卡設(shè)計(jì)。該適配卡現(xiàn)已成功地應(yīng)用于筆者所研制的基于can總線的測(cè)控系統(tǒng)中。實(shí)際上,若在適配卡上增加can通信控制器,也可使一卡帶多條can總線,以增加網(wǎng)絡(luò)節(jié)點(diǎn),擴(kuò)大網(wǎng)絡(luò)規(guī)模。另外,還可以在適配卡的應(yīng)用程序中,根據(jù)應(yīng)用系統(tǒng)需要編寫各種監(jiān)控程序來(lái)擴(kuò)展系統(tǒng)功能。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();