通信新技術(shù)實(shí)驗(yàn)報(bào)告_第1頁
通信新技術(shù)實(shí)驗(yàn)報(bào)告_第2頁
通信新技術(shù)實(shí)驗(yàn)報(bào)告_第3頁
通信新技術(shù)實(shí)驗(yàn)報(bào)告_第4頁
通信新技術(shù)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩184頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

通信新技術(shù)綜合訓(xùn)練報(bào)告通信新技術(shù)綜合訓(xùn)練報(bào)告學(xué)院名稱:專業(yè):班級(jí):姓名:學(xué)號(hào):指導(dǎo)老師:2012年3月目錄實(shí)驗(yàn)一Jennic-WSN開發(fā)環(huán)境 1實(shí)驗(yàn)二GPIO及LCD使用實(shí)驗(yàn) 4實(shí)驗(yàn)三簡(jiǎn)單點(diǎn)對(duì)點(diǎn)無線通信實(shí)驗(yàn) 8實(shí)驗(yàn)四兩個(gè)EndDevice之間的無線通信實(shí)驗(yàn) 14實(shí)驗(yàn)五DIO中斷實(shí)驗(yàn) 18實(shí)驗(yàn)六定時(shí)器實(shí)驗(yàn) 23實(shí)驗(yàn)七UART實(shí)驗(yàn) 27實(shí)驗(yàn)八ADC及數(shù)據(jù)采集實(shí)驗(yàn) 32實(shí)驗(yàn)九休眠和掉電保護(hù)實(shí)驗(yàn) 38心得體會(huì) 44附錄 45 實(shí)驗(yàn)一Jennic-WSN開發(fā)環(huán)境一、實(shí)驗(yàn)內(nèi)容1.熟悉基于JN5139芯片所開發(fā)的一系列開發(fā)板及外圍部件;2.了解zigbee系統(tǒng);3.掌握軟件的安裝與調(diào)試;4.熟悉常用API接口函數(shù)。二、實(shí)驗(yàn)原理1.JN5139最小系統(tǒng)及外圍部件基于JN5139芯片所設(shè)計(jì)的最小系統(tǒng)。SPISSZ與SPISSM連接,SPISWP接高電平,JN5139上電自動(dòng)復(fù)位或按鍵復(fù)位,SPIMISO為編程控制端,與復(fù)位按鍵配合使用,經(jīng)DIO6、DIO7實(shí)現(xiàn)程序BIN文件的下載。JN5139模塊提供如下外圍部件功能:5個(gè)主SPI選擇口;2個(gè)UART串口;2個(gè)帶捕獲/比較功能的可編程定時(shí)器/計(jì)數(shù)器;2個(gè)可編程睡眠定時(shí)器和1個(gè)滴答定時(shí)器;兩線串口(兼容SMbus和I2C);從SPI接口(與數(shù)據(jù)I/O共享);21個(gè)數(shù)據(jù)I/O口(與UART串口、定時(shí)器及SPI選擇復(fù)用);4通道12位100kbps模數(shù)轉(zhuǎn)換輸入;2個(gè)11位數(shù)模轉(zhuǎn)換輸入;2個(gè)可編程模擬比較輸入;內(nèi)部溫度傳感及電壓監(jiān)控。2.開發(fā)板基于JN5139芯片所設(shè)計(jì)的WSN開發(fā)板,其部件如下:U1:JN5139系列Zigbee模塊;U2:板載光照度傳感器;U3:板載溫濕度一體傳感器;J3:外供電(5VDC)接口;Swith:供電開關(guān);J7:編程與運(yùn)行狀態(tài)選擇,左跳并給傳感器板加電,則進(jìn)入可編程狀態(tài),或者在加電的情況下,按住RESET按鈕,左跳J7,然后放開RESET按鈕,再右跳J7,也可進(jìn)入可編程狀態(tài),退出可編程狀態(tài),只需要按一下RESET按鈕即可;J8:Flash寫保護(hù)跳選,編程與運(yùn)行都跳選到RUN(右跳);DB9:RS232編程接口;UART0:串口0;JP6:模塊所有管腳的引出排線;LCD:液晶接口;Power:電源指示燈;REST:復(fù)位按鍵;LED3,LED2,LED1,LED0:可編程LED,分別對(duì)應(yīng)DIO19、DIO18、DIO17、DIO16;SW3,SW2,SW1,SW0:可編程按鍵,分別對(duì)應(yīng)DIO20、DIO11、DIO10、DIO9;GND:地。3.軟件的安裝與調(diào)試(1)建立開發(fā)環(huán)境在光盤中找到software文件夾下的JN-SW-4031-SDK-Toolchain-v1.1.exe文件(或者在Jennic公司網(wǎng)站上獲得該文件)并運(yùn)行。在安裝過程中,最簡(jiǎn)單的方法是按默認(rèn)設(shè)置安裝。(2)編寫程序代碼并進(jìn)行下載與調(diào)試編寫代碼完成后,可按Ctrl+F9快捷鍵或選擇主菜單Build下的Build子菜單或點(diǎn)擊圖標(biāo)建立可執(zhí)行二進(jìn)制代碼文件。若工程編譯(Build)成功,則可在C:\Jennic\cygwin\jennic\SDK\Application\test\JN5139_Build\Release目錄下生成test.bin文件。否則,出錯(cuò)信息會(huì)顯示在信息窗口中,根據(jù)出錯(cuò)信息調(diào)試程序。JennicJN51xxFlash可編程器是用來將編譯好的二進(jìn)制代碼文件(*.bin)下載到JN51xx模塊中的Flash芯片的代碼下載工具,它通過串行總線與JN51xx模塊相連。JennicJN51xxFlash可編程器的用戶界面如圖1-18所示,它可以將*.bin文件下載到目標(biāo)板或模塊中,下載步驟如下:a.用串口線連接PC機(jī)和目標(biāo)板或模塊。b.運(yùn)行Flash可編程器,選擇PC機(jī)與目標(biāo)板相連的串行通訊端口。c.將目標(biāo)板上的J7跳線至編程(左側(cè))狀態(tài),給目標(biāo)板上電,按一下RESET按鈕后釋放,再恢復(fù)J7跳線至右側(cè)。d.在圖1-18所示的Flash可編程界面上點(diǎn)擊Browse按鈕(圖中①處)查找并選擇要下載的目標(biāo)文件。e.選擇好目標(biāo)文件后,點(diǎn)擊Progrm按鈕(圖中②處)開始下載。在下載的過程中會(huì)顯示一個(gè)下載的進(jìn)度條,如圖1-19所示。當(dāng)下載完成后,將顯示下載成功或錯(cuò)誤,如圖1-20所示下載成功對(duì)話框。如果遇到錯(cuò)誤,請(qǐng)嘗試重新下載。f.成功下載后,關(guān)掉Flash可編程器再給目標(biāo)板或模塊上電、或按Reset按鈕,則剛下載的代碼自動(dòng)運(yùn)行。4.常用API接口函數(shù)介紹(1)應(yīng)用程序初始化函數(shù)如下:AppColdStart()應(yīng)用程序的入口,相當(dāng)于標(biāo)準(zhǔn)C中的main函數(shù),結(jié)點(diǎn)上電后將從這里開始執(zhí)行應(yīng)用程序。該函數(shù)需要完成以下功能:1.通過設(shè)置函數(shù)中的參數(shù)值來設(shè)置信道號(hào)(JZS_sConfig.u32Channel)和PANID(JZS_sConfig.u16PanId);2.調(diào)用函數(shù)JZS_u32InitSystem(TRUE)來初始化ZigBee協(xié)議棧;3.調(diào)用函數(shù)vInit()對(duì)用戶的應(yīng)用進(jìn)程進(jìn)行初始化,包括初始化按鈕動(dòng)作和程序變量,設(shè)定綁定等操作;4.調(diào)用bBosRun(TRUE)來啟動(dòng)操作系統(tǒng)BOS。用戶可根據(jù)具體的應(yīng)用設(shè)計(jì)該函數(shù)。AppWarmStart()結(jié)點(diǎn)從內(nèi)存供電的休眠模式喚醒的時(shí)候?qū)⑦M(jìn)入這個(gè)函數(shù)。啟動(dòng)后所有的內(nèi)存數(shù)據(jù)都沒有丟失。如果設(shè)備不需要休眠喚醒功能,這個(gè)函數(shù)可以為空。用戶可根據(jù)具體的應(yīng)用設(shè)計(jì)該函數(shù)。一般情況下,該函數(shù)會(huì)調(diào)用AppColdStart()重新啟動(dòng)設(shè)備。(2)應(yīng)用程序調(diào)用協(xié)議棧的函數(shù)如下:JZS_u32InitSystem()初始化JennicZigBee協(xié)議棧。JZS_vStartStack()設(shè)備將作為Coordinator、Router或者EndDevice啟動(dòng)。如果是Coordinator將啟動(dòng)網(wǎng)絡(luò),如果是Router或者EndDevice將加入網(wǎng)絡(luò)。JZS_vStartNetwork()手動(dòng)控制Coordinate網(wǎng)絡(luò)啟動(dòng),相對(duì)于自動(dòng)網(wǎng)絡(luò)啟動(dòng),使用該功能,需要設(shè)置JZS_sConfig.bAutoJoin=FALSE.該函數(shù)執(zhí)行后,返回的協(xié)議棧事件為JZS_EVENT_NWK_STARTEDJZS_EVENT_FAILED_TO_START_NETWORK。vAppSaveContexts()保存網(wǎng)絡(luò)參數(shù)以及用戶的數(shù)據(jù),如果你的應(yīng)用是固定點(diǎn)的話,建議你進(jìn)行網(wǎng)絡(luò)參數(shù)的保存。u16AppGetContextSize()用來獲取保存的網(wǎng)絡(luò)參數(shù)以及用戶數(shù)據(jù)的尺寸。vAppGetContexts()讀取保存的網(wǎng)絡(luò)參數(shù)的內(nèi)容。(3)協(xié)議棧調(diào)用應(yīng)用函數(shù)的函數(shù)如下:JZA_boAppStart()讓用戶可以在協(xié)議棧啟動(dòng)前定義endpoint的descriptor,通常開發(fā)人員應(yīng)該在這個(gè)函數(shù)中調(diào)用JZS_vStartStack啟動(dòng)協(xié)議棧。JZA_vStartEvent()協(xié)議棧將通過這個(gè)函數(shù)反饋網(wǎng)絡(luò)層的一些網(wǎng)絡(luò)事件,比如網(wǎng)絡(luò)啟動(dòng)成功、結(jié)點(diǎn)加入成功或者數(shù)據(jù)發(fā)送完成等。JZA_vPeripheralEvent()該函數(shù)主要用來處理外部的硬件中斷,比如按鈕、定時(shí)器、UART等。JZA_vAppEventHandler()BOS周期性地調(diào)用該函數(shù)處理硬件中斷。用戶可以利用它進(jìn)行網(wǎng)絡(luò)狀態(tài)的判斷和按鈕的檢查等,也可以在這個(gè)函數(shù)中,寫入自己的應(yīng)用程序。在設(shè)計(jì)該函數(shù)時(shí),要盡可能地使其運(yùn)行時(shí)間短,以便BOS調(diào)度其他活動(dòng)事件。JZA_vAppDefineTasks()該函數(shù)用于向BOS注冊(cè)自己的用戶任務(wù),一般很少使用該函數(shù)。JZA_bAfMsgObject()收到其他結(jié)點(diǎn)發(fā)送來的MSG幀的處理函數(shù)。實(shí)驗(yàn)二GPIO及LCD使用實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.運(yùn)用基本GPIO函數(shù)設(shè)計(jì)一個(gè)程序,分別通過各按鍵切換對(duì)應(yīng)LED亮/滅狀態(tài)。2.設(shè)計(jì)一個(gè)程序,實(shí)現(xiàn)LED自動(dòng)閃爍,周期為1秒。3.設(shè)計(jì)一個(gè)程序,按下按鍵SW0,LCD顯示數(shù)據(jù)加1;按下按鍵SW1,LCD顯示數(shù)據(jù)減1。二、實(shí)驗(yàn)原理1.GPIO使用Jennic的模塊具有21路通用的GPIO,可以通過軟件的方式進(jìn)行設(shè)置,這些GPIO口和其他的外圍接口是共用的。其共用關(guān)系如表2-1所示:表2-1:IO口和其他的外圍接口共用關(guān)系DIO引腳共用關(guān)系DIO0SPI從選擇1(輸出)DIO1SPI從選擇2(輸出)DIO2SPI從選擇3(輸出)DIO3SPI從選擇4(輸出)DIO4-DIO7UART0DIO8-DIO10Timer0DIO11-DIO13Timer1DIO14-DIO15SerialinterfaceDIO16IPdatainDIO17-DIO20UART1常用函數(shù):(1)對(duì)于GPIO的操作首先需要調(diào)用vAHI_DioSetDirection來進(jìn)行GPIO輸入輸出方向的設(shè)置。該函數(shù)的原型如下:PUBLICvoidvAHI_DioSetDirection(uint32u32Inputs,uint32u32Outputs);這里u32Inputs和u32Outputs是設(shè)置GPIO輸入和輸出地mask碼。(2)對(duì)于GPIO的輸出操作比較簡(jiǎn)單,通過調(diào)用如下原型函數(shù):PUBLICvoidvAHI_DioSetOutput(uint32u32On,uint32u32Off);這里u32On和u32Off分別是設(shè)置GPIO輸出高、低電平的掩碼。(3)對(duì)于GPIO的輸入操作,通常調(diào)用如下原型函數(shù):PUBLICuint32u32AHI_DioReadInput(void);返回值對(duì)應(yīng)每個(gè)輸入DIO的高低電平。2.LED使用LED驅(qū)動(dòng)庫文件提供了LED的控制方法,在LedControl.h中宏定義了相應(yīng)功能函數(shù)。對(duì)于LED的操作,首先要調(diào)用初始化函數(shù)vLedInitFfd()初始化FFD開發(fā)板上的四個(gè)LED,然后調(diào)用函數(shù)vLedControl(LED,ON)控制相應(yīng)LED點(diǎn)亮或熄滅。相應(yīng)函數(shù)原型如下:PUBLICvoidvLedInitFfd(void);PUBLICvoidvLedControl(uint8u8Led,bool_tbOn);3.按鍵使用按鍵驅(qū)動(dòng)庫文件提供了按鍵的控制方法,在Button.h中宏定義了相應(yīng)功能函數(shù)。對(duì)于按鍵的操作,首先要調(diào)用初始化函數(shù)vButtonInitFfd()初始化FFD開發(fā)板上的四個(gè)按鍵,然后調(diào)用函數(shù)u8ButtonReadFfd()讀取相應(yīng)按鍵的狀態(tài)。相應(yīng)函數(shù)原型如下:PUBLICvoidvButtonInitFfd(void);PUBLICuint8u8ButtonReadFfd(void); 4.LCD使用LCD驅(qū)動(dòng)庫文件庫提供了液晶的驅(qū)動(dòng)方法,在Lcd_JM12864_Driver.h中提供了相應(yīng)功能的原型函數(shù)。5.BOS定時(shí)器的使用為了消除按鈕抖動(dòng)對(duì)控制器的影響,本實(shí)驗(yàn)設(shè)置的一個(gè)讀取按鈕的標(biāo)志變量NextReadStart,若其值為TRUE且有按下按鈕SW的操作,則設(shè)置其為FALSE,并利用BOS的定時(shí)器函數(shù)bBosCreateTimer()定時(shí),500ms后再次設(shè)置NextReadStart為真。通過關(guān)這種方法可有效地消除按鈕抖動(dòng)的影響。bBosCreateTimer()函數(shù)是一個(gè)處理軟件定時(shí)器的BOSAPI函數(shù),調(diào)用該函數(shù)可由BOS創(chuàng)建一個(gè)軟件定時(shí)器,該定時(shí)器要利用內(nèi)部硬件滴答定時(shí)器(ticktimer)來實(shí)現(xiàn)。當(dāng)定時(shí)時(shí)間到,立即調(diào)用由bBosCreateTimer()指定的定時(shí)處理程序。6.協(xié)議棧事件函數(shù)JZA_vStackEvent()是一個(gè)協(xié)議棧調(diào)用應(yīng)用程序的函數(shù)(回調(diào)函數(shù))。它的主要功能是處理來自于協(xié)議棧底層的各種事件,比如,APS層數(shù)據(jù)傳輸確認(rèn)。用戶通過該函數(shù)可以處理來自于AF和ZDP層的事件。該函數(shù)的原型為:PUBLICvoidJZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent);其中參數(shù)eEventId表示事件的類型,參數(shù)puStackEvent表示有關(guān)發(fā)生事件的補(bǔ)充信息。7.周期性調(diào)用函數(shù)網(wǎng)絡(luò)啟動(dòng)后,每隔一定時(shí)間,BOS就會(huì)調(diào)用JZA_vAppEventHandler()函數(shù)一次,該函數(shù)專門來處理硬件中斷,用戶可以在該函數(shù)中添加用于網(wǎng)絡(luò)狀態(tài)判斷、按鈕檢查等檢測(cè)中斷事件的程序代碼,也可以添加用于發(fā)送數(shù)據(jù)的程序代碼等。本實(shí)驗(yàn)利用該函數(shù)檢查是否按下SW按鈕。三、軟件設(shè)計(jì)1.運(yùn)用基本GPIO函數(shù)設(shè)計(jì)一個(gè)程序,分別通過各按鍵切換對(duì)應(yīng)LED亮/滅狀態(tài)。程序首先執(zhí)行AppColdStart()函數(shù),自動(dòng)尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘,其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,網(wǎng)絡(luò)啟動(dòng)成功后就開始讀取按鍵值,并執(zhí)行相應(yīng)的按鍵控制LED亮滅的子程序,主程序流程圖如下圖所示:2.設(shè)計(jì)一個(gè)程序,實(shí)現(xiàn)LED自動(dòng)閃爍,周期為1秒。程序首先執(zhí)行AppColdStart()函數(shù),自動(dòng)尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘,其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,網(wǎng)絡(luò)啟動(dòng)成功后就調(diào)用vAppTickLED()函數(shù),定時(shí)為1s,定時(shí)時(shí)間一到,循環(huán)執(zhí)行vAppTickLED()函數(shù),通過定義一個(gè)變量LED,LED循環(huán)變化,利用vLedControl(LED,TRUE),實(shí)現(xiàn)LED的流水燈顯示。主程序流程圖如下圖所示:3.設(shè)計(jì)一個(gè)程序,按下按鍵SW0,LCD顯示數(shù)據(jù)加1;按下按鍵SW1,LCD顯示數(shù)據(jù)減1。程序首先執(zhí)行AppColdStart()函數(shù),自動(dòng)尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘,其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,網(wǎng)絡(luò)啟動(dòng)成功后調(diào)用JZA_vAppEventHandler()函數(shù)讀取按鍵值,若有鍵按下,調(diào)用按鍵子程序vProcessSplashKeyPress(),執(zhí)行case語句:按鍵0,對(duì)液晶顯示的數(shù)進(jìn)行加1;按鍵1,對(duì)液晶顯示的數(shù)進(jìn)行減1。主程序流程圖如下圖所示:四、實(shí)驗(yàn)結(jié)果與分析1.實(shí)驗(yàn)一中分別按下按鍵SW0~SW3,相應(yīng)的LED0~LED3能夠改變當(dāng)前的狀態(tài),按動(dòng)一下亮、按動(dòng)一下滅,實(shí)現(xiàn)了按鍵控制LED燈的亮滅;2.實(shí)驗(yàn)二中實(shí)現(xiàn)LED的自動(dòng)閃爍,實(shí)際實(shí)驗(yàn)中實(shí)現(xiàn)的是4個(gè)LED燈依次閃爍,及以流水燈的形式顯示,每?jī)蓚€(gè)燈之間的切換時(shí)間為1s;3.實(shí)驗(yàn)三中實(shí)現(xiàn)了LCD的顯示,并通過按鍵控制相應(yīng)的顯示為加1還是減1,按下SW0,數(shù)值加1,按下SW1,數(shù)值減1,LCD上顯示的初始值為000,加滿后為255。五、存在問題和解決方法1.在完成實(shí)驗(yàn)二時(shí),題目要求周期為1s,設(shè)計(jì)成流水燈的形式,其周期為1s代表的含義應(yīng)該是四個(gè)LED燈依次點(diǎn)亮的時(shí)間為1s,而不是每個(gè)燈點(diǎn)亮的間隔為1s,所以通過改變延時(shí)來解決此問題,因此,在閱讀題目的時(shí)候需要仔細(xì)閱讀題目要求,弄清題意。2.在完成實(shí)驗(yàn)三時(shí),LCD剛開始的時(shí)候不能顯示,但是通過檢測(cè)LED的亮滅可以知道,程序已經(jīng)執(zhí)行,可以看出,LCD的顯示程序存在一些問題,通過仔細(xì)研究,發(fā)現(xiàn)LCD顯示部分有所漏缺,修改后LCD正常顯示。實(shí)驗(yàn)三簡(jiǎn)單點(diǎn)對(duì)點(diǎn)無線通信實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,分別用按鍵控制切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,其功能為:按下Coordinator的SW0,某變量X(初始值0)顯示在LCD上,同時(shí)將X發(fā)送給EndDevice,EndDevice收到該數(shù)據(jù)后進(jìn)行數(shù)據(jù)處理(加1),等待1秒后再將其發(fā)送給Coordinator,Coordinator收到后將該值賦予X并顯示在LCD上,同時(shí)再次發(fā)送給EndDevice,如此重復(fù)運(yùn)行。二、實(shí)驗(yàn)原理1.獲得16位短地址的方法Coordinator的16位短地址固定為0x0000,而EndDevice的16位短地址是由Coordinator動(dòng)態(tài)分配的。EndDevice可直接使用短地址0x0000與Coordinator通信,而Coordinator與EndDevice通信時(shí),Coordinator必須使用EndDevice的短地址。在應(yīng)用程序中,Coordinator獲得EndDevice短地址的方法比較簡(jiǎn)單,每當(dāng)有新的結(jié)點(diǎn)加入到網(wǎng)絡(luò)時(shí),Coordinator協(xié)議棧就會(huì)調(diào)用處理協(xié)議棧低層的回調(diào)函數(shù)JZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent),參數(shù)puStackEvent是一個(gè)指向棧事件tuJZS_StackEvent類型的指針,通過該參數(shù)即可獲得新加入結(jié)點(diǎn)的16位短地址。下面的JZA_vStackEvent()函數(shù)的代碼中給出了獲取16位短地址DstAddress的具體方法。if(eEventId==JZS_EVENT_NEW_NODE_HAS_JOINED){DstAddress=puStackEvent->sNewNodeEvent.u16ShortAddr;}2.數(shù)據(jù)格式ZigBee2004支持KVP鍵值對(duì)和MSG消息幀兩種類型數(shù)據(jù)格式。KVP是ZigBee2004協(xié)議中規(guī)定的一種特殊的數(shù)據(jù)傳輸機(jī)制,通過一種規(guī)定來標(biāo)準(zhǔn)化數(shù)據(jù)傳輸格式和內(nèi)容,主要用于傳輸較簡(jiǎn)單的變量值格式;MSG是ZigBee協(xié)議中規(guī)定的另一種數(shù)據(jù)傳輸機(jī)制,這種機(jī)制在數(shù)據(jù)傳輸格式和內(nèi)容上并不做更多的規(guī)定,主要用于專用的數(shù)據(jù)流或文件數(shù)據(jù)等數(shù)據(jù)量較大的情況。由于在ZigBee2006及以后的版本中不再支持KVP格式的數(shù)據(jù)包,因此,在本實(shí)驗(yàn)中,僅使用MSG消息幀進(jìn)行數(shù)據(jù)的傳輸。在JennicZigBee應(yīng)用程序中,通常使用協(xié)議棧提供的afdeDataRequest()函數(shù)發(fā)送數(shù)據(jù)幀。當(dāng)一個(gè)結(jié)點(diǎn)收到來自其他結(jié)點(diǎn)的MSG幀時(shí),協(xié)議棧就會(huì)調(diào)用回調(diào)函數(shù)JZA_bAfMsgObject()對(duì)接收的MSG幀進(jìn)行處理。在數(shù)據(jù)收發(fā)過程中,發(fā)送和接收設(shè)備雙方都需要知道事件的數(shù)據(jù)格式,才能正確處理信息。3.創(chuàng)建和發(fā)送數(shù)據(jù)請(qǐng)求函數(shù)afdeDataRequest()該函數(shù)屬于AFDE(AFSub-layerDataEntity)類函數(shù),用來向網(wǎng)絡(luò)層發(fā)出數(shù)據(jù)發(fā)送的請(qǐng)求。該函數(shù)的原型為:Stack_Status_eafdeDataRequest(APS_Addrmode_eeAddrMode,uint16u16AddrDst,uint8u8DstEP,uint8u8SrcEP,uint16u16ProfileId,uint8u8ClusterId,AF_Frametype_eeFrameType,uint8u8TransCount,AF_Transaction_s*pauTransactions,APS_TxOptions_eu8txOptions,NWK_DiscoverRoute_eeDiscoverRoute,uint8u8RadiusCounter);各形參描述如下:eAddrMode:該參數(shù)定義了發(fā)送的目標(biāo)地址模式,它是APS_Addrmode_e枚舉類型的數(shù)據(jù)。u16AddrDst:該參數(shù)是數(shù)據(jù)要發(fā)送的目標(biāo)地址,地址范圍為0x0000到0xFFFE。u8DstEP:目標(biāo)地址的端口號(hào),范圍是0x01到0xF0。u8SrcEP:源地址的端口號(hào),范圍是0x01到0xF0。u16Profileid:所采用的pro。u8ClusterId:所采用的clusterID。eFrameType:使用的數(shù)據(jù)幀類型0x01=KVP,0x02=MSG。u8TransCount:本次請(qǐng)求發(fā)送的數(shù)據(jù)事務(wù)的數(shù)量。取值范圍在0到0x0f。pauTransactions:該參數(shù)是一個(gè)指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著需要發(fā)送的數(shù)據(jù)。bTxOptions:指定發(fā)送方式,可以選擇下列的值,這些值可以進(jìn)行邏輯或。u8DiscoverRoute:設(shè)定所采用的路由發(fā)現(xiàn)模式。u8RadiusCounter:數(shù)據(jù)發(fā)送的深度,即所發(fā)送數(shù)據(jù)包的最大轉(zhuǎn)發(fā)次數(shù),如果設(shè)置為0,協(xié)議棧將采用2倍的MaxDepth發(fā)送深度。4.收到MsgObject調(diào)用的函數(shù)JZA_bAfMsgObject()該函數(shù)屬于協(xié)議棧調(diào)用應(yīng)用程序的函數(shù),用來處理來自其他結(jié)點(diǎn)發(fā)送來的MSG幀。該函數(shù)的原型為:PUBLICbool_tJZA_bAfMsgObject(APS_Addrmode_eeAddrMode,uint16u16AddrSrc,uint8u8SrcEP,uint8u8LQI,uint8u8DstEP,uint8u8ClusterID,uint8*pu8ClusterIDRsp,AF_Transaction_s*puTransactionInd,AF_Transaction_s*puTransactionRsp)各形參描述如下:eAddrMode:該參數(shù)定義了發(fā)送的目標(biāo)地址模式,它是APS_Addrmode_e枚舉類型的數(shù)據(jù).u16AddrSrc:該參數(shù)是數(shù)據(jù)發(fā)送方的源短地址,地址范圍為0x0000到0xFFFE。u8SrcEP:源端口號(hào),范圍是0x01到0xF0。u8LQI:接收幀的鏈路質(zhì)量。u8DstEP:目標(biāo)端口號(hào),范圍是0x01到0xF0。*puTransactionInd,:該參數(shù)是一個(gè)指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著接收的數(shù)據(jù)。*puTransactionRsp:該參數(shù)是一個(gè)指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著response信息。5.簡(jiǎn)單設(shè)備描述函數(shù)afmeAddSimpleDesc()該函數(shù)屬于AFME(AFSub-layerManagementEntity)類函數(shù),在增加設(shè)備描述符函數(shù)vAddDesc(void)中調(diào)用,其功能是為一個(gè)endpoint增加一個(gè)簡(jiǎn)單描述符(simpledescriptor)。如果一個(gè)endpoint上沒有正確定義的簡(jiǎn)單描述符,那么它將不能正確地接收來自其他結(jié)點(diǎn)的數(shù)據(jù),通常簡(jiǎn)單描述符應(yīng)該在設(shè)備建立網(wǎng)絡(luò)成功或者加入網(wǎng)絡(luò)成功后添加。三、軟件設(shè)計(jì)1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,分別用按鍵控制切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,其次再判斷是否有新的結(jié)點(diǎn)加入,若有新結(jié)點(diǎn)加入,硬件上得標(biāo)志位LED1滅;判斷是否有按鍵被按下,若按下了則調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。Coordinator主程序流程圖:Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷是否加入網(wǎng)絡(luò)成功,若加入成功,則硬件上的標(biāo)志位LED0滅;判斷是否有按鍵被按下,若按下了則調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,其功能為:按下Coordinator的SW0,某變量X(初始值0)顯示在LCD上,同時(shí)將X發(fā)送給EndDevice,EndDevice收到該數(shù)據(jù)后進(jìn)行數(shù)據(jù)處理(加1),等待1秒后再將其發(fā)送給Coordinator,Coordinator收到后將該值賦予X并顯示在LCD上,同時(shí)再次發(fā)送給EndDevice,如此重復(fù)運(yùn)行。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,硬件上得標(biāo)志位LED1滅;判斷是否有按鍵被按下,若按下了,調(diào)用函數(shù)vSendData()向EndDevice發(fā)送x;在程序運(yùn)行過程中若接收到EndDevice發(fā)送的數(shù)據(jù),調(diào)用LED顯示,再調(diào)用函數(shù)vSendData()向EndDevice發(fā)送x。主程序流程圖如下圖所示:Coordinator主程序流程圖:Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷是否加入網(wǎng)絡(luò)成功,若加入成功,則硬件上的標(biāo)志位LED0滅;判斷若接收到Coordinator發(fā)送的數(shù)據(jù),將接收的數(shù)據(jù)加1,最后調(diào)用BOS時(shí)鐘周期性調(diào)用vAppTick函數(shù),函數(shù)中調(diào)用vSendData()向Coordinator發(fā)送x,這樣就能實(shí)現(xiàn)定時(shí)發(fā)送。主程序流程圖如下圖所示:Enddevice主程序流程圖:四、實(shí)驗(yàn)結(jié)果與分析1.在實(shí)驗(yàn)一中分別按動(dòng)Coordinator的SW0~SW3,在Enddevice上的LED0~LED3能夠?qū)崿F(xiàn)相應(yīng)的亮滅,同樣地,分別按動(dòng)Enddevice上的SW0~SW3,也能使得Coordinator上相應(yīng)的LED0~LED3亮滅??梢赃_(dá)到按鍵控制雙方的效果,符合題目要求,說明程序設(shè)計(jì)正確。2.在實(shí)驗(yàn)二中按動(dòng)Coordinator的SW0,可以看見LCD液晶顯示頻上數(shù)據(jù)從0開始自加一,說明Coordinator和Enddevice之間相互發(fā)送數(shù)據(jù)了,符合題目要求,說明程序設(shè)計(jì)正確。五、存在問題和解決方法1.在下載完程序上電測(cè)試時(shí),發(fā)現(xiàn)Coordinator和Enddevice的LED0、LED1均不滅,那就說明網(wǎng)絡(luò)建立沒有成功,不能實(shí)現(xiàn)相互間的通信,考慮到這有可能是信道干擾的問題,和其他人的信道相沖突了。于是,我將信道改成了21,同時(shí)將網(wǎng)絡(luò)號(hào)也改掉了,重新進(jìn)行下載,上電后,測(cè)試燈均滅掉了,說明網(wǎng)絡(luò)建立成功,可以實(shí)現(xiàn)通信。2.在實(shí)驗(yàn)一中,當(dāng)按下SW0是LED0亮?xí)r,必須按兩次SW1才能使LED1亮,先開始以為是按鍵的問題,可是后來發(fā)現(xiàn)自己程序中指定義了一個(gè)變量bToggle,所以只有當(dāng)LED0滅了后,那么按一下SW1則LED1就亮了,這是程序中需要改進(jìn)的地方。實(shí)驗(yàn)四兩個(gè)EndDevice之間的無線通信實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,其功能為:Coordinator負(fù)責(zé)建立網(wǎng)絡(luò)和分配短地址。按下EndDeviceA的按鈕SW0發(fā)送廣播請(qǐng)求綁定信息,LED0閃爍,收到該信息的EndDeviceB的LED0閃爍,按下其按鈕SW0則返回綁定應(yīng)答信息,同時(shí)LED0處于點(diǎn)亮狀態(tài),EndDeviceA收到應(yīng)答后LED0也處于點(diǎn)亮狀態(tài),表示雙方綁定成功。之后按動(dòng)每個(gè)EndDevice的按鈕SW2、SW3可分別切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,其功能為:Coordinator負(fù)責(zé)建立網(wǎng)絡(luò)和分配短地址及綁定的媒介。按動(dòng)EndDevice按鈕SW0,向Coordinator發(fā)送綁定請(qǐng)求信息,LED0閃爍10秒,Coordinator收到該信息后記錄其短地址并定時(shí)10秒,按動(dòng)另外一個(gè)EndDevice的按鈕SW0向Coordinator發(fā)送綁定應(yīng)答信息,LED0閃爍5秒,在有效定時(shí)時(shí)間10秒內(nèi)若Coordinator收到該應(yīng)答信號(hào),則記錄其短地址,分別將記錄的兩個(gè)短地址發(fā)送給兩個(gè)對(duì)應(yīng)EndDevice,兩個(gè)EndDevice收到短地址后分別點(diǎn)亮LED0(不再閃爍),若在規(guī)定時(shí)間內(nèi)沒有建立綁定關(guān)系,超時(shí)后滅LED0。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。綁定狀態(tài)下按動(dòng)每個(gè)EndDevice的按鈕SW2、SW3可分別切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。二、實(shí)驗(yàn)原理1.通過對(duì)方的MAC地址獲得它的16位短地址在基于JennicZigBee協(xié)議棧中,每個(gè)設(shè)備必須知道對(duì)方的16位短地址,才能進(jìn)行直接通信,而16位短地址是在EndDevice或Router加入網(wǎng)絡(luò)時(shí)由Coordinator動(dòng)態(tài)分配的。如果一個(gè)設(shè)備(請(qǐng)求者)知道另一個(gè)設(shè)備的MAC地址時(shí),則請(qǐng)求者可通過調(diào)用zdpNwkAddrReq()函數(shù)廣播查尋與該MAC地址相匹配的結(jié)點(diǎn),當(dāng)匹配的結(jié)點(diǎn)收到該數(shù)據(jù)包則返回自己的短地址給請(qǐng)求者,請(qǐng)求者即可用該短地址與其進(jìn)行通信。2.通過廣播請(qǐng)求對(duì)方綁定獲得它的16位短地址在使用afdeDataRequest()函數(shù)發(fā)送數(shù)據(jù)包時(shí),將16位的目標(biāo)地址設(shè)置為0xffff,即可以廣播的形式將數(shù)據(jù)包發(fā)送出去。一個(gè)設(shè)備(請(qǐng)求者)想獲取另一個(gè)設(shè)備的16位短地址的方法是:發(fā)送一個(gè)廣播請(qǐng)求綁定指令數(shù)據(jù)包,符合條件的結(jié)點(diǎn)(如判斷指令包內(nèi)容,按下按鈕等)發(fā)送應(yīng)答包(含自己的短地址)給請(qǐng)求者,請(qǐng)求者即可用該短地址與其進(jìn)行通信。3.通過發(fā)送請(qǐng)求/應(yīng)答綁定信息給Coordinator獲得對(duì)方的16位短地址按動(dòng)EndDevice或Router按鈕,調(diào)用afdeDataRequest()函數(shù)向Coordinator發(fā)送綁定請(qǐng)求信息,Coordinator收到該信息后記錄其短地址并定時(shí),按動(dòng)另外一個(gè)結(jié)點(diǎn)的按鈕使用afdeDataRequest()函數(shù)向Coordinator發(fā)送綁定應(yīng)答信息,在有效定時(shí)時(shí)間內(nèi)若Coordinator收到該應(yīng)答信號(hào),則記錄其短地址,分別將記錄的兩個(gè)段地址發(fā)送給兩個(gè)對(duì)應(yīng)結(jié)點(diǎn),兩個(gè)結(jié)點(diǎn)收到短地址后便可以相互直接通信。4.高功率模式M02與M04高功率模塊使用時(shí),需要進(jìn)行高功率配置,一般在初始化階段設(shè)置。高功率模塊配置函數(shù)原型為:VoidvAHI_HighPowerModuleEnable(bool_tbRFTXEn,Bool_tbRFRXEn);5.網(wǎng)絡(luò)地址請(qǐng)求函數(shù)zdpNwkAddrReq()在Coordinator與EndDevice實(shí)現(xiàn)的點(diǎn)對(duì)點(diǎn)實(shí)驗(yàn)介紹了Coordinator獲取16位短地址的方法,而對(duì)于EndDevice和Router,當(dāng)一個(gè)結(jié)點(diǎn)知道另一個(gè)結(jié)點(diǎn)的MAC地址后,則可以通過網(wǎng)絡(luò)地址請(qǐng)求函數(shù)zdpNwkAddrReq()以廣播的方式發(fā)送數(shù)據(jù)包,查找與該MAC地址相匹配的結(jié)點(diǎn)在網(wǎng)絡(luò)中的短地址。協(xié)議??赏ㄟ^調(diào)用JZA_vZdpResponse()函數(shù)處理響應(yīng)消息。6.網(wǎng)絡(luò)地址請(qǐng)求響應(yīng)函數(shù)JZA_vZdpResponse()JZA_vZdpResponse()是一個(gè)協(xié)議棧調(diào)用應(yīng)用程序的函數(shù),當(dāng)一個(gè)結(jié)點(diǎn)通過zdpNwkAddrReq()發(fā)送查找另一個(gè)結(jié)點(diǎn)的短地址后,匹配的結(jié)點(diǎn)發(fā)送的應(yīng)答消息可通過請(qǐng)求者的協(xié)議棧調(diào)用JZA_vZdpResponse()處理。三、軟件設(shè)計(jì)1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,其功能為:Coordinator負(fù)責(zé)建立網(wǎng)絡(luò)和分配短地址。按下EndDeviceA的按鈕SW0發(fā)送廣播請(qǐng)求綁定信息,LED0閃爍,收到該信息的EndDeviceB的LED0閃爍,按下其按鈕SW0則返回綁定應(yīng)答信息,同時(shí)LED0處于點(diǎn)亮狀態(tài),EndDeviceA收到應(yīng)答后LED0也處于點(diǎn)亮狀態(tài),表示雙方綁定成功。之后按動(dòng)每個(gè)EndDevice的按鈕SW2、SW3可分別切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。Coordinator:Coordinator負(fù)責(zé)建立網(wǎng)絡(luò)和分配短地址,程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:EnddeviceA:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否加入成功,若加入成功,則硬件上的標(biāo)志位LED0滅。判斷是否按下SW0鍵,若有按下,則調(diào)用vSendData()函數(shù)發(fā)送廣播請(qǐng)求綁定信息;判斷是否收到應(yīng)答信息,若收到,則調(diào)用vLedControl(1,TRUE)控制LED0處于點(diǎn)亮狀態(tài),表示雙方綁定成功,并且獲取對(duì)方短地址,此時(shí)能夠與EnddeviceB進(jìn)行通信;然后就開始讀取按鍵值,若有按鍵按下,則調(diào)用按鍵處理函數(shù)進(jìn)行按鍵處理;同時(shí)若收到目標(biāo)地址的MSG信息,則執(zhí)行對(duì)應(yīng)控制指令。主程序流程圖如下圖所示:EnddeviceA主程序流程圖:EnddeviceB:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否加入網(wǎng)絡(luò)成功,若加入成功,則硬件上的標(biāo)志位LED0滅。判斷若接收到廣播請(qǐng)求綁定信息,則獲取對(duì)方短地址,且EnddeviceB的LED0閃爍,若按下其SW0,則返回綁定應(yīng)答信息,同時(shí)調(diào)用vLedControl(1,TRUE)控制LED0處于點(diǎn)亮狀態(tài),并且調(diào)用vSendData(0)函數(shù)發(fā)送應(yīng)答信息,此時(shí)與EnddeviceA建立通信;若有按鍵按下,則讀取按鍵的值,若讀取成功則調(diào)用按鍵處理函數(shù)進(jìn)行按鍵處理;同時(shí)若收到目標(biāo)地址的MSG信息,則執(zhí)行對(duì)應(yīng)控制指令。主程序流程圖如下圖所示:EnddeviceB主程序流程圖:四、實(shí)驗(yàn)結(jié)果與分析1.給電路板上電后,Coordinator負(fù)責(zé)建立網(wǎng)絡(luò)和分配短地址,且三方的網(wǎng)絡(luò)建立成功。然后按下EndDeviceA的SW0向EndDeviceB發(fā)送廣播請(qǐng)求綁定信息,此時(shí)EndDeviceA的LED0不斷地閃爍,收到該信息的EndDeviceB的LED0也閃爍,在程序中我定義了他們兩方是一直閃爍的。當(dāng)按下EndDeviceB的SW0按鈕則返回綁定應(yīng)答信息,此時(shí)EndDeviceB通過其中的JZA_bAfMsgObject函數(shù)將EndDeviceA的地址記錄下來,作為目標(biāo)地址,同時(shí)LED0處于點(diǎn)亮狀態(tài)。與此同時(shí)EndDeviceA收到應(yīng)答后也同樣將EndDeviceB的地址作為目標(biāo)地址,同時(shí)LED0也處于點(diǎn)亮狀態(tài),表示雙方綁定成功。之后按動(dòng)每個(gè)EndDevice的按鈕SW2、SW3可分別切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1此時(shí)的目標(biāo)地址都為0,解除綁定,且LED1閃爍3秒,實(shí)驗(yàn)現(xiàn)象符合要求。五、存在問題和解決方法1.在本次實(shí)驗(yàn)中,當(dāng)EndDeviceA發(fā)送信息后LED0我設(shè)置了長(zhǎng)閃,但會(huì)出現(xiàn)永遠(yuǎn)閃爍的情況,即跳不出閃爍的循環(huán)子程序,針對(duì)這一問題,我寫了兩個(gè)閃爍程序,同時(shí)設(shè)置了一個(gè)標(biāo)志位,使得n=1的時(shí)候才執(zhí)行閃爍程序,問題得以解決。實(shí)驗(yàn)五DIO中斷實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,運(yùn)用DIO中斷的方式分別用按鍵控制切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0等等。2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,運(yùn)用DIO中斷的方式分別用DIO4、DIO5、DIO6、DIO7切換對(duì)方相應(yīng)LED亮/滅狀態(tài)。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。二、實(shí)驗(yàn)原理1.vAHI_DioSetDirection()函數(shù)該函數(shù)用來設(shè)置DIO引腳的方向(輸入或輸出),其函數(shù)原型和使用方法參見講義2。當(dāng)某個(gè)DIO作為外部終端源時(shí),則意味著該DIO引腳設(shè)置為輸入。如果一個(gè)DIO引腳已安排給另一個(gè)外設(shè)且該外設(shè)已啟用,則該函數(shù)對(duì)該DIO引腳不產(chǎn)生影響。2.vAHI_DioInterruptEdge()函數(shù)當(dāng)某個(gè)DIO作為輸入引腳時(shí),則用該函數(shù)設(shè)置中斷產(chǎn)生時(shí)是采用上升沿還是下降沿觸發(fā)。該函數(shù)的原型如下:voidvAHI_DIOInterruptEdge(uint32u32Rising,uint32u32Falling);各參數(shù)的具體含義描述如下:u32Rising:32位位掩碼,其位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1時(shí),則意味著該位對(duì)應(yīng)的引腳在輸入信號(hào)的上升沿觸發(fā)中斷。u32Rising的位21至位31無定義,可設(shè)置為1或0。u32Falling:32位位掩碼,其位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1,則意味著該位對(duì)應(yīng)的引腳在輸入信號(hào)的下降沿觸發(fā)中斷。u32Rising的位21至位31無定義,可設(shè)置為1或0。該函數(shù)僅將u32Rising中為1的位對(duì)應(yīng)的引腳設(shè)置為上升沿觸發(fā)中斷,u32Falling中為1的位對(duì)應(yīng)的引腳設(shè)置為下降沿觸發(fā)中斷,沒有涉及到的引腳保持它原來的狀態(tài)。如果某一個(gè)引腳在u32Rising和u32Falling中都進(jìn)行了設(shè)置,則默認(rèn)為上升沿觸發(fā)。該函數(shù)僅對(duì)設(shè)置為輸入的DIO引腳有效。如果一個(gè)DIO引腳已安排給另一個(gè)外設(shè)且該外設(shè)已啟用,則該函數(shù)對(duì)該DIO引腳不產(chǎn)生影響。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);函數(shù)vAHI_DioSetDirection設(shè)置DIO0、DIO1、……DIO7等8個(gè)引腳方向?yàn)檩斎?,函?shù)vAHI_DIOInterruptEdge設(shè)置DIO0、DIO1、DIO2和DIO3等4個(gè)引腳為上升沿觸發(fā)中斷,DIO4、DIO5和DIO6等3個(gè)引腳為下降沿觸發(fā)中斷,DIO7引腳保持原狀態(tài)。3.vAHI_DioInterruptEnable()函數(shù)當(dāng)某個(gè)DIO作為輸入引腳時(shí),則該函數(shù)用來設(shè)置接收或屏蔽該引腳發(fā)來的中斷,及使能/屏蔽中斷。該函數(shù)的原型如下:voidvAHI_DIOInterruptEnable(uint32u32Enable,uint32u32Disable);各參數(shù)的具體含義描述如下:u32Enable:32位位掩碼,它的位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1時(shí),則使能該位對(duì)應(yīng)的引腳發(fā)來的中斷。u32Enable的位21至位31無定義。u32Disable:32位位掩碼,它的位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1時(shí),則屏蔽該位對(duì)應(yīng)的引腳發(fā)來的中斷。u32Disable的位21至位31無定義。該函數(shù)僅使能u32Enable中為1的位對(duì)應(yīng)的引腳中斷,屏蔽u32Disable中為1的位對(duì)應(yīng)的引腳中斷,沒有涉及到的引腳保持它原來的狀態(tài)。如果某一個(gè)引腳在u32Enable和u32Disable中都進(jìn)行了設(shè)置,則默認(rèn)為屏蔽中斷。該函數(shù)僅對(duì)設(shè)置為輸入的DIO引腳有效。如果一個(gè)DIO引腳已安排給另一個(gè)外設(shè)且該外設(shè)已啟用,則對(duì)該DIO引腳不產(chǎn)生影響。DIO引腳中斷可用來喚醒處于睡眠模式的設(shè)備。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);vAHI_DioInterruptEnable(0x00000007,0x0000007C);使能DIO0和DIO1兩個(gè)引腳的中斷,上升沿觸發(fā)中斷,屏蔽DIO2、DIO3、DIO4、DIO5和DIO6等5個(gè)引腳。DIO7引腳為輸入,其它引腳保持原狀態(tài)。4.JZA_vPeripheralEvent()函數(shù)該函數(shù)在中斷上下文時(shí)調(diào)用,即微處理器在執(zhí)行中斷處理程序的過程中調(diào)用,用于處理硬件中斷。該函數(shù)的原型為:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap);各參數(shù)的具體含義描述如下:u32Device:產(chǎn)生中斷的外圍設(shè)備ID號(hào),在802.15.4規(guī)范中被定義為枚舉值。u32ItemBitmap:與u32Device相對(duì)應(yīng)的外圍設(shè)備中斷源的位映射圖,在802.15.4規(guī)范中被定義為枚舉值。5.vAHI_DioSetPullup()函數(shù)當(dāng)某個(gè)DIO作為輸入輸出引腳時(shí),則用該函數(shù)設(shè)置相應(yīng)引腳是否上拉。該函數(shù)的原型如下:voidvAHI_DioSetPullup(uint32u32On,uint32u32Off);各參數(shù)的具體含義描述如下:u32On:32位位掩碼,其位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1時(shí),則意味著該位對(duì)應(yīng)的引腳被上拉。u32On的位21至位31無定義,可設(shè)置為1或0。u32Off:32位位掩碼,其位0至位20對(duì)應(yīng)于每一個(gè)DIO引腳。當(dāng)某一位為1時(shí),則意味著該位對(duì)應(yīng)的引腳關(guān)閉上拉。u32Off的位21至位31無定義,可設(shè)置為1或0。三、軟件設(shè)計(jì)1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,運(yùn)用DIO中斷的方式分別用按鍵控制切換對(duì)方對(duì)應(yīng)LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0等等。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、中斷口和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,其次再判斷是否有新的結(jié)點(diǎn)加入,若有新結(jié)點(diǎn)加入,硬件上得標(biāo)志位LED1滅;判斷是否有按鍵被按下,若按下了則表示有中斷,所以調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、中斷端口和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷是否加入網(wǎng)絡(luò)成功,若加入成功,則硬件上的標(biāo)志位LED0滅;判斷是否有按鍵被按下,若按下了則表示有中斷,所以調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序,運(yùn)用DIO中斷的方式分別用DIO4、DIO5、DIO6、DIO7切換對(duì)方相應(yīng)LED亮/滅狀態(tài)。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED燈、中斷口和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷網(wǎng)絡(luò)是否啟動(dòng)成功,若啟動(dòng)成功,則硬件上的標(biāo)志位LED0滅,其次再判斷是否有新的結(jié)點(diǎn)加入,若有新結(jié)點(diǎn)加入,硬件上得標(biāo)志位LED1滅;判斷是否有中斷,若有中斷,調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED燈、中斷端口和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;其后判斷是否加入網(wǎng)絡(luò)成功,若加入成功,則硬件上的標(biāo)志位LED0滅;判斷是否有中斷,若有中斷,則調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個(gè)數(shù)據(jù),在程序運(yùn)行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:四、實(shí)驗(yàn)結(jié)果與分析1.在實(shí)驗(yàn)一中,分別按動(dòng)Coordinator和Enddevice的SW0、SW1、SW2、SW3可以控制對(duì)方的相應(yīng)的LED燈出現(xiàn)亮滅交替的狀態(tài),因?yàn)镾W0、SW1、SW2、SW3對(duì)應(yīng)的是DIO9、DIO10、DIO11、DIO20口,按下按鍵的時(shí)候即給這些端口以中斷,從而控制了LED的亮滅,實(shí)驗(yàn)現(xiàn)象與要求的相同,說明程序正確且正常運(yùn)行。2.在實(shí)驗(yàn)二中,通過用杜邦線連接相應(yīng)的中斷端口,中斷端口在程序中有所設(shè)置,插拔杜邦線,即給以端口中斷,從而控制了LED燈的亮滅。五、存在問題和解決方法1.在實(shí)驗(yàn)中,會(huì)存在不只中斷一次的情況,經(jīng)過多番嘗試,發(fā)現(xiàn)原程序中的vAHI_DioInterruptEnable()函數(shù)本身就存在問題,以我自己的理解,執(zhí)行這個(gè)程序的時(shí)候并沒有起到消抖的作用,所以我在程序中設(shè)置了一個(gè)標(biāo)志位,起到了消抖的作用,使其只中斷一次,同時(shí)在硬件和軟件上都起到了屏蔽中斷的作用。實(shí)驗(yàn)六定時(shí)器實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.設(shè)計(jì)一個(gè)程序,運(yùn)用Timer1中斷實(shí)現(xiàn)流水燈,周期1秒。2.設(shè)計(jì)一個(gè)程序,初始化DIO16(LED0)為輸入,運(yùn)用Timer0PWM輸出控制LED0的亮滅狀態(tài),一個(gè)周期內(nèi)亮2秒,滅1秒。二、實(shí)驗(yàn)原理1.vAHI_TimerEnable()函數(shù)該函數(shù)用來使能指定的定時(shí)器,并為該定時(shí)器設(shè)置參數(shù)。該函數(shù)的原型如下:voidvAHI_TimerEnable(uint8u8Timer,uint8u8Prescale,bool_tbIntRiseEnable,bool_tbIntPeriodEnable,bool_tbOutputEnable);各參數(shù)的具體含義描述如下:u8Timer:定時(shí)器的標(biāo)識(shí),在JN5121/JN513x微控制器中有兩個(gè)應(yīng)用級(jí)定時(shí)器/計(jì)數(shù)器,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標(biāo)識(shí)Time0和Timer1。u8Prescale:時(shí)鐘的預(yù)分頻值,它的最大值為16。分頻后的頻率為原頻率的1/2u8Prescale。bIntRiseEnable:該參數(shù)值為TRUE時(shí),定時(shí)器的輸出變?yōu)楦唠娖綍r(shí)使能中斷。bIntPeriodEnable:該參數(shù)值為TRUE時(shí),當(dāng)定時(shí)器的一個(gè)周期到且輸出變?yōu)榈碗娖綍r(shí),使能中斷。bOutputEnable:該參數(shù)值為TRUE時(shí),使定時(shí)器的輸出出現(xiàn)在與PWM相關(guān)的輸出引腳上。Timer0使用DIO8-10引腳,Timer1使用DIO11-13引腳。2.vAHI_TimerClockSelect()函數(shù)選擇內(nèi)部或外部時(shí)鐘,當(dāng)使用內(nèi)部時(shí)鐘時(shí)要設(shè)置輸出門。該函數(shù)的原型如下:voidvAHI_TimerClockSelect(uint8u8Timer,bool_tbExternalClock,bool_tbGateControl);各參數(shù)的具體含義描述如下:u8Timer:定時(shí)器的標(biāo)識(shí),與函數(shù)vAHI_TimerEnable()中的用法相同,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標(biāo)識(shí)Time0和Timer1。bExternalClock:該參數(shù)值為TRUE,表示使用外部時(shí)鐘;為FALSE,表示使用16MHz的內(nèi)部時(shí)鐘。bGateControl:該參數(shù)值為TRUE時(shí),表示當(dāng)定時(shí)器的門輸入是高電平時(shí),打開輸出引腳;為FALSE時(shí),表示當(dāng)定時(shí)器的門輸入為低電平時(shí),打開輸出引腳。3.vAHI_TimerStartRepeat()函數(shù)設(shè)置重復(fù)定時(shí)器。該函數(shù)的原型如下:voidvAHI_TimerStartRepeat(uint8u8Timer,uint16u16Hi,uint16u16Lo);各參數(shù)的具體含義描述如下:u8Timer:定時(shí)器的標(biāo)識(shí),用E_AHI_TIMER_0和E_AHI_TIMER_1分別標(biāo)識(shí)Time0和Timer1。u16Hi:該參數(shù)值表示在開始一個(gè)定時(shí)器之后,在定時(shí)器的輸出變?yōu)楦唠娖街敖?jīng)歷的時(shí)鐘周期數(shù)。u16Lo:該參數(shù)值表示在開始一個(gè)定時(shí)器之后,在定時(shí)器的輸出變?yōu)榈碗娖街敖?jīng)歷的時(shí)鐘周期數(shù)。即定時(shí)器有效時(shí)間內(nèi)的時(shí)鐘周期數(shù)。啟動(dòng)定時(shí)器后,當(dāng)經(jīng)歷u16Hi個(gè)時(shí)鐘周期后,定時(shí)器的輸出由低電平變?yōu)楦唠娖?,再?jīng)歷u16Lo-u16Hi個(gè)時(shí)鐘周期后,定時(shí)器的輸出由高電平變?yōu)榈碗娖剑匦聠?dòng)定時(shí)器。這個(gè)過程重復(fù)執(zhí)行,直到執(zhí)行vAHI_TimerStop()函數(shù)停止定時(shí)器為止。如果定時(shí)器的中斷使能,可設(shè)置當(dāng)定時(shí)器的輸出由低電平變?yōu)楦唠娖綍r(shí)觸發(fā)中斷,也可設(shè)置當(dāng)定時(shí)器的輸出電平由高變低時(shí)觸發(fā)中斷。4.停止定時(shí)對(duì)于設(shè)置了重復(fù)定時(shí)器,當(dāng)需要停止定時(shí)時(shí),則需要執(zhí)行vAHI_TimerStop()函數(shù)停止定時(shí)器,其函數(shù)原型如下:voidvAHI_TimerStop(uint8u8Timer);參數(shù)u8Timer為定時(shí)器的標(biāo)識(shí),用E_AHI_TIMER_0和E_AHI_TIMER_1分別標(biāo)識(shí)Time0和Timer1。5.定時(shí)時(shí)間計(jì)算以內(nèi)部時(shí)鐘為例計(jì)算定時(shí)時(shí)間為:LouMHzescaleu162161Pr8××,例如當(dāng)設(shè)置Timer0為:vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,FALSE);vAHI_TimerClockSelect(E_AHI_TIMER_0,FALSE,TRUE);vAHI_TimerStartRepeat(E_AHI_TIMER_0,8000,15625);則定時(shí)器時(shí)間為:1/16MHz×2u8Prescale×u16Lo=1/16×210×15625=1s6.定時(shí)器的設(shè)置在程序中用E_AHI_TIMER_0和E_AHI_TIMER_1分別標(biāo)識(shí)Time0和Timer1。在使用定時(shí)器之前需要對(duì)定時(shí)器進(jìn)行設(shè)置,主要使用三個(gè)函數(shù):第一個(gè)函數(shù)vAHI_TimerEnable(),用來使能指定的定時(shí)器,并為該定時(shí)器設(shè)置參數(shù);第二個(gè)函數(shù)是vAHI_TimerClockSelect(),用來選擇內(nèi)部或外部時(shí)鐘,當(dāng)使用內(nèi)部時(shí)鐘時(shí)還要設(shè)置輸出門;第三個(gè)函數(shù)是vAHI_TimerStartRepeat(),設(shè)置重復(fù)定時(shí)時(shí)間。例如對(duì)定時(shí)器初始化的程序段如下:vAHI_TimerEnable(E_AHI_TIMER_1,10,FALSE,TRUE,FALSE);vAHI_TimerClockSelect(E_AHI_TIMER_1,FALSE,TRUE);vAHI_TimerStartRepeat(E_AHI_TIMER_1,8000,16000);7.定時(shí)中斷響應(yīng)處理JZA_vPeripheralEvent()函數(shù)在JennicZigBee協(xié)議棧處理硬件中斷時(shí)調(diào)用,定時(shí)器中斷也屬于外部中斷,因此在該函數(shù)中加入定時(shí)器中斷處理程序,例如當(dāng)有Timer1中斷時(shí),如果EndDevice已加入網(wǎng)絡(luò),則發(fā)送一個(gè)數(shù)據(jù)包給Coordinator,其程序代碼如下:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap){if(u32Device==E_AHI_DEVICE_TIMER1)if(bNwkJoined)vSendData(2);}其中u32Device指產(chǎn)生中斷的設(shè)備ID號(hào),E_AHI_DEVICE_TIMER1是指定時(shí)器Tiner1的ID號(hào),這段程序的意思是:若中斷來自于Timer1并且EndDevice已加入網(wǎng)絡(luò)的情況下給Coordinator發(fā)送數(shù)據(jù)包。三、軟件設(shè)計(jì)1.設(shè)計(jì)一個(gè)程序,運(yùn)用Timer1中斷實(shí)現(xiàn)流水燈,周期1秒。程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、定時(shí)器和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;然后調(diào)用JZS_vStartStack()函數(shù),啟動(dòng)網(wǎng)絡(luò),如果網(wǎng)絡(luò)啟動(dòng),在硬件電路上的標(biāo)志為L(zhǎng)ED0滅;其次檢測(cè)是否有按鍵按下,如果SW3按下,則判斷標(biāo)志為Flag1,若Flag=1則開定時(shí)器1,并執(zhí)行中斷處理函數(shù),使得LED流水燈順時(shí)針顯示,周期為1s,若Flag=0,則關(guān)定時(shí)器1;如果按下SW2按下,則判斷標(biāo)志為Flag2,若Flag=2則開定時(shí)器1,并執(zhí)行中斷處理函數(shù),使得LED流水燈逆時(shí)針顯示,周期為1s,若Flag=0,則關(guān)定時(shí)器1。主程序流程圖如下圖所示:2.設(shè)計(jì)一個(gè)程序,初始化DIO16(LED0)為輸入,運(yùn)用Timer0PWM輸出控制LED0的亮滅狀態(tài),一個(gè)周期內(nèi)亮2秒,滅1秒。程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,同時(shí)調(diào)用vAHI_DioSetDirection()函數(shù)設(shè)置DIO16(LED0)為輸入腳,DIO10(Timer0PWM)為輸出腳,并且啟動(dòng)BOS定時(shí)時(shí)鐘;然后調(diào)用JZS_vStartStack()函數(shù),啟動(dòng)網(wǎng)絡(luò),如果網(wǎng)絡(luò)啟動(dòng),在硬件電路上的標(biāo)志為L(zhǎng)ED0滅;其次檢測(cè)是否有按鍵按下,如果SW0按下,則判斷標(biāo)志為Flag1,若Flag=1則開定時(shí)器1,并執(zhí)行中斷處理函數(shù),根據(jù)PWM輸出控制LED的亮滅狀態(tài),亮滅的時(shí)間通過函數(shù)vAHI_TimerStartRepeat(E_AHI_TIMER_0,31250,62500)設(shè)置,本次實(shí)驗(yàn)中,我設(shè)置了定時(shí)4s,亮2s,滅2s。主程序流程圖如下圖所示:四、實(shí)驗(yàn)結(jié)果與分析1.在實(shí)驗(yàn)一中,按動(dòng)SW3,LED流水燈順時(shí)針顯示,周期為1s,再按一下SW3,定時(shí)器關(guān),LED停止流水燈顯示;按動(dòng)SW2,LED流水燈逆時(shí)針顯示,周期為1s,再按一下SW3,定時(shí)器關(guān),LED停止流水燈顯示。符合題目要求,說明程序正確。2.在實(shí)驗(yàn)二中,用一根杜邦線將DIO16腳與DIO10腳相連接,按下SW0后,定時(shí)器0開,根據(jù)高低電平的變化,實(shí)現(xiàn)了LED0亮2s,滅2s的現(xiàn)象,符合題目要求,程序正確。五、存在問題和解決方法1.在實(shí)驗(yàn)先開始,沒有確定LED等式低電平亮還是高電平亮,所以在實(shí)驗(yàn)二中,導(dǎo)致設(shè)置的LED亮滅的狀態(tài)與自己預(yù)定的相反,解決的方法即在實(shí)驗(yàn)前測(cè)試了一下,確定了LED燈是當(dāng)?shù)碗娖降臅r(shí)候點(diǎn)亮。2.在實(shí)驗(yàn)二中,要通過插杜邦線,將DIO16和DIO10腳相連接,但是,開電源之后,LED并沒有任何變化,在檢查程序沒有錯(cuò)誤的情況下,發(fā)現(xiàn)是杜邦線插錯(cuò)了腳,這告訴我們做任何事情都要細(xì)心,注意細(xì)節(jié)。3.在實(shí)驗(yàn)二中,我開始設(shè)置定時(shí)器是vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,FALSE),結(jié)果無法正常顯示,于是后來我將定時(shí)器設(shè)置為vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,TRUE),因?yàn)楸仨氃O(shè)置為輸出才能有PWM輸出。實(shí)驗(yàn)七UART實(shí)驗(yàn)一、實(shí)驗(yàn)內(nèi)容1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序:按動(dòng)EndDevice的不同按鈕能夠向Coordinator發(fā)送不同信息,再由Coordinator經(jīng)串口轉(zhuǎn)發(fā)給PC機(jī),串口調(diào)試工具輸出窗口能夠看到相關(guān)信息。2.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序:通過PC機(jī)串口調(diào)試工具經(jīng)串口發(fā)送文本信息給Coordinator,再由其轉(zhuǎn)發(fā)給EndDevice,然后在與EndDevice相連的LCD上顯示文本信息內(nèi)容。二、實(shí)驗(yàn)原理1.vAHI_UartEnable()函數(shù)UART使能指定。函數(shù)的原型如下:voidvAHI_UartEnable(uint8u8Uart);參數(shù)u8Uart用來標(biāo)識(shí)UART,其值可以是E_AHI_UART_0或E_AHI_UART_1,前者表示UART0,后者表示UART1。2.vUART_printInit()函數(shù)該函數(shù)用來初始化串口0,函數(shù)的原型如下:PUBLICvoidvUART_printInit(void);調(diào)用該函數(shù)需要在工程文件中加入頭文件Printf.h,例如:#include<Printf.h>3.vPrintf()函數(shù)使用vPrintf()函數(shù)往串口0發(fā)送數(shù)據(jù),函數(shù)的原型如下:PUBLICvoidvPrintf(constchar*fmt,...);參數(shù)*fmt是用來往串口0發(fā)送的字符串。調(diào)用該函數(shù)需要在工程文件中加入頭文件Printf.h。4.UART接收字符中斷響應(yīng)處理JZA_vPeripheralEvent()函數(shù)在JennicZigBee協(xié)議棧處理硬件中斷時(shí)調(diào)用。如下程序?yàn)樘幚韥碜杂诖?的中斷和定時(shí)器中斷:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap){if(u16DstAddres==0)return;//如果EndDevice沒有加入網(wǎng)絡(luò),則返回switch(u32Device){caseE_AHI_DEVICE_UART0://是UART0中斷?if((u32ItemBitmap&0x000000FF)==E_AHI_UART_INT_RXDATA)//判斷是否為來自串口的接收字符中斷{/*處理UART0接收中斷*/cCharIn=((u32ItemBitmap&0x0000FF00)>>8);cCommandBuffer[u8CommandTail]=cCharIn;//將接收的字符放入緩沖區(qū)中u8CommandTail=u8CommandTail+1;if(u8CommandTail==80){vSendData(u16DstAddres,u8CommandTail,cCommandBuffer);u8CommandTail=0;}}caseE_AHI_DEVICE_TIMER1:/*如果中斷來自timer1(每100ms產(chǎn)生1次中斷)*/if(bNwkStarted&&u8CommandTail>0){vSendData(u16DstAddres,u8CommandTail,cCommandBuffer);u8CommandTail=0;}break;}}其中u32Device指產(chǎn)生中斷的設(shè)備ID號(hào),如果是來自串口0的中斷,則判斷是否接收中斷,若是接收中斷,則將接收的字符放入接收緩沖區(qū)中,若緩沖區(qū)中存放字符數(shù)達(dá)到80個(gè),則將緩沖區(qū)中的字符發(fā)送給EndDevice。如果是來自定時(shí)器Tiner1的中斷,則查看緩沖區(qū)中是否有字符,若有則將緩沖區(qū)中的字符發(fā)送給EndDevice。5.vAHI_UartReset()函數(shù)UART重新設(shè)置發(fā)送和接收FIFO隊(duì)列。該函數(shù)的原型如下:voidvAHI_UartReset(uint8u8Uart,bool_tbTxReset,bool_tbRxReset);6.vAHI_UartSetClockDivisor()函數(shù)該函數(shù)用來設(shè)置UART波特率,函數(shù)的原型如下:voidvAHI_UartSetClockDivisor(uint8u8Uart,uint8u8BaudRate);7.vAHI_UartSetControl()函數(shù)設(shè)置指定的UART的各種控制位。該函數(shù)的原型如下:voidvAHI_UartSetControl(uint8u8Uart,bool_tbEvenParity,bool_tbEnableParity,uint8u8WordLength,bool_tbOneStopBit,bool_tbRtsValue);8.vAHI_UartSetInterrupt()函數(shù)使能/屏蔽指定UART產(chǎn)生的中斷,并且設(shè)置接收FIFO級(jí)別。9.u8AHI_UartReadLineStatus()函數(shù)獲得指定UART的線狀態(tài)信息,該函數(shù)的原型如下:uint8u8AHI_UartReadLineStatus(uint8u8Uart);10.vAHI_UartWriteData()函數(shù)UART往發(fā)送FIFO隊(duì)列中放一個(gè)字節(jié)。函數(shù)的原型如下:voidvAHI_UartWriteData(uint8u8Uart,uint8u8Data);其中u8Uart用來標(biāo)識(shí)UART,u8Data是指往發(fā)送FIFO隊(duì)列中放的字節(jié)。三、軟件設(shè)計(jì)1.分別為Coordinator和EndDevice設(shè)計(jì)一個(gè)程序:按動(dòng)EndDevice的不同按鈕能夠向Coordinator發(fā)送不同信息,再由Coordinator經(jīng)串口轉(zhuǎn)發(fā)給PC機(jī),串口調(diào)試工具輸出窗口能夠看到相關(guān)信息。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號(hào)和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動(dòng)BOS定時(shí)時(shí)鐘;然后調(diào)用JZS_vStartStack()函數(shù),啟動(dòng)網(wǎng)絡(luò),如果網(wǎng)絡(luò)啟動(dòng),在硬件電路上的標(biāo)志為L(zhǎng)ED0滅,如果有新結(jié)點(diǎn)加入,則LED1熄滅;其次看Coordinator是否有接受到EndDevice發(fā)送來的消息,若接收到enddevice發(fā)送的消息,則通過調(diào)用vPrintf()函數(shù)將接收的字符串送到串口顯示出來。主程序流程圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論