賀竹林,王東響,朱琴躍
HDLC(High-Level Data Link Control)協(xié)議是一種面向比特的高級數(shù)據(jù)鏈路控制規(guī)程,由于其通信速率高、差錯檢測能力強、支持透明傳輸?shù)葍?yōu)點,廣泛應用于包括列車控制網(wǎng)絡在內(nèi)的諸多現(xiàn)場總線通信領域[1]。目前,國內(nèi)應用于列車通信網(wǎng)絡中的HDLC設備大多從國外引進,而國內(nèi)部分研發(fā)機構(gòu)也基于FPGA對HDLC協(xié)議控制器進行了設計[2-5]。隨著國內(nèi)列車通信網(wǎng)絡中HDLC通信接口設備應用的日益廣泛,對相關(guān)產(chǎn)品的國產(chǎn)化研究就顯得尤為必要。為此,本文在深入研究HDLC協(xié)議標準的基礎上,對基于該協(xié)議的列車網(wǎng)絡接口單元的設計和實現(xiàn)進行了研究,以期為該產(chǎn)品下一步真正應用于列車通信網(wǎng)絡系統(tǒng)打下基礎。
根據(jù)ISO13239國際標準,HDLC協(xié)議主要有NRM(Normal Response Mode)、ARM(Asynchronous Response Mode)、ABM(Asynchronous Balanced Mode)3種工作模式,它們分別針對非平衡鏈路結(jié)構(gòu)和平衡鏈路結(jié)構(gòu)的網(wǎng)絡工作情況[6]。
本設計主要針對HDLC網(wǎng)絡工作在NRM方式下進行研究。在該方式中,整個網(wǎng)絡由一個主站和多個從站組成。主站主要功能是發(fā)送命令(包括數(shù)據(jù)信息)幀、接收響應幀,并負責對整個鏈路控制系統(tǒng)的初啟、流程的控制、差錯檢測或恢復等;從站主要功能是接收由主站發(fā)來的命令幀,向主站發(fā)送響應幀,并且配合主站參與差錯恢復等鏈路控制。主站與從站之間采用RS485通信,一個主站最多可以掛載31個從站,在半雙工模式下通信速率最高可達10Mbit/s。HDLC協(xié)議的網(wǎng)絡拓撲結(jié)構(gòu),如圖1所示:
圖1 HDLC網(wǎng)絡拓撲圖
HDLC協(xié)議是一種面向比特的數(shù)據(jù)鏈路規(guī)程,在通信過程中報文的收發(fā)以HDLC幀的形式進行。根據(jù)ISO13239國際標準,HDLC報文幀由起始段、地址段、控制段、信息段、校驗段、終止段構(gòu)成,其基本幀格式,如表1所示:
表1 HDLC基本幀格式
在HDLC基本幀格式中,起始段和終止段均為0x7E;地址段存放發(fā)送站或接收站的地址;控制段包含對整個鏈路的控制信息;信息段存放的則是用戶待發(fā)送的數(shù)據(jù);校驗段的內(nèi)容是從地址段到信息段的校驗和,根據(jù)實際需求可選用CRC-8、CRC-16、CRC-32 3種校驗方式。從地址段到校驗段的比特位均參與透明傳輸,即在數(shù)據(jù)幀收發(fā)過程中,發(fā)送端進行 5 連‘1’插‘0’操作,接收端進行 5 連‘1’刪‘0’操作。
根據(jù)數(shù)據(jù)幀中控制字段的比特指派不同,可以將HDLC幀分成I幀、S幀和U幀3種類型。I幀主要用于信息的傳輸;S幀負責數(shù)據(jù)幀傳輸過程中的流控制;而U幀用于數(shù)據(jù)鏈路的建立和拆除。HDLC幀控制段的比特指派與幀類型的對應關(guān)系,如表2所示:
表2 幀類型與控制段編碼
其中,在數(shù)據(jù)幀收發(fā)過程中,具體可以通過RR幀、RNR幀、REJ幀、SREJ幀4種S幀來實現(xiàn)流控制,這4種幀的具體功能如下。
RR幀——接收準備好,準備接收N(R)幀,前N(R)-1幀已正確接收。
RNR幀——接收未準備好,暫停接收N(R)幀,前N(R)-1幀已正確接收。
REJ幀——拒絕接收,重新發(fā)送N(R)及其以后各幀,前N(R)-1幀已正確接收。
SREJ幀——選擇拒絕接收,只要求重新發(fā)送第N(R)幀,其它幀均已正確接收。
網(wǎng)絡接口單元主要由嵌入式CPU模塊、HDLC通信網(wǎng)卡以及電源三大部分組成。其中CPU模塊主要負責對HDLC通信網(wǎng)卡的調(diào)度與數(shù)據(jù)收發(fā)控制;HDLC通信網(wǎng)卡負責HDLC幀的封裝和解析,以及對整個數(shù)據(jù)鏈路的控制;電源模塊用于對CPU模塊和HDLC通信網(wǎng)卡供電。網(wǎng)絡接口單元內(nèi)部的CPU模塊與HDLC通信網(wǎng)卡之間基于CPCI總線進行連接,該網(wǎng)絡接口單元采用RS485通信接口與其它單元進行通信,具體硬件總體結(jié)構(gòu),如圖2所示:
圖2 網(wǎng)絡接口單元硬件框圖
本通信網(wǎng)卡主要基于協(xié)議控制器SAB82532進行設計。SAB82532是西門子公司開發(fā)的一款增強型高級多協(xié)議串行通信控制器(ESCC),它能夠?qū)崿F(xiàn)高級鏈路控制協(xié)議的同步或異步串行通信,最高傳輸速率可達到10Mbit/s[7]。
在本文設計的HDLC通信網(wǎng)卡中,協(xié)議控制器SAB82532向上通過CPCI總線與嵌入式主控CPU相連,向下通過RS485總線收發(fā)器與其他網(wǎng)絡接口單元的HDLC網(wǎng)卡進行通信,相應網(wǎng)卡的硬件框圖,如圖3所示:
圖3 HDLC網(wǎng)卡硬件框圖
本網(wǎng)卡硬件設計中主控CPU采用存儲器映射方式對外圍器件進行尋址。系統(tǒng)中CPU通過CPCI總線為SAB82532分配的地址空間為0x83002000~0x830021FF,并采用譯碼器進行地址選擇。SDRAM選用MT48LC2M32B2-7,它是一款具有2M*32bit存儲容量的隨機存儲器,最高工作頻率可達143MHz,能夠滿足系統(tǒng)對存儲深度和存儲速度的要求。RS485總線收發(fā)器采用MAX485,網(wǎng)絡節(jié)點之間的通信采用半雙工方式,通過協(xié)議控制器的/RTS信號來控制RS485收發(fā)器的數(shù)據(jù)接收和發(fā)送。由于SAB82532是雙通道,故每個接口單元都連接兩個MAX485芯片。
在上述硬件設計的基礎上,本網(wǎng)絡接口單元的軟件主要從HDLC通信網(wǎng)卡板級通道驅(qū)動軟件和應用層通信軟件兩方面進行設計。
3.1.1 SAB82532初始化設置
SAB82532協(xié)議控制器支持HDLC、ASYNC、BISYNC 3種通信協(xié)議,該器件還擁有兩個獨立的通道,每個通道在HDLC通信協(xié)議下都有4種不同的工作模式,通過配置寄存器參數(shù)可以實現(xiàn)通信協(xié)議和工作模式的選擇,并且還可以設定通信波特率、CRC校驗方式、地址字段大小等參數(shù)。其中,SAB82532在HDLC協(xié)議下的4種工作模式分別為:
(1)自動模式:自動識別地址字段,地址字段為8位或16位,窗口尺寸為1,報文長度不限,能夠自動處理S幀和I幀。
(2)非自動模式:自動識別地址字段,地址字段為8位或16位,窗口尺寸不限。
(3)透明模式:自動識別地址字段,地址字段為8位或16位。
(4)擴展的透明模式:全透明傳輸,F(xiàn)LAG、CRC、Info字段以及位填充可以自己定義,靈活性大。
表3為HDLC通信采用透明模式進行信息輸時協(xié)議控制器相關(guān)寄存器參數(shù)配置情況,如表3所示:
表3 SAB82532寄存器參數(shù)配置
其中,SAB82532的波特率設置有標準型和增強型,標準型中N=(BR9~BR0)D,XTAL時鐘分頻因數(shù)為k=(N+1)*2,分 頻 范 圍 為 2~2048; 增 強 型 中 N=(BR5~BR0)D,M=(BR9~BR6)D,XTAL時鐘分頻因數(shù)為k=(N+1)*2^M,分頻范圍為1~2097152。本文為了達到高速通信的目的,采用20MHz晶振,工作在標準波特率生成方式下,因此通信速率范圍為10Kbit/s~10Mbit/s,用戶可以通過人機界面靈活設定。
另外,HDLC網(wǎng)絡工作在NRM時,通信節(jié)點地址的設置如下:本節(jié)點地址應寫在RAL1和RAL2寄存器中,并且RAL1=RAL2;主站發(fā)送幀的目標地址根據(jù)命令幀和響應幀不同分別寫在XAD1和XAD2中;從站發(fā)送響應幀的目標地址只能是主站,故從站XAD1=主站RAL1=主站RAL2;從站無需發(fā)送命令幀,故從站的XAD1無需設定。
3.1.2 HDLC通道數(shù)據(jù)收發(fā)軟件設計
SAB82532協(xié)議控制器在通信過程中均通過發(fā)送緩存器XFIFO和接收緩存器RFIFO分別進行數(shù)據(jù)幀的發(fā)送和接收,其每個通道的數(shù)據(jù)發(fā)送和接收流程分別,如圖4、圖5所示:
圖4 HDLC數(shù)據(jù)發(fā)送流程
圖5 HDLC數(shù)據(jù)接收流程4.2網(wǎng)絡接口單元通信軟件的設計與實現(xiàn)
由圖4、圖5可知,當發(fā)送HDLC數(shù)據(jù)幀時,首先需要讀入超時定時器t1的時間間隔和超時重傳次數(shù)n1,并使能發(fā)送寄存器XFIFO,而后產(chǎn)生一個中斷,并判斷上次啟動的定時器是否超時,若超時則重傳,直至超過重傳次數(shù)n1;而接收HDLC數(shù)據(jù)幀時,首先需使能接收寄存器RFIFO,而后讀出RFIFO中的數(shù)據(jù)幀,判斷該幀格式和幀編號是否錯誤,若錯誤則丟棄,否則將該幀中信息解析后上交,并清空RFIFO寄存器。
網(wǎng)絡接口單元應用層的通信軟件基于VC++開發(fā)平臺進行設計。通過調(diào)用Windows系統(tǒng)底層提供的一些API函數(shù)以及HDLC通信網(wǎng)卡所提供的板級驅(qū)動函數(shù),用戶可以很方便地設計友好的人機界面實現(xiàn)通信節(jié)點的參數(shù)配置和數(shù)據(jù)的收發(fā)功能。一般地,網(wǎng)絡接口單元應用層的數(shù)據(jù)通信軟件流程,如圖6所示:
圖6 網(wǎng)絡接口單元通信流程
3.2.1 基本API函數(shù)設計
由圖6可知,網(wǎng)絡接口單元在上電后需對協(xié)議控制器進行各個寄存器的復位、通道檢測以及寄存器相應參數(shù)的配置工作。為了使用戶能在應用層對多達幾十個寄存器直接進行訪問操作,而屏蔽掉每個寄存器底層不同硬件地址的差異,本軟件中采用DeviceIoControl()函數(shù)實現(xiàn)對各個寄存器的直接訪問,該函數(shù)的原型如下:
其中,設備句柄用來標識所訪問的設備,通過設置不同的控制碼,可以調(diào)用設備驅(qū)動程序的不同類型的功能。本函數(shù)設定的參數(shù)以結(jié)構(gòu)體的形式放在輸入緩沖區(qū)中,該結(jié)構(gòu)體將SAB82532用到的32個寄存器定義為無符號整型。
類似地,為了便于在應用層對協(xié)議控制器的XFIFO和RFIFO進行直接訪問從而實現(xiàn)數(shù)據(jù)的發(fā)送和接收功能,軟件中采用WriteFile()函數(shù)來實現(xiàn)將待發(fā)數(shù)據(jù)寫入SAB82532的XFIFO寄存器,并由協(xié)議控制器負責將數(shù)據(jù)封裝成幀發(fā)送出去,其中XFIFO大小為32字節(jié)。同理,數(shù)據(jù)接收功能則采用ReadFile()函數(shù)予以實現(xiàn),具體實現(xiàn)時,采用單獨的讀線程實時檢測RFIFO的狀態(tài),當RFIFO非空時就讀取其中的數(shù)據(jù),RFIFO寄存器的大小也為32字節(jié)。WirteFile()函數(shù)和ReadFile()函數(shù)的原型分別如下:
為了方便用戶進行通信過程軟件的二次編程開發(fā),本設計在原API函數(shù)基礎上封裝設計了一些常用的輸入輸出函數(shù)分別如下:
int OpenPort(int PortNumber); //端口打開函數(shù),PortNumber取值為0或1,端口打開成功返回1,失敗返回0,PortNumber設置錯誤時返回-1。
int ClosePort(int PortNumber); //端口打開函數(shù),PortNumber取值為0或1,端口關(guān)閉成功返回1,失敗返回0,PortNumber設置錯誤時返回-1。
BOOL InitSet(int PortNumber, int BaudRate, int CheckSum,BYTE LocalAddress);//板卡初始化函數(shù),初始化成功返回TRUE,失敗返回FALSE。
BOOL TransmitData(int PortNumber,Byte TargetAddress,CString Data);//發(fā)送數(shù)據(jù)函數(shù),TargetAddress為發(fā)送數(shù)據(jù)的目標節(jié)點地址,大小為一個字節(jié),Data為所要發(fā)送的字符串數(shù)據(jù),大小不限。數(shù)據(jù)發(fā)送成功返回TRUE,失敗返回FALSE。
根據(jù)上述封裝設計后的函數(shù),用戶可以很方便地對HDLC網(wǎng)絡接口單元應用層的通信軟件進行設計?;谏鲜龊瘮?shù)設計并實現(xiàn)的HDLC通信測試軟件運行截圖,實際通信測試表明上述驅(qū)動API函數(shù)的設計和封裝是可行的,如圖7所示:
圖7 通信測試軟件運行截圖
基于上述原理設計并完成的列車通信網(wǎng)絡接口單元,實現(xiàn)了HDLC協(xié)議所規(guī)定的基本通信功能。通過實驗室環(huán)境下通信性能的長期運行和測試,表明該通信接口單元在各方面的性能均達到了預期的目標,這為下一步真正應用到實際列車通信網(wǎng)絡打下了基礎。
[1]葉星星.地鐵列車診斷系統(tǒng)中央控制單元的設計與實現(xiàn)[D].北京:北京交通大學,2011.
[2]應三從,張行.基于FPGA的HDLC協(xié)議控制器[J].四川大學學報,2008,40(3):116-120.
[3]陳金華.基于HDLC協(xié)議的RS485通信設備的研制[J].測控技術(shù),2010,29(6):98-101.
[4]鄧鳳軍,張龍,王益忠.基于PCI總線的HDLC通信卡的設計與實現(xiàn)[J].電子技術(shù)應用,2012,38(8):30-32.
[5]羅文翰,張劍鋒.基于MPC860的HDLC通道驅(qū)動程序的設計與實現(xiàn)[J].電子技術(shù)應用,2005,31(5):66-68.
[6]ISO/IEC 13239.Information technology-Telecommu nications and information exchange between systems-High- level data link control (HDLC)procedures[S]. Switzerland International Electro-technical Commission,2002.
[7]SAB82532 User’s Manual . Enhanced Serial Communication Controller[Z].Germany:Siemens,2007.