另外為了避免總線上的信號對電路的影響,在SPC3與RS485總線驅(qū)動電路之間采用光電隔離。TxD、RxD信號的隔離器件選用Hewlett Packard公司的12M高速光耦HCPL710,RTS信號的隔離器件選用了6N137。
3.3 雙口RAM的接口電路
兩種總線數(shù)據(jù)的共享與傳遞是通過雙口RAM實(shí)現(xiàn)的,系統(tǒng)里選用了器件IDT7130。它是高速的1K雙口靜態(tài)RAM。該器件提供兩個獨(dú)立的端口,分別有獨(dú)立的控制、地址和I/O引腳,并允許獨(dú)立的異步讀寫訪問內(nèi)存的任何地址,自動的電源管理特性由CE控制,允許芯片上的每一個端口電路進(jìn)入一個非常低的電源模式。IDT7130的片內(nèi)總線仲裁電路具有BUSY和INT兩種總線仲裁方式;谒捎玫膯纹瑱C(jī)型號,在系統(tǒng)里采用了中斷仲裁方案,這種方式的工作原理是一個內(nèi)存地址(郵箱或者信息中心)被指派給每個端口。左端口的中斷標(biāo)志被宣稱當(dāng)右端口寫到內(nèi)存地址3FEH時,左端口通過訪問3FE內(nèi)存地址清除中斷。相似的,當(dāng)左端口寫內(nèi)存地址3FFH時右端口標(biāo)志被宣稱,為了清除這個中斷標(biāo)志,右端口必須訪問內(nèi)存地址3FFH,系統(tǒng)里3FE和3FF兩個單元的內(nèi)容賦予新的內(nèi)涵,即定義兩個碼0FFH和00H。其中0FFH代表發(fā)送命令要求對方傳送數(shù)據(jù),而00H代表發(fā)送的是對方所要求的數(shù)據(jù)。系統(tǒng)里兩個CPU與雙口RAM的連接如圖3。雙口RAM的剩余的存儲單元被分為四大部分,其中0000H-00FFH這256個單元用來存儲CAN總線上傳來的數(shù)據(jù)或地址,并且相鄰的兩個單元用于存儲一個CAN子站的數(shù)據(jù)信息;0100H-01F9H這250個單元用來存儲PROFIBUS總線上傳來的數(shù)據(jù)或地址,相鄰的兩個單元用于存儲一個PROFIBUS子站的信息,另外03FCH單元用于存放CAN總線設(shè)備所要讀的PROFIBUS站點(diǎn)的ID號,03FDH單元用于存放PROFIBUS總線設(shè)備所要讀的CAN站點(diǎn)的ID號。
由圖可知雙口RAM在負(fù)責(zé)CAN總線通信的微處理器的映射地址為0x7C00H-0x7FFFH,在負(fù)責(zé)PROFIBUS總線通信的微處理器的映射地址為0x2C00H-0x2FFFH。
4 系統(tǒng)軟件設(shè)計(jì)
網(wǎng)關(guān)的軟件可
分為兩大部分,一部分用于負(fù)責(zé)CAN總線的數(shù)據(jù)通信,另一部分用于負(fù)責(zé)PROFIBUS總線的數(shù)據(jù)通信。
每側(cè)的程序根據(jù)功能又可以分為三個子模塊:協(xié)議芯片初始化程序,接受數(shù)據(jù)接受子程序,數(shù)據(jù)發(fā)送子程序。其中數(shù)據(jù)接受子程序考外部中斷觸發(fā)執(zhí)行。下面以網(wǎng)關(guān)的CAN總線接口側(cè)程序?yàn)槔?列出程序流程圖,PROFIBUS側(cè)的接口程序與之相似,就不再贅述。
CAN總線側(cè)的初始化與發(fā)送程序流程如圖4:

