AT86RF231zigbee的使用一
時間:2016-12-14作者:華清遠見
電路如圖所示:
其中控制(zhi)芯片使(shi)用SAM3S4B,通(tong)過SPI格(ge)式(單一(yi)(yi)的SAM3S4B為(wei)主端,AT86RE231為(wei)從端)與AT86RF231進(jin)行通(tong)訊,AT86RF231是一(yi)(yi)款工(gong)業(ye)級,低電壓供電,超低功耗,方便操(cao)作(zuo),遵(zun)循IEEE802.15.4-2006 硬件標準。AT86RF231將控制(zhi)信號(hao)轉換為(wei)zigbee模式的差分對信號(hao),通(tong)過2.45Ghz的諧波(bo)(bo)濾波(bo)(bo)器2450FB15L0001濾波(bo)(bo)后接(jie)入(ru)天線與其余zigbee端點進(jin)行通(tong)訊,2450FB15L0001主要(yao)是對接(jie)受到得zigbee信號(hao)進(jin)行濾波(bo)(bo)。 Zigbee框架下(xia)編譯程序,需要進行些簡單的設置(zhi), 因(yin)為處與zigbee協議(yi)棧框架中,部分源碼被atmel,封(feng)裝(zhuang)起來,在(zai)man函數(shu)中,SYS_sysinit();系統(tong)初始化(hua)給出(chu).h文件(jian),而沒有具(ju)體的(de)C代碼。這(zhe)意味ZIGBEE的(de)具(ju)體結構(gou)核心部分不(bu)是開(kai)源的(de)。實際(ji)中SYS_sysinit()在(zai)libBc_All_At91sam3s4c_Rf231_Iar.a中,該文件(jian)被封(feng)裝(zhuang)起來。 其(qi)中,對(dui)(dui)bitcloud編譯生成(cheng)的是libHAL_Sam3sEkRf2xx_At91sam3s4c_64Mhz_Iar.a。 這里面(mian)即便被封住,我們可(ke)以進入bitcloud源碼內,解(jie)讀代(dai)(dai)碼,如(ru)WTD操作,HAL_InstallInterruptVector(),TimeTick_Configure()還是可(ke)以進行代(dai)(dai)碼解(jie)讀的。那對(dui)(dui)zigbee格式下(xia)的函數應該怎樣跟蹤解(jie)析(xi)代(dai)(dai)碼:例如(ru)pio.h中,PIO_Configure();無法看(kan)到C代(dai)(dai)碼的實現過(guo)程。可(ke)以鼠(shu)標右(you)擊pio.h文(wen)(wen)(wen)件(jian)(見下(xia)圖(tu)1),open containing folder,打(da)開文(wen)(wen)(wen)件(jian)夾,找到include中的pio.h文(wen)(wen)(wen)件(jian),可(ke)以推(tui)測出點C文(wen)(wen)(wen)件(jian)如(ru)果有,應該存在于source中。進行代(dai)(dai)碼解(jie)讀。
在下(xia)面歷程(cheng)中(zhong),給出協調器和(he)節(jie)點的實現。 協調器部分程序: int main(void) SYS_SysInit();函(han)數是系統的(de)函(han)數,用來初始化系統的(de)硬(ying)件; SYS_RunTask();是調用(yong)(yong)zigbee的(de)入口函數,會調用(yong)(yong)BitCloud協議棧(zhan)中的(de)用(yong)(yong)戶(hu)應(ying)用(yong)(yong)程(cheng)序(xu),即APL_TaskHandler(); voidAPL_TaskHandler(void) APL_TaskHandler();這個函(han)數(shu)類似個有限(xian)狀(zhuang)態(tai)機,是zigbee所處狀(zhuang)態(tai)的(de)處理,程序在初始化(hua)時static AppState_tappState = APP_INITIAL_STATE; 如果沒有添加入網絡(luo)(luo)(luo),或者(zhe)從(cong)網絡(luo)(luo)(luo)中斷掉,在主程(cheng)序每次(ci)循環的時候,會添加入網絡(luo)(luo)(luo),如果是已將處(chu)于zigbee網絡(luo)(luo)(luo)中,則處(chu)于APP_JOINED_STATE狀態,直接退出(chu)APL_TaskHandler()函數。 我們(men)可以看下(xia)具體狀態下(xia)的(de)子函數; 硬件初始(shi)化只是(shi)配置個LED,當zigbee網絡正常工作時(shi),led1常亮狀態,否(fou)認閃(shan)亮。 static void initHardware(void) 而對協調器的配(pei)置(zhi)是zigbee配(pei)置(zhi)的關鍵部(bu)分(fen),下(xia)面(mian)一段(duan)代(dai)碼將本(ben)身(shen)配(pei)置(zhi)為協調器,并在網絡中定義(yi)兩(liang)個節點。 static void initNetwork(void) 初始化(hua)結(jie)束后會改變appState的狀態,appState = APP_JOINING_STATE; 進行網絡的加入操作,使用SYS_PostTask(APL_TASK_ID);來投遞任(ren)務,讓(rang)系(xi)統(tong)再次調用APL_TaskHandler() 去執(zhi)行case APP_JOINING_STATE進而去執(zhi)行startNetwork()函數。 startNetwork()創(chuang)建一個定時器用來控制led的亮滅來表示網絡(luo)的連接狀態,在注冊一個網絡(luo)連接確認的回調函數。 static void startNetwork(void) 回調函數中(zhong),主要是判(pan)斷zigbee網絡連(lian)接(jie),連(lian)接(jie)成功,關閉定時(shi)器和(he)注冊網絡節(jie)點。 static void ZDO_StartNetworkConf(ZDO_StartNetworkConf_t* conf) zigbee數(shu)據發送函數(shu): static void sendDataBlock(unsigned char channel) zigbee數(shu)據接(jie)受(shou)函數(shu): static void APS_DataIndData(APS_DataInd_t *ind) //data come from sensor module 在zigbee的(de)節點函數APL_TaskHandler(),與協(xie)調器程(cheng)序(xu)中多的(de)狀態是:離(li)開(kai)zigbee網(wang)絡,定(ding)義的(de)宏是APP_LEAVE_STATE。 voidAPL_TaskHandler(void)
相關資訊
發表評論
|