車輛傳感器網絡車載節點設計 - 下載本文

立如表4-3 所列的地址映射。

表4-3 地址映射 網關接收CAN消息ID 0x0001 64為長地址 0x00000000000A 0x00000000000C ? SADDR 0x1699 0x169A ? 節點代碼 0x0001 0x0002 ? 網關有固定的ZigBee短地址0x0000,同時接收ID為0x0001的CAN報文并將其轉發到Zig-Bee網絡。在地址映射表中,節點代碼是固定的,ZigBee的路由節點啟動后,一旦有節點加入到該網絡,協調器即為該節點分配一個在局域網內唯一的短地址。如果是第一次組建ZigBee網絡,則認為是地址映射表的建立過程,這時網關將新加入網絡節點的長地址和短地址寫入地址映射表,與節點代碼構成一一對應。如果是ZigBee網絡失敗后的重建過程,則查詢地址映射表,將新加入節點的短地址寫到地址映射表中其長地址對應的位置。這樣 ZigBee網絡一經建立,節點的長地址、短地址和節點代碼就保持對應關系。CAN節點通過網關向ZigBee節點發送消息時,利用節點代碼即可查得當前ZigBee短地址。當ZigBee節點向CAN節點發送數據時,在ZigBee消息中應包含目標節點的CAN報文ID,網關根據CAN報文ID將數據轉發到CAN總線。 2) 協議轉換的實現

協議轉換在網關的兩個網絡接口模塊編程實現。在完成各自網絡內數據收發的基礎上編寫SPI接口程序,使兩個模塊之間能進行數據交互。由于ZigBee的傳輸速率小于CAN總線,所以在ZigBee的網絡接口模塊設計一個緩沖區接收來自CAN總線的數據。SPI通信對數據包作如圖4-5所示定義。

圖4-5 SPI數據包定義

數據包由目標地址( ADDR) 、數據長度(DLC)和數據載荷(DATA)3部分組成。ZigBee向CAN發送的SPI數據包長度為 10 字節。其中ADDR 為 CAN 的消息號,占用 1 字節,DLC占用1字節,DATA 長度固定為8字節,其有效字節數由DLC確定。CAN向ZigBee發送的SPI數據包長度為9字節。在CAN報文采用的短幀中,每

- 19 -

一幀中最多傳送8字節數據。此處定義兩字節傳輸ZigBee的節點代碼,6字節作為數據載荷,封裝SPI數據包時以1字節的DLC表示數據包中的有效載荷長度。

CAN接口模塊程序按功能分為3部分: 初始化程序、CAN消息的轉發程序和 SPI 數據包的轉發程序。初始化程序中完成IO口的交叉配置、SPI設置以及CAN寄存器的初始化。SPI設置時應保證時鐘相位和時鐘極性與CC2430一致,以確保兩個單片機能正確通信。CAN 初始化時將1個消息對象用于接收ID為0x0001的報文,其余31個消息對象按CAN網絡的應用層協議初始化,用于發送報文。網關以中斷方式接收ID為0x0001的CAN報文,根據DLC值提取有效載荷,并調用SPI發送子程序將其發送到ZigBee網絡接口模塊。SPI的數據接收在INT0中斷處理程序中完成,主要流程如圖4-6 所示。CAN 接口模塊每次將 SPI 接收到的數據存儲于 RxBUFF 緩沖區,當接收到一個完整的數據包后,調用 CAN 報文發送子程序將 RxBUFF 中的數據發送到 CAN 總線上。

圖 4-6 SPI 數據包接收和轉發程序流程

- 20 -

ZigBee 接口模塊程序在協議棧的基礎上開發。ZigBee 協議棧采用有限狀態機結構,由物理層( PHY) 、媒體訪問控制層 ( MAC) 、網 絡 層( NWK) 和應用層( APL) 組成[12]。協議棧的每一層都有自己的狀態機( FSM) 用來追蹤要進行的操作,開發時在應用層編寫相關應用程序。在主應用程序中應最早調用頂層狀態機,并且周期的調用狀態機函數以維持協議棧運行。ZigBee 接口模塊程序實現 ZigBee 消息的轉發、SPI 數據包轉發及地址映射表的建立和維護功能,主流程如圖4-7所示。初始化過程完成對協議棧、SPI 接口及硬件電路的設置,再調用aplFormNetwork( )函數組建網絡。網絡組建后程序開始循環執行。在循環中頂層狀態機函數首先被調用,然后檢查CAN 接收緩沖區是否有數據,如果緩沖區不為空,則從緩沖區中的數據塊提取 ZigBee 節點代碼及數據載荷,利用節點代碼查地址映射表獲得節點的短地址,調用 ZigBee 發送函數將數據打包發送至ZigBee節點。在頂層的狀態機中會調用apsRxFSM( )檢查是否接收到 ZigBee 消息,當接收到消息時調用 ZigBee 接收子程序。ZigBee 接收子程序提取消息中的有效載荷,并調用 SPI 發送子程序將其發送至CAN網絡接口模塊。有節點加入網絡時,狀態機將調用 usrJoinNotifyCall-back( LADDR * ptr) 子程序建立和維護地址映射表。ZigBee 接口模塊的SPI接口以中斷方式接收來自CAN網絡接口模塊的數據,接收到一個完整的SPI數據包后,將其存入CAN接收緩沖區等待發送。

- 21 -

圖 4-7 ZigBee 接口模塊主程序流程

3) 緩沖區的管理

ZigBee接口模塊的CAN接收緩沖區的結構為一個單輸入單輸出的循環消息隊列。緩沖區為一個結構體數組,每個數組元素存儲一個SPI數據包,數組長度即為緩沖區的大小。定義讀數據指針變量(R_Point)和寫數據指針變量(W_Point)對緩沖區進行操作,使緩沖區的讀和寫可以并發執行。R_Point和W_Point在初始化時指向緩沖區第一個數據塊。網關的 ZigBee 接口模塊接收到 SPI 數據包后,將數據包寫入W_Point指向的緩沖區,再將W_Point指向相鄰的下一數據塊。當對最后一個數據塊執行寫操作后,W_Point將指向緩沖區的第一個數據塊。從緩沖區中讀數據用指針變量R_Point完成。讀緩沖區之前,首先比較R_Point和W_Point的值,如果R_Point和W_Point值相同,則認為緩沖區為空,不能進行讀操作。否則認為緩沖區中有數據等待發送,讀取R_Point當前指向的數據塊,再將R_Point指向相鄰的下一數據塊。當對緩沖區的最后一個數據塊進行讀操作后,同樣使其指向緩沖

- 22 -

區的第一個數據塊。這樣,便完成了對緩沖區的循環讀寫操作,保證先收到數據能最先發送。緩沖區的數據塊結構定義如下:

typedef struct BUFF_UNION{ UINT16 Node_Code; UINT8 Data_Len; UINT8 RxData[6]; } CAN_Z_Buff_UNION

其中,Node_Code 存儲 ZigBee 節點代碼; Data_Len 的值表示數據塊中有效載荷長度;RxData 數組存儲數據載荷。

- 23 -





赌大小必赢数学公式