因?yàn)镾JA1000的初始化只有在復(fù)位模式下才可以進(jìn)行,因此程序首先將SJA1000的中斷屏蔽,使它進(jìn)入復(fù)位模式,然后對它進(jìn)行初始化。初始化內(nèi)容主要包括工作方式的設(shè)置、接受濾波方式的設(shè)置、接受屏蔽寄存器和接受代碼寄存器的設(shè)置、波特率參數(shù)設(shè)置和中斷允許寄存器的設(shè)置等。 SJA1000完成初始化設(shè)置后,再讓它返回到工作狀態(tài),進(jìn)行正常的通信任務(wù)。
在接受子程序里,系統(tǒng)以查詢的方式接受CAN子站傳送過來的數(shù)據(jù),網(wǎng)關(guān)通過接受緩沖區(qū)數(shù)據(jù)區(qū)的第一個字節(jié)的內(nèi)容判斷接受的是真正的數(shù)據(jù),還是發(fā)給 PROFIBUS-DP站點(diǎn)的發(fā)送數(shù)據(jù)請求。如果數(shù)據(jù)區(qū)第一個字節(jié)是00H,則傳送的是數(shù)據(jù)信息,于是根據(jù)ID查表求得該站所對應(yīng)的存儲單元,并將數(shù)據(jù)區(qū)的第二、三字節(jié)的內(nèi)容存在該單元內(nèi),同時把ID放在7FFCH中,告訴對方發(fā)送數(shù)據(jù)的站點(diǎn)號;如果該字節(jié)內(nèi)容是FFH,則說明是發(fā)送數(shù)據(jù)請求,數(shù)據(jù)區(qū)第二個字節(jié)存放的是被要求發(fā)送數(shù)據(jù)的站點(diǎn)號,將他放入7FFCH內(nèi)即可。
CAN總線接口發(fā)送數(shù)據(jù)子程序流程圖如圖5:

上面的發(fā)送程序是由雙口RAM的中斷信號觸發(fā)的,收到中斷信號后,首先讀取7FFEH單元的內(nèi)容,將中斷信號消除,然后根據(jù)該單元的內(nèi)容,判斷雙口RAM內(nèi)存放的是數(shù)據(jù),還是被要求發(fā)送數(shù)據(jù)的CAN子站的ID號。如果7FFEH內(nèi)容為00H,則說明所要發(fā)送到CAN子站的為正常的數(shù)據(jù),于是將發(fā)送緩沖區(qū)的第一個字節(jié)設(shè)置為00H,告訴CAN子站發(fā)送的為數(shù)據(jù),然后讀取7FFDH單元內(nèi)容,查表求得數(shù)據(jù)在雙口RAM中的地址,并從該地址取兩個字節(jié)存到SJA1000輸出緩沖區(qū)數(shù)據(jù)區(qū)的第二、三個字節(jié),同時把7FFDH作為發(fā)送的ID號。如果7FFDH是FFH,則說明PROFIBUS-DP發(fā)送過來得是被要求發(fā)送數(shù)據(jù)的CAN子站的站點(diǎn)號,于是只要把它放到SJA1000發(fā)送緩沖區(qū)數(shù)據(jù)區(qū)的第二個字節(jié),并把第一個字節(jié)設(shè)為FFH,以通知 CAN站點(diǎn),發(fā)送的數(shù)據(jù)為ID號。以上工作完成后,最后通過寫命令字發(fā)送數(shù)據(jù)。
5 結(jié)束語
實(shí)踐證明,雙CPU結(jié)構(gòu)的雙向網(wǎng)關(guān)可以很好地完成CAN總線到PROFIBUS-DP總線協(xié)議轉(zhuǎn)換的任務(wù),并且解決了單CPU結(jié)構(gòu)網(wǎng)關(guān)中存在的數(shù)據(jù)傳輸速率低,數(shù)據(jù)傳輸可靠性差等問題,滿足了CAN總線與PROFIBUS-DP總線協(xié)議轉(zhuǎn)換的要求。它將CAN總線設(shè)備與PROFIBUS總線設(shè)備的連接起來,使兩種現(xiàn)場總線設(shè)備可以高效的通信,最終達(dá)到數(shù)據(jù)共享與功能互補(bǔ)的目的。并且工作人員在使用過程中不必關(guān)心兩種總線物理層和數(shù)據(jù)鏈路層的全部內(nèi)容,給總線產(chǎn)品的研究開發(fā)帶來極大方便。另外這種雙CPU結(jié)構(gòu)的設(shè)計(jì)方案對其他現(xiàn)場總線之間的網(wǎng)關(guān)設(shè)計(jì)具有借鑒意義,是一種值得推廣的方法。





