1、Zigbee協議棧簡介
協議是一系列的通信標准,通信雙方需要按照這一標准進行正常的數據發射和接收。協議棧是協議的具體實現形式,通俗講協議棧就是協議和用戶之間的一個接口,開發人員通過使用協議棧來使用這個協議,進而實現無線數據收發。
如圖1所示:Zigbee協議分為兩部分,IEEE 802.15.4定義了PHY(物理層)和MAC(介質訪問層)技術規范;Zigbee聯盟定義了NWK(網絡層)、APS(應用程序支持層)、APL(應用層)技術規范。Zigbee協議棧就是將各個層定義的協議都集合在一起,以函數的形式實現,並給用戶提供API(應用層),用戶可以直接調用。
圖1 ZigBee無線網絡協議層的架構圖
2、如何理解Zigbee協議棧
協議棧是協議的實現,可以理解為代碼,庫函數,供上層應用調用,協議較底下的層與應用是相互獨立的。商業化的協議棧只提供你接口(其實和互聯網行業的API模式很像)。就像你調用地圖API時不需要關心底層地圖是怎么根據位置或坐標繪制的,你也不用關心協議棧底層的實現,除非你想做協議研究。每個廠家的協議棧是有區別的,比如TI的BLE協議棧和nordic的BLE協議棧就有很大的不同(多說一點,TI的BLE協議棧更像是安卓的BLE結構,所以會安卓藍牙的人可能能看懂TI的代碼)。
3、如何使用Zigbee協議棧
以簡單的無線數據通信為例,其一般步驟為:
① 組網:調用協議棧組網函數、加入網絡函數,實現網絡的建立和節點的加入
② 發送:發送節點調用協議棧的發送函數,實現數據無線發送
③ 接收:接收節點調用協議棧的無線接收函數,實現無線數據接收
由於協議棧都把這些函數都封裝好了,因此我們用起來比較方便。下面是協議棧無線發送函數:
如果想更好的應用協議棧就需要對協議棧提供的這些函數及其參數的具體作用和意義進行細致的了解,這個在接下來中會詳細介紹。
4、安裝Zigbee協議棧
從我百度共享的所有本系列資料中下載004解壓並安裝:
圖2 ZigBee協議棧下載路徑
安裝好之后在win7開始按鈕下會有如下文件結構:
圖3 ZigBee協議安裝完成后的文件結構
其中:
5、基於協議棧的無線收發控制LED工程講解(一)
從網盤下載ZStack-2.3.1a壓縮文件:
圖4 工程源碼所在雲盤目錄
用IAR打開.. \ZStack-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB目錄下的工程文件,注意不要把001Stack-2.5.1a放在比較深的文件夾內,否則IAR打開工程時可能一直卡打不開,也最好不要有中文!打開后工程及結構如下:(有點眼花繚亂,不要緊,后面會結合源碼一步步分析)
圖5 工程整體架構
6、基於協議棧的無線收發控制LED工程講解(二)
在IAR中選擇XXXXEB,第一遍要rebuild all,下載好協調器之后,再切換到EndDeviceEB編譯下載到另一個板子做終端設備:
圖6 編譯工程
兩個節點程序下載好之后上電會看到:組網成功后D1閃爍。
圖7 實驗現象
7、基於協議棧的無線收發控制LED工程講解(三)
main code:
1 int main( void ) 2 { 3 osal_int_disable( INTS_ALL );// Turn off interrupts 關中斷 4 HAL_BOARD_INIT();// Initialization for board related stuff such as LEDs 5 zmain_vdd_check();// Make sure supply voltage is high enough to run 檢查芯片是否上電正常 6 InitBoard( OB_COLD );// Initialize board I/O 初始化I/O,LED,Timer等 7 HalDriverInit();// Initialze HAL drivers 初始化硬件抽象層驅動模塊 8 osal_nv_init( NULL );// Initialize NV System 初始化flash存儲器 9 znpTestRF();// Initialize and check the ZNP RF Test Mode NV items. 10 ZMacInit();// Initialize the MAC 初始化MAC層 11 zmain_ext_addr();// Determine the extended address 確定IEEE64位地址 12 13 #if defined ZCL_KEY_ESTABLISH 14 zmain_cert_init();// Initialize the Certicom certificate information. 15 #endif 16 17 zgInit();// Initialize basic NV items 初始化非易失變量 18 19 #ifndef NONWK 20 afInit();// Since the AF isn't a task, call it's initialization routine 21 #endif 22 23 osal_init_system();// Initialize the operating system 初始化OS(重點介紹1) 24 osal_int_enable( INTS_ALL );// Allow interrupts 使能中斷 25 InitBoard( OB_READY );// Final board initialization 最終板載初始化 26 zmain_dev_info();// Display information about this device 顯示設備信息(這里有LCD屏幕) 27 28 #ifdef LCD_SUPPORTED/* Display the device info on the LCD 將信息顯示在LCD上*/ 29 zmain_lcd_init(); 30 #endif 31 32 #ifdef WDT_IN_PM1 33 WatchDogEnable( WDTIMX );/* If WDT is used, this is a good place to enable it. */ 34 #endif 35 36 osal_start_znp(); // No Return from here 執行操作系統(重點介紹2) 37 38 return 0; // Shouldn't get here. 39 } // main()
代碼有點難懂,核心是執行初始化工作,包括硬件抽象層、網絡層、任務等。然后執行osal_start_znp() ,進入一個死循環,不斷對任務進行遍歷執行。這里我們需要重點了解兩個函數:
① 操作系統初始化函數
在操作系統初始化中需重點關注的是操作系統任務初始化osalInitTasks函數,操作系統初始化函數中主要來創建任務,taskID是任務ID,每增加一個任務ID++,同時ID越小表示該任務優先級越高!其中藍框內的函數是要根據系統想完成的任務做修改的地方,其他都是官方提供的基本不用變的任務。
② 操作系統啟動函數
執行OS的函數就是個大循環,不斷取出當前優先級最高的待處理事件進行處理,處理的核心思想在osal_run_task函數內:通過調用一個函數指針來遠程調用一個事件處理函數!
8、小結
至此,我們講到任務如何建立、如何處理等,其中有一個環節沒有講——如何從events=(tasksArr[idx])(idx,event)關聯到每個具體任務的事件處理函數的?這個其實我在CC2540/CC2541的前兩篇中已有詳細介紹:[接下來會針對具體通信梳理流程!]
1、CC2541藍牙4.0芯片中級教程——基於OSAL操作系統的運行流程了解+定時器和串口例程了解
2、CC2541芯片中級教程-OSAL操作系統(進一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個系統驅動層和應用層不一樣~
3、CC2541芯片中級教程-OSAL操作系統(ADC光敏電阻和修改串口波特率)
4、CC2541芯片中級教程-OSAL操作系統(簡單AT指令實現+IIC軟件和硬件實現驅動MPU6050)
5、CC2541芯片中級教程-OSAL操作系統(PWM+看門狗)
Zigbee系列文章:
[ZigBee] 3、ZigBee基礎實驗——GPIO輸出控制實驗-控制Led亮滅
[ZigBee] 5、ZigBee基礎實驗——圖文與代碼詳解定時器1(16位定時器)(長文)
[ZigBee] 6、ZigBee基礎實驗——定時器3和定時器4(8 位定時器)
[ZigBee] 7、ZigBee之UART剖析(ONLY串口發送)
[ZigBee] 8、ZigBee之UART剖析·二(串口收發)
[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530溫度串口顯示
[ZigBee] 12、ZigBee之看門狗定時器——餓了就咬人的GOOD DOG
[ZigBee] 13、ZigBee基礎階段性回顧與加深理解——用定時器1產生PWM來控制LED亮度(七色燈)
[ZigBee] 14、Zigbee無線通信前奏——BasicRF 簡單無線點對點傳輸協議
PS:如果您覺得還不錯,點個贊,讓更多人受益~
@beautifulzzzz 2016-07-31 continue~
e-mail:beautifulzzzz@qq.com
sina:http://weibo.com/beautifulzzzz?is_all=1