一種多協議的嵌入式總線集成器的設計與研究
系統的軟件分為系統初始化模塊、系統配置模塊、協議通信總調度模塊、三個協議實現模塊及硬件驅動模塊。它們分別對應系統軟件的不同分層。其中,系統配置模塊、協議間通信總調度模塊為應用層程序。協議實現模塊(LonWorks協議模塊、PPI協議模塊、CANOpen協議模塊)為協議層程序。硬件驅動模塊為硬件驅動層程序。其流程圖如圖3所示。本文引用地址:http://www.104case.com/article/152308.htm
系統配置模塊主要完成系統的配置。它包括總線各端口是配置為主模式還是從模式、各通信協議的波特率等。系統可以通過兩種方式配置:一種為硬件方式配置,另一種是通過互連網進行軟件配置。協議間通信總調度模塊主要是驅動不同協議之間進行相互通信。各總線協議的格式解析分別由相應的協議模塊完成。硬件驅動模塊主要完成把各硬件緩沖區中的數據發送到總線,同時把從總線接收來的數據存放到協議緩沖區中。
2.3 緩沖區結構
本系統的緩沖區采用改進的循環隊列結構,采用了三個指針Bp.In、Bp.Out、Bp.Try。其中,Bp.In是隊頭指針。當隊列接收一數據時,如果隊列緩沖區尚有空間,則數據入隊,同時Bp.In加1。Bp.Out是隊尾指針。當數據要出隊時, 如果隊列緩沖區非空,則Bp.Out加1。隊列緩沖區空或滿的判定方法可以用下面的偽C語言描述:
if(Bp.In++== Bp.Out)
{隊列緩沖區已滿};//如隊頭加1等于隊尾指針,則表示該隊列已滿
if(Bp.Out== Bp.In)
{隊列緩沖區已空};//如果隊尾指針趕上隊頭則表示該隊列已空
Bp.Try是為通信時重發而準備的。當要發送數據時,Bp.Try向前移動(Bp.Try++),但Bp.Out不動(數據不出隊)。當Bp.Try=Bp.In時,表示隊列緩沖區已沒有數據要發送。如果要求數據重發,僅僅把Bp.Try重新指回Bp.Out(Bp.Try=Bp.Out)再次發送。只有當發送成功時,才允許數據出隊(Bp.Out= Bp.Try)。由于一次發送數據的多少由Bp.Try決定(一次不一定把隊列緩沖區數據都發送完),這樣給數據的發送提供了極大的方便。
2.4 硬件緩沖區
系統要發送數據時把發送協議緩沖區的數據拷貝到發送硬件緩沖區,并驅動一次發送后退出。硬件發送緩沖區中的數據是由發送中斷自動完成的。硬件發送中斷驅動完一次數據發送就退出。當硬件發送完數據后就會產生中斷標志并重新進入中斷,重復上面的過程直到數據發送完。同樣,發送中斷只負責發送完硬件發送緩沖區中的數據而不關心這些數據代表的意義。中斷程序流程圖如圖4所示。
2.5 各總線協議間的通信方法
各總線協議間通信是采用周期輪詢方式下的實地址共享。其基本思想就是系統定時地由配置為主模式的端口向其對應總線的每個從機發送請求讀數命令包。從機接收到命令后就把它的數據傳送給主機(總線集成器)。主機把接收到的數據存放在對應的協議地址中。當配置為從機的端口所對應的總線上的主機向總線集成器請求數據時,總線集成器只是簡單地把前一個周期輪詢的數據應答過去。由于輪詢總線的周期比較短,因此應答的數據稍微滯后。但對總線采集的數據的真實性影響不大。
下面以圖5中 CANOpen總線的節點B向LonWorks節點A請求數據為例來說明這種方式的通信過程。首先,系統周期性地改變從機號、通信命令、通信狀態,向LonWorks所有的從機請求數據,從機應答的數據存放在其協議地址中。然后CANOpen主節點B向總線集成器請求LonWorks總線A節點中的數據。最后,總線集成器收到該命令,把剛采集到的協議地址上的值傳送給節點B。這一次通信至此結束。
該多協議總線集成器目前提供了對LonWorks、PPI、CANOpen的支持,并且還對上面三種協議提供了利用TCP/IP遠程監控和配置的接口,人機界面使系統有較好的監測能力。由于該集成器采用了較高性能的處理器,使各個協議之間通訊實時性得到保證。為了有利于系統以后的擴展,整個總線集成器系統嚴格按照模塊化來進行硬件設計和軟件編程,使系統軟件的移植性大大提高。
評論