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