一.前言
從今天開始,我們要正式開始進行zigbee相關的通信實驗了,我所使用的協議棧是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以從TI的官網上直接下載TI公司為cc2530寫的協議棧代碼,畢竟,我們作為初學者,應該先不要去深究協議棧是怎么用代碼編寫的,畢竟zigbee已經相當成熟了,我們應該先學會使用zigbee協議棧進行通信,并能應用于實際項目中,比如說智能家具,不知道大家是不是有同感,所以下面我就先給大家介紹一下zigbee通信的原理以及體系架構。
二.ZStack 體系架構
ZStack 的體系結構由稱為層的各模塊組成。每一層為其上層提供特定的服務:即由數據服務實體提供數據傳輸服務;管理實體提供所有的其他管理服務。每個服務實體通過相應的服務接入點(SAP) 為其上層提供一個接口,每個服務接入點通過服務原語來完成所對應的功能。
ZStack 根據IEEE 802.15.4 和ZigBee 標準分為物理層,介質接入控制層,網絡層,應用層。物理層提供了基礎的服務,數據傳輸和接收,網絡層提供了各個節點連入的服務,是zigbee網絡通信的關鍵,應用層是我們關注的重點,提供了應用的框架和ZDO。大家如果想了解體系結構的具體內容,可以自己去看說明文檔,下面我給大家介紹一下zigbee工作原理。
ZStack 采用操作系統的思想來構建,采用事件輪循機制,而且有一個專門的Timer2 來負責定時。從CC2530 工作開始,Timer2 周而復始地計時,有采集、發送、接收、
顯示…等任務要執行時就執行。當各層初始化之后,系統進入低功耗模式,當事件發生時,喚醒系統,開始進入中斷處理事件,結束后繼續進入低功耗模式。如果同時有幾個事件發生,判斷優先級,逐次處理事件。這種軟件構架可以極大地降級系統的功耗。
整個ZStack 的主要工作流程,如圖所示,大致分為以下6 步:
(1) 關閉所有中斷;
(2) 芯片外部(板載外設)初始化;
(3) 芯片內部初始化;
(4) 初始化操作系統;
(5) 打開所有中斷;
(6) 執行操作系統。
這就是zigbee處理任務的大致過程。
三.代碼分析
協議棧的代碼很多,而且很復雜,上圖就明白了。。。
這還只是一部分,所以我們先不用太過于專注于協議棧的編寫,而是要學會如何用,我們主要學習和配置的就是圖中SampleApp.c這個文件,它主要就是應用于應用的,我們面對不同的應用,只要修改它和底層的配置文件就行了。它里面有6個非常重要的函數,這6 個函數,有關于初始化用戶功能
的;有關于所有事件的 處理的;有按鍵服務功能編寫的;有接收數據的處理的;有數據發送函數的編寫的。下面我們就對這6 個函數進行分析:
void SampleApp_Init( uint8 task_id )
這是一個用戶用于初始化任務的函數,它是在系統初始化階段被調用的,而且,在調用它的時候,它里面應該有相應任務的初始化(也就是說,用戶有什么初始化,都是放在這個函數里),比如:硬件初始化、數據表初始化、電源初始化等等。
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
這是一個事件處理函數(所有事件都是它管理),當有已登記的事件發生時,它就被主函數調用來對事件進行處理,這些事件包括:定時器、消息、以及用戶定義的事件等
等。
這個函數的功能包括:按鍵處理,數據接收,數據發送。當然,用戶可以自己添加其它事件,我們就在這個函數添加自己的串口事件。
void SampleApp_HandleKeys( uint8 shift, uint8 keys )
這個函數是給SampleApp_ProcessEvent( uint8 task_id, uint16 events )調用的:當按鍵按下后,就會執行SampleApp_ProcessEvent 函數里的case KEY_CHANGE ,這個case 的服務函數就是SampleApp_HandleKeys( uint8 shift, uint8 keys ),我們可以在這個函數里添加按鍵判斷,判斷哪個按鍵,然后執行相關任務。
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
這個函數管理所有接收到的數據,至于數據來自哪個設備,它是根據簇ID 來分辨的。
函數里面就是一個switch 語句,關鍵是case 及其后面的服務函數。用戶可以根據不同的功能,定義不同的簇ID(在SampleApp.h 里進行),然后在這個switch 語句里添加一個以簇ID 來命名的case,并在case 里面編寫自己的應用程序。
void SampleApp_SendPeriodicMessage( void )
這個函數,是一個周期性數據發送函數,它是設備設置為周期性廣播的時候調用的,它是我們設置發送數據的地方。
void SampleApp_SendFlashMessage( uint16 flashTime )
這個函數是void SampleApp_HandleKeys( uint8 shift, uint8 keys )函數的一個服務函數,我們也是極少用到這個函數的,故不作詳解。
上述就是常用的6個函數,對于初學者,會使用zigbee協議進行應用就夠了,先對驅動進行移植,在進行硬件進行初始化,在修改這6個函數,就可以對zigbee進行簡單的應用了,今天就先寫到這里了,協議棧代碼太多了我就不貼出來了,需要的朋友聯系我,大家相互學習,這只是我的一點體會。
-
ZigBee技術
+關注
關注
3文章
115瀏覽量
42376
發布評論請先 登錄
相關推薦
評論