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