




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
通學院信名稱:新技術(shù)綜合訓練報告JIANGSUTEACHERSUNIVERSITYOFTECHNOLOGY專 業(yè):班 級:姓 名:學 號:指導老師:2012年3月目 錄實驗一 Jennic-WSN開發(fā)環(huán)境 1實驗二 GPIO及LCD使用實驗 4實驗三 簡單點對點無線通信實驗 8實驗四 兩個EndDevice之間的無線通信實驗 14實驗五 DIO中斷實驗 18實驗六 定時器實驗 23實驗七 UART實驗 27實驗八 ADC及數(shù)據(jù)采集實驗 312實驗九 休眠和掉電保護實驗 368心得體會 44附錄 45實驗一 Jennic-WSN開發(fā)環(huán)境一、實驗內(nèi)容熟悉基于JN5139芯片所開發(fā)的一系列開發(fā)板及外圍部件;了解zigbee系統(tǒng);掌握軟件的安裝與調(diào)試;熟悉常用API接口函數(shù)。二、實驗原理1.JN5139最小系統(tǒng)及外圍部件基于JN5139芯片所設(shè)計的最小系統(tǒng)。SPISSZ與SPISSM連接,SPISWP接高電平,JN5139上電自動復位或按鍵復位,SPIMISO為編程控制端,與復位按鍵配合使用,經(jīng)DIO6、DIO7實現(xiàn)程序BIN文件的下載。JN5139模塊提供如下外圍部件功能:個主SPI選擇口;個UART串口;個帶捕獲/比較功能的可編程定時器/計數(shù)器;個可編程睡眠定時器和1個滴答定時器;兩線串口(兼容SMbus和I2C);從SPI接口(與數(shù)據(jù)I/O共享);個數(shù)據(jù)I/O口(與UART串口、定時器及SPI選擇復用);通道12位100kbps模數(shù)轉(zhuǎn)換輸入;個11位數(shù)模轉(zhuǎn)換輸入;個可編程模擬比較輸入;內(nèi)部溫度傳感及電壓監(jiān)控。開發(fā)板基于JN5139芯片所設(shè)計的WSN開發(fā)板,其部件如下:U1:JN5139系列Zigbee模塊;U2:板載光照度傳感器;U3:板載溫濕度一體傳感器;J3: 外供電(5VDC)接口;Swith: 供電開關(guān);J7:編程與運行狀態(tài)選擇,左跳并給傳感器板加電,則進入可編程狀態(tài),或者在加電的情況下,按住RESET按鈕,左跳J7,然后放開RESET按鈕,再右跳J7,也可進入可編程狀態(tài),退出可編程狀態(tài),只需要按一下 RESET按鈕即可;J8:Flash 寫保護跳選,編程與運行都跳選到 RUN(右跳);DB9:RS232編程接口;UART0:串口0;JP6:模塊所有管腳的引出排線;LCD:液晶接口;Power:電源指示燈;REST:復位按鍵;LED3,LED2,LED1,LED0:可編程LED,分別對應DIO19、DIO18、DIO17、DIO16;SW3,SW2,SW1,SW0:可編程按鍵,分別對應DIO20、DIO11、DIO10、DIO9;GND:地。軟件的安裝與調(diào)試(1)建立開發(fā)環(huán)境在光盤中找到software文件夾下的JN-SW-4031-SDK-Toolchain-v1.1.exe文件(或者在Jennic公司網(wǎng)站上獲得該文件)并運行。在安裝過程中,最簡單的方法是按默認設(shè)置安裝。(2)編寫程序代碼并進行下載與調(diào)試編寫代碼完成后,可按Ctrl+F9快捷鍵或選擇主菜單Build下的Build子菜單或點擊圖標建立可執(zhí)行二進制代碼文件。若工程編譯(Build)成功,則可在C:\Jennic\cygwin\jennic\SDK\Application\test\JN5139_Build\Release目錄下生成test.bin文件。否則,出錯信息會顯示在信息窗口中,根據(jù)出錯信息調(diào)試程序。JennicJN51xxFlash可編程器是用來將編譯好的二進制代碼文件(載到JN51xx模塊中的Flash芯片的代碼下載工具,它通過串行總線與相連。
*.bin)下JN51xx模塊JennicJN51xxFlash可編程器的用戶界面如圖 1-18所示,它可以將*.bin文件下載到目標板或模塊中,下載步驟如下:a.用串口線連接PC機和目標板或模塊。b.運行Flash可編程器,選擇PC機與目標板相連的串行通訊端口。c.將目標板上的J7跳線至編程(左側(cè))狀態(tài),給目標板上電,按一下RESET按鈕后釋放,再恢復J7跳線至右側(cè)。d.在圖1-18所示的Flash可編程界面上點擊Browse按鈕(圖中①處)查找并選擇要下載的目標文件。e.選擇好目標文件后,點擊Progrm按鈕(圖中②處)開始下載。在下載的過程中會顯示一個下載的進度條,如圖1-19所示。當下載完成后,將顯示下載成功或錯誤,如圖1-20所示下載成功對話框。如果遇到錯誤,請嘗試重新下載。f.成功下載后,關(guān)掉Flash可編程器再給目標板或模塊上電、或按Reset按鈕,則剛下載的代碼自動運行。常用API接口函數(shù)介紹1)應用程序初始化函數(shù)如下:AppColdStart()應用程序的入口,相當于標準C中的main函數(shù),結(jié)點上電后將從這里開始執(zhí)行應用程序。該函數(shù)需要完成以下功能: 1. 通過設(shè)置函數(shù)中的參數(shù)值來設(shè)置信道號(JZS_sConfig.u32Channel)和PANID(JZS_sConfig.u16PanId);2. 調(diào)用函數(shù)JZS_u32InitSystem(TRUE)來初始化ZigBee協(xié)議棧;3. 調(diào)用函數(shù)vInit(
)對用戶的應用進程進行初始化,包括初始化按鈕動作和程序變量,設(shè)定綁定等操作;4.調(diào)用bBosRun(TRUE)來啟動操作系統(tǒng)BOS。用戶可根據(jù)具體的應用設(shè)計該函數(shù)。AppWarmStart()結(jié)點從內(nèi)存供電的休眠模式喚醒的時候?qū)⑦M入這個函數(shù)。啟動后所有的內(nèi)存數(shù)據(jù)都沒有丟失。如果設(shè)備不需要休眠喚醒功能,這個函數(shù)可以為空。用戶可根據(jù)具體的應用設(shè)計該函數(shù)。一般情況下,該函數(shù)會調(diào)用AppColdStart()重新啟動設(shè)備。2)應用程序調(diào)用協(xié)議棧的函數(shù)如下:JZS_u32InitSystem()初始化
JennicZigBee
協(xié)議棧。JZS_vStartStack()設(shè)備將作為Coordinator將啟動網(wǎng)絡,如果是Router
、Router或者EndDevice啟動。如果是或者EndDevice將加入網(wǎng)絡。
CoordinatorJZS_vStartNetwork()設(shè)置
手動控制Coordinate 網(wǎng)絡啟動,相對于自動網(wǎng)絡啟動,使用該功能,需要JZS_sConfig.bAutoJoin=FALSE.該函數(shù)執(zhí)行后,返回的協(xié)議 棧事件為JZS_EVENT_NWK_STARTEDJZS_EVENT_FAILED_TO_START_。NETWORKvAppSaveContexts()保存網(wǎng)絡參數(shù)以及用戶的數(shù)據(jù),如果你的應用是固定點的話,建議你進行網(wǎng)絡參數(shù)的保存。u16AppGetContextSize()用來獲取保存的網(wǎng)絡參數(shù)以及用戶數(shù)據(jù)的尺寸。vAppGetContexts()讀取保存的網(wǎng)絡參數(shù)的內(nèi)容。3)協(xié)議棧調(diào)用應用函數(shù)的函數(shù)如下:JZA_boAppStart()讓用戶可以在協(xié)議棧啟動前定義endpoint的descriptor,通常開發(fā)人員應該在這個函數(shù)中調(diào)用 JZS_vStartStack 啟動協(xié)議棧。JZA_vStartEvent()協(xié)議棧將通過這個函數(shù)反饋網(wǎng)絡層的一些網(wǎng)絡事件,比如網(wǎng)絡啟動成功、結(jié)點加入成功或者數(shù)據(jù)發(fā)送完成等。JZA_vPeripheralEvent()該函數(shù)主要用來處理外部的硬件中斷,比如按鈕、定時器、 UART等。JZA_vAppEventHandler()BOS周期性地調(diào)用該函數(shù)處理硬件中斷。用戶可以利用它進行網(wǎng)絡狀態(tài)的判斷和按鈕的檢查等,也可以在這個函數(shù)中,寫入自己的應用程序。在設(shè)計該函數(shù)時,要盡可能地使其運行時間短,以便BOS調(diào)度其他活動事件。JZA_vAppDefineTasks()該函數(shù)用于向BOS注冊自己的用戶任務,一般很少使用該函數(shù)。JZA_bAfMsgObject()收到其他結(jié)點發(fā)送來的 MSG幀的處理函數(shù)。實驗二 GPIO及LCD使用實驗一、實驗內(nèi)容1.運用基本GPIO函數(shù)設(shè)計一個程序,分別通過各按鍵切換對應LED亮/滅狀態(tài)。2.設(shè)計一個程序,實現(xiàn) LED自動閃爍,周期為 1秒。3.設(shè)計一個程序,按下按鍵SW0,LCD顯示數(shù)據(jù)加1;按下按鍵SW1,LCD顯示數(shù)據(jù)減1。二、實驗原理1.GPIO使用Jennic 的模塊具有21 路通用的GPIO,可以通過軟件的方式進行設(shè)置, 這些GPIO口和其他的外圍接口是共用的。其共用關(guān)系如表2-1所示:表2-1:IO口和其他的外圍接口共用關(guān)系DIO引腳 共用關(guān)系DIO0 SPI從選擇1(輸出)DIO1 SPI從選擇2(輸出)DIO2 SPI從選擇3(輸出)DIO3 SPI從選擇4(輸出)DIO4-DIO7 UART0DIO8-DIO10 Timer0DIO11-DIO13 Timer1DIO14-DIO15 SerialinterfaceDIO16 IPdatainDIO17-DIO20 UART1常用函數(shù):1)對于GPIO的操作首先需要調(diào)用vAHI_DioSetDirection來進行GPIO輸入輸出方向的設(shè)置。該函數(shù)的原型如下:PUBLICvoidvAHI_DioSetDirection(uint32u32Inputs,uint32u32Outputs);這里u32Inputs和u32Outputs是設(shè)置GPIO輸入和輸出地mask碼。(2)對于GPIO的輸出操作比較簡單,通過調(diào)用如下原型函數(shù):PUBLICvoidvAHI_DioSetOutput(uint32u32On,uint32u32Off);這里u32On和u32Off分別是設(shè)置GPIO輸出高、低電平的掩碼。(3)對于GPIO的輸入操作,通常調(diào)用如下原型函數(shù):PUBLICuint32u32AHI_DioReadInput(void);返回值對應每個輸入DIO的高低電平。2.LED使用LED驅(qū)動庫文件提供了
LED
的控制方法,在
LedControl.h
中宏定義了相應功能函數(shù)。對于LED的操作,首先要調(diào)用初始化函數(shù)
vLedInitFfd()
初始化FFD開發(fā)板上的四個LED,然后調(diào)用函數(shù)vLedControl(LED,ON)控制相應LED點亮或熄滅。相應函數(shù)原型如下:PUBLICvoidvLedInitFfd(void);PUBLICvoidvLedControl(uint8u8Led,bool_tbOn) ;3.按鍵使用按鍵驅(qū)動庫文件提供了按鍵的控制方法,在 Button.h中宏定義了相應功能函數(shù)。對于按鍵的操作,首先要調(diào)用初始化函數(shù)vButtonInitFfd()初始化FFD開發(fā)板上的四個按鍵,然后調(diào)用函數(shù)u8ButtonReadFfd()讀取相應按鍵的狀態(tài)。相應函數(shù)原型如下:PUBLICvoidvButtonInitFfd(void);PUBLICuint8u8ButtonReadFfd(void);4.LCD使用LCD驅(qū)動庫文件庫提供了液晶的驅(qū)動方法,在Lcd_JM12864_Driver.h中提供了相應功能的原型函數(shù)。5.BOS定時器的使用為了消除按鈕抖動對控制器的影響,本實驗設(shè)置的一個讀取按鈕的標志變量NextReadStart,若其值為TRUE且有按下按鈕SW的操作,則設(shè)置其為FALSE,并利用BOS的定時器函數(shù)bBosCreateTimer()定時,500ms后再次設(shè)置NextReadStart為真。通過關(guān)這種方法可有效地消除按鈕抖動的影響。bBosCreateTimer()函數(shù)是一個處理軟件定時器的 BOSAPI函數(shù),調(diào)用該函數(shù)可由BOS創(chuàng)建一個軟件定時器,該定時器要利用內(nèi)部硬件滴答定時器(ticktimer)來實現(xiàn)。當定時時間到,立即調(diào)用由bBosCreateTimer()指定的定時處理程序。6.協(xié)議棧事件函數(shù)JZA_vStackEvent()是一個協(xié)議棧調(diào)用應用程序的函數(shù)(回調(diào)函數(shù))。它的主要功能是處理來自于協(xié)議棧底層的各種事件,比如,APS層數(shù)據(jù)傳輸確認。用戶通過該函數(shù)可以處理來自于AF和ZDP層的事件。該函數(shù)的原型為:PUBLICvoidJZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent);其中參數(shù)eEventId表示事件的類型,參數(shù)puStackEvent表示有關(guān)發(fā)生事件的補充信息。7.周期性調(diào)用函數(shù)網(wǎng)絡啟動后,每隔一定時間,BOS就會調(diào)用JZA_vAppEventHandler()函數(shù)一次,該函數(shù)專門來處理硬件中斷,用戶可以在該函數(shù)中添加用于網(wǎng)絡狀態(tài)判斷、按鈕檢查等檢測中斷事件的程序代碼,也可以添加用于發(fā)送數(shù)據(jù)的程序代碼等。本實驗利用該函數(shù)檢查是否按下 SW按鈕。三、軟件設(shè)計1.運用基本GPIO函數(shù)設(shè)計一個程序,分別通過各按鍵切換對應LED亮/滅狀態(tài)。程序首先執(zhí)行AppColdStart()函數(shù),自動尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動BOS定時時鐘,其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位LED0滅,網(wǎng)絡啟動成功后就開始讀取按鍵值,并執(zhí)行相應的按鍵控制LED亮滅的子程序,主程序流程圖如下圖所示:開始系統(tǒng)、LED、按鍵初始化N網(wǎng)絡是否啟動成功Y讀取按鍵值調(diào)用按鍵控制LED子程序2.設(shè)計一個程序,實現(xiàn) LED自動閃爍,周期為 1秒。程序首先執(zhí)行AppColdStart()函數(shù),自動尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動BOS定時時鐘,其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位LED0滅,網(wǎng)絡啟動成功后就調(diào)用vAppTickLED()函數(shù),定時為1s,定時時間一到,循環(huán)執(zhí)行vAppTickLED()函數(shù),通過定義一個變量LED,LED循環(huán)變化,利用vLedControl(LED,TRUE),實現(xiàn)LED的流水燈顯示。主程序流程圖如下圖所示:開始系統(tǒng)、LED、按鍵初始化N網(wǎng)絡是否啟動成功Y調(diào)用vAppTickLED()函數(shù),實現(xiàn)LED自動閃爍3.設(shè)計一個程序,按下按鍵SW0,LCD顯示數(shù)據(jù)加1;按下按鍵SW1,LCD顯示數(shù)據(jù)減1。程序首先執(zhí)行AppColdStart()函數(shù),自動尋找最安靜的信道,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED、按鍵和協(xié)議棧,并且啟動BOS定時時鐘,其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位LED0滅,網(wǎng)絡啟動成功后調(diào)用JZA_vAppEventHandler()函數(shù)讀取按鍵值,若有鍵按下,調(diào)用按鍵子程序vProcessSplashKeyPress(,)執(zhí)行case語句:按鍵0,對液晶顯示的數(shù)進行加1;按鍵1,對液晶顯示的數(shù)進行減1。主程序流程圖如下圖所示:開始系統(tǒng)、LED、按鍵初始化N網(wǎng)絡是否啟動成功Y讀取按鍵的值調(diào)用按鍵控制LCD顯示程序,實現(xiàn)顯示+1或-1四、實驗結(jié)果與分析實驗一中分別按下按鍵SW0~SW3,相應的LED0~LED3能夠改變當前的狀態(tài),按動一下亮、按動一下滅,實現(xiàn)了按鍵控制 LED燈的亮滅;2.實驗二中實現(xiàn) LED的自動閃爍,實際實驗中實現(xiàn)的是 4個
LED
燈依次閃爍,及以流水燈的形式顯示,每兩個燈之間的切換時間為 1s;3.實驗三中實現(xiàn)了LCD的顯示,并通過按鍵控制相應的顯示為加1還是減1,按下SW0,數(shù)值加1,按下SW1,數(shù)值減1,LCD上顯示的初始值為000,加滿后為255。五、存在問題和解決方法1.在完成實驗二時,題目要求周期為 1s,設(shè)計成流水燈的形式,其周期為1s代表的含義應該是四個LED燈依次點亮的時間為1s,而不是每個燈點亮的間隔為1s,所以通過改變延時來解決此問題,因此,在閱讀題目的時候需要仔細閱讀題目要求,弄清題意。在完成實驗三時,LCD剛開始的時候不能顯示,但是通過檢測LED的亮滅可以知道,程序已經(jīng)執(zhí)行,可以看出,LCD的顯示程序存在一些問題,通過仔細研究,發(fā)現(xiàn)LCD顯示部分有所漏缺,修改后LCD正常顯示。實驗三 簡單點對點無線通信實驗一、實驗內(nèi)容分別為Coordinator和EndDevice設(shè)計一個程序,分別用按鍵控制切換對方對應LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的分別為Coordinator和EndDevice設(shè)計一個程序,其功能為:按下Coordinator的SW0,某變量X(初始值0)顯示在LCD上,同時將X發(fā)送給EndDevice,EndDevice收到該數(shù)據(jù)后進行數(shù)據(jù)處理(加1),等待1秒后再將其發(fā)送給Coordinator,Coordinator收到后將該值賦予X并顯示在LCD上,同時再次發(fā)送給EndDevice,如此重復運行。二、實驗原理獲得16位短地址的方法Coordinator的16位短地址固定為0x0000,而EndDevice的16位短地址是由Coordinator動態(tài)分配的。EndDevice可直接使用短地址0x0000與Coordinator通信,而Coordinator與EndDevice通信時,Coordinator必須使用EndDevice的短地址。在應用程序中,Coordinator獲得EndDevice短地址的方法比較簡單,每當有新的結(jié)點加入到網(wǎng)絡時,Coordinator協(xié)議棧就會調(diào)用處理協(xié)議棧低層的回調(diào)函數(shù)JZA_vStackEvent(teJZS_EventIdentifiereEventId,tuJZS_StackEvent*puStackEvent),參數(shù)puStackEvent是一個指向棧事件tuJZS_StackEvent類型的指針,通過該參數(shù)即可獲得新加入結(jié)點的16位短地址。下面的JZA_vStackEvent()函數(shù)的代碼中給出了獲取16位短地址DstAddress的具體方法。if(eEventId==JZS_EVENT_NEW_NODE_HAS_JOINED){DstAddress=puStackEvent->sNewNodeEvent.u16ShortAddr;}數(shù)據(jù)格式ZigBee2004支持KVP鍵值對和 MSG消息幀兩種類型數(shù)據(jù)格式。 KVP是ZigBee2004協(xié)議中規(guī)定的一種特殊的數(shù)據(jù)傳輸機制,通過一種規(guī)定來標準化數(shù)據(jù)傳輸格式和內(nèi)容,主要用于傳輸較簡單的變量值格式;MSG是ZigBee協(xié)議中規(guī)定的另一種數(shù)據(jù)傳輸機制,這種機制在數(shù)據(jù)傳輸格式和內(nèi)容上并不做更多的規(guī)定,主要用于專用的數(shù)據(jù)流或文件數(shù)據(jù)等數(shù)據(jù)量較大的情況。 由于在ZigBee2006及以后的版本中不再支持 KVP格式的數(shù)據(jù)包,因此,在本實驗中,僅使用 MSG消息幀進行數(shù)據(jù)的傳輸。在JennicZigBee應用程序中,通常使用協(xié)議棧提供的 afdeDataRequest(函)數(shù)發(fā)送數(shù)據(jù)幀。當一個結(jié)點收到來自其他結(jié)點的 MSG幀時,協(xié)議棧就會調(diào)用回調(diào)函數(shù)JZA_bAfMsgObject()對接收的MSG幀進行處理。在數(shù)據(jù)收發(fā)過程中,發(fā)送和接收設(shè)備雙方都需要知道事件的數(shù)據(jù)格式,才能正確處理信息。3.創(chuàng)建和發(fā)送數(shù)據(jù)請求函數(shù) afdeDataRequest()該函數(shù)屬于AFDE(AFSub-layerDataEntity)類函數(shù),用來向網(wǎng)絡層發(fā)出數(shù)據(jù)發(fā)送的請求。該函數(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ā)送的目標地址模式,它是APS_Addrmode_e枚舉類型的數(shù)據(jù)。u16AddrDst:該參數(shù)是數(shù)據(jù)要發(fā)送的目標地址,地址范圍為 0x0000到0xFFFE。u8DstEP:目標地址的端口號,范圍是 0x01到0xF0。u8SrcEP:源地址的端口號,范圍是 0x01到0xF0。u16Profileid:所采用的 profileID。u8ClusterId:所采用的 clusterID。eFrameType:使用的數(shù)據(jù)幀類型0x01=KVP,0x02=MSG。u8TransCount:本次請求發(fā)送的數(shù)據(jù)事務的數(shù)量。取值范圍在 0到0x0f。pauTransactions:該參數(shù)是一個指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著需要發(fā)送的數(shù)據(jù)。bTxOptions:指定發(fā)送方式,可以選擇下列的值,這些值可以進行邏輯或。u8DiscoverRoute:設(shè)定所采用的路由發(fā)現(xiàn)模式。u8RadiusCounter:數(shù)據(jù)發(fā)送的深度,即所發(fā)送數(shù)據(jù)包的最大轉(zhuǎn)發(fā)次數(shù), 如果設(shè)置為0,協(xié)議棧將采用2倍的MaxDepth發(fā)送深度。收到MsgObject調(diào)用的函數(shù)JZA_bAfMsgObject()該函數(shù)屬于協(xié)議棧調(diào)用應用程序的函數(shù),用來處理來自其他結(jié)點發(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ā)送的目標地址模式,它是 APS_Addrmode_e枚舉類型的數(shù)據(jù).u16AddrSrc:該參數(shù)是數(shù)據(jù)發(fā)送方的源短地址,地址范圍為0x0000到0xFFFE。u8SrcEP:源端口號,范圍是0x01到0xF0。u8LQI:接收幀的鏈路質(zhì)量。u8DstEP:目標端口號,范圍是0x01到0xF0。*puTransactionInd,:該參數(shù)是一個指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著接收的數(shù)據(jù)。*puTransactionRsp:該參數(shù)是一個指向AF_Transaction_s結(jié)構(gòu)體類型的指針,在該結(jié)構(gòu)體類型的變量中,存放著response信息。5.簡單設(shè)備描述函數(shù)afmeAddSimpleDesc()該函數(shù)屬于AFME(AFSub-layerManagementEntity)類函數(shù),在增加設(shè)備描述符函數(shù)vAddDesc(void)中調(diào)用,其功能是為一個endpoint增加一個簡單描述符(simpledescriptor)。如果一個endpoint上沒有正確定義的簡單描述符,那么它將不能正確地接收來自其他結(jié)點的數(shù)據(jù),通常簡單描述符應該在設(shè)備建立網(wǎng)絡成功或者加入網(wǎng)絡成功后添加。三、軟件設(shè)計分別為Coordinator和EndDevice設(shè)計一個程序,分別用按鍵控制切換對方對應LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,若啟動成功,則硬件上的標志位LED0滅,其次再判斷是否有新的結(jié)點加入,若有新結(jié)點加入,硬件上得標志位LED1滅;判斷是否有按鍵被按下,若按下了則調(diào)用 vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。Coordinator主程序流程圖:開始系統(tǒng)、LED、按鍵初始化N網(wǎng)絡是否啟動成功YN是否有新的結(jié)點加入Y讀取按鍵的值N是否有MSG信息幀Y調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)調(diào)用接收函數(shù)控制LED亮滅Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷是否加入網(wǎng)絡成功,若加入成功,則硬件上的標志位LED0滅;判斷是否有按鍵被按下,若按下了則調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:開始系統(tǒng)、LED、按鍵初始化YN是否加入網(wǎng)絡成功Y讀取按鍵的值N是否有MSG信息幀調(diào)用vSendData()Y函數(shù)發(fā)送數(shù)據(jù)調(diào)用接收函數(shù)控制LED亮滅分別為Coordinator和EndDevice設(shè)計一個程序,其功能為:按下Coordinator的SW0,某變量X(初始值0)顯示在LCD上,同時將X發(fā)送給EndDevice,EndDevice收到該數(shù)據(jù)后進行數(shù)據(jù)處理(加 1),等待1秒后再將其發(fā)送給Coordinator,Coordinator收到后將該值賦予X并顯示在LCD上,同時再次發(fā)送給EndDevice,如此重復運行。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、 LED燈和協(xié)議棧,并且啟動 BOS定時時鐘;其后判斷網(wǎng)絡是否啟動成功,若啟動成功,硬件上得標志位LED1滅;判斷是否有按鍵被按下,若按下了,調(diào)用函數(shù)vSendData()向EndDevice發(fā)送x;在程序運行過程中若接收到EndDevice發(fā)送的數(shù)據(jù),調(diào)用LED顯示,再調(diào)用函數(shù)vSendData()向EndDevice發(fā)送x。主程序流程圖如下圖所示:Coordinator主程序流程圖:開始系統(tǒng)、LED、按鍵初始化N網(wǎng)絡是否啟動成功YN是否有新的結(jié)點加入Y讀取按鍵的值N是否有MSG信息幀調(diào)用液晶顯示程序Y調(diào)用液晶顯示程序調(diào)用vSendData()調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)函數(shù)發(fā)送數(shù)據(jù)Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷是否加入網(wǎng)絡成功,若加入成功,則硬件上的標志位LED0滅;判斷若接收到Coordinator發(fā)送的數(shù)據(jù),將接收的數(shù)據(jù)加1,最后調(diào)用BOS時鐘周期性調(diào)用vAppTick函數(shù),函數(shù)中調(diào)用vSendData()向Coordinator發(fā)送x,這樣就能實現(xiàn)定時發(fā)送。主程序流程圖如下圖所示:Enddevice主程序流程圖:開始系統(tǒng)、LED、按鍵初始化YN是否加入網(wǎng)絡成功YN是否有MSG信息幀Y將接收到的數(shù)據(jù)加 1調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)四、實驗結(jié)果與分析1.在實驗一中分別按動Coordinator的SW0~SW3,在Enddevice上的LED0~LED3能夠?qū)崿F(xiàn)相應的亮滅,同樣地,分別按動Enddevice上的SW0~SW3,也能使得Coordinator上相應的LED0~LED3亮滅。可以達到按鍵控制雙方的效果,符合題目要求,說明程序設(shè)計正確。在實驗二中按動Coordinator的SW0,可以看見LCD液晶顯示頻上數(shù)據(jù)從0開始自加一,說明Coordinator和Enddevice之間相互發(fā)送數(shù)據(jù)了,符合題目要求,說明程序設(shè)計正確。五、存在問題和解決方法在下載完程序上電測試時,發(fā)現(xiàn)Coordinator和Enddevice的LED0、LED1均不滅,那就說明網(wǎng)絡建立沒有成功,不能實現(xiàn)相互間的通信,考慮到這有可能是信道干擾的問題,和其他人的信道相沖突了。于是,我將信道改成了21,同時將網(wǎng)絡號也改掉了,重新進行下載,上電后,測試燈均滅掉了,說明網(wǎng)絡建立成功,可以實現(xiàn)通信。在實驗一中,當按下SW0是LED0亮時,必須按兩次SW1才能使LED1亮,先開始以為是按鍵的問題,可是后來發(fā)現(xiàn)自己程序中指定義了一個變量bToggle,所以只有當LED0滅了后,那么按一下SW1則LED1就亮了,這是程序中需要改進的地方。實驗四 兩個EndDevice之間的無線通信實驗一、實驗內(nèi)容分別為Coordinator和EndDevice設(shè)計一個程序,其功能為:Coordinator負責建立網(wǎng)絡和分配短地址。按下EndDeviceA的按鈕SW0發(fā)送廣播請求綁定信息,LED0閃爍,收到該信息的EndDeviceB的LED0閃爍,按下其按鈕SW0則返回綁定應答信息,同時LED0處于點亮狀態(tài),EndDeviceA收到應答后LED0也處于點亮狀態(tài),表示雙方綁定成功。之后按動每個 EndDevice的按鈕SW2、SW3可分別切換對方對應LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。2.分別為Coordinator和EndDevice設(shè)計一個程序,其功能為: Coordinator負責建立網(wǎng)絡和分配短地址及綁定的媒介。按動 EndDevice按鈕 SW0,向Coordinator發(fā)送綁定請求信息,LED0閃爍10秒,Coordinator收到該信息后記錄其短地址并定時10秒,按動另外一個EndDevice的按鈕SW0向Coordinator發(fā)送綁定應答信息,LED0閃爍5秒,在有效定時時間10秒內(nèi)若Coordinator收到該應答信號,則記錄其短地址,分別將記錄的兩個短地址發(fā)送給兩個對應EndDevice,兩個EndDevice收到短地址后分別點亮LED0(不再閃爍),若在規(guī)定時間內(nèi)沒有建立綁定關(guān)系,超時后滅LED0。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。綁定狀態(tài)下按動每個EndDevice的按鈕SW2、SW3可分別切換對方對應LED亮/滅狀態(tài)。二、實驗原理通過對方的MAC地址獲得它的16位短地址在基于JennicZigBee協(xié)議棧中,每個設(shè)備必須知道對方的 16位短地址,才能進行直接通信,而 16位短地址是在EndDevice或Router加入網(wǎng)絡時由Coordinator動態(tài)分配的。如果一個設(shè)備(請求者)知道另一個設(shè)備的MAC地址時,則請求者可通過調(diào)用zdpNwkAddrReq()函數(shù)廣播查尋與該MAC地址相匹配的結(jié)點,當匹配的結(jié)點收到該數(shù)據(jù)包則返回自己的短地址給請求者,請求者即可用該短地址與其進行通信。通過廣播請求對方綁定獲得它的16位短地址在使用afdeDataRequest()函數(shù)發(fā)送數(shù)據(jù)包時,將 16位的目標地址設(shè)置為0xffff,即可以廣播的形式將數(shù)據(jù)包發(fā)送出去。一個設(shè)備(請求者)想獲取另一個設(shè)備的16位短地址的方法是:發(fā)送一個廣播請求綁定指令數(shù)據(jù)包,符合條件的結(jié)點(如判斷指令包內(nèi)容,按下按鈕等)發(fā)送應答包(含自己的短地址)給請求者,請求者即可用該短地址與其進行通信。通過發(fā)送請求/應答綁定信息給Coordinator獲得對方的16位短地址按動EndDevice或Router按鈕,調(diào)用afdeDataRequest(函)數(shù)向Coordinator發(fā)送綁定請求信息,Coordinator收到該信息后記錄其短地址并定時,按動另外一個結(jié)點的按鈕使用afdeDataRequest(函)數(shù)向Coordinator發(fā)送綁定應答信息,在有效定時時間內(nèi)若Coordinator收到該應答信號,則記錄其短地址,分別將記錄的兩個段地址發(fā)送給兩個對應結(jié)點,兩個結(jié)點收到短地址后便可以相互直接通信。4.高功率模式M02與M04高功率模塊使用時,需要進行高功率配置,一般在初始化階段設(shè)置。高功率模塊配置函數(shù)原型為:VoidvAHI_HighPowerModuleEnable(bool_tbRFTXEn,Bool_tbRFRXEn);5.網(wǎng)絡地址請求函數(shù)zdpNwkAddrReq()在Coordinator與EndDevice實現(xiàn)的點對點實驗介紹了Coordinator獲取16位短地址的方法,而對于EndDevice和Router,當一個結(jié)點知道另一個結(jié)點的MAC地址后,則可以通過網(wǎng)絡地址請求函數(shù)zdpNwkAddrReq()以廣播的方式發(fā)送數(shù)據(jù)包,查找與該MAC地址相匹配的結(jié)點在網(wǎng)絡中的短地址。協(xié)議棧可通過調(diào)用JZA_vZdpResponse()函數(shù)處理響應消息。6.網(wǎng)絡地址請求響應函數(shù)JZA_vZdpResponse()JZA_vZdpResponse()是一個協(xié)議棧調(diào)用應用程序的函數(shù),當一個結(jié)點通過zdpNwkAddrReq()發(fā)送查找另一個結(jié)點的短地址后,匹配的結(jié)點發(fā)送的應答消息可通過請求者的協(xié)議棧調(diào)用JZA_vZdpResponse()處理。三、軟件設(shè)計分別為Coordinator和EndDevice設(shè)計一個程序,其功能為:Coordinator負責建立網(wǎng)絡和分配短地址。按下EndDeviceA的按鈕SW0發(fā)送廣播請求綁定信息,LED0閃爍,收到該信息的EndDeviceB的LED0閃爍,按下其按鈕SW0則返回綁定應答信息,同時LED0處于點亮狀態(tài),EndDeviceA收到應答后LED0也處于點亮狀態(tài),表示雙方綁定成功。之后按動每個 EndDevice的按鈕SW2、SW3可分別切換對方對應LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1則解除綁定,各EndDevice的LED0滅,且LED1閃爍3秒。Coordinator:Coordinator負責建立網(wǎng)絡和分配短地址,程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位LED0滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:開始系統(tǒng)初始化N網(wǎng)絡是否建立成功Y結(jié)束EnddeviceA:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、 LED燈和協(xié)議棧,并且啟動 BOS定時時鐘;其后判斷網(wǎng)絡是否加入成功,若加入成功,則硬件上的標志位LED0滅。判斷是否按下SW0鍵,若有按下,則調(diào)用vSendData()函數(shù)發(fā)送廣播請求綁定信息;判斷是否收到應答信息,若收到,則調(diào)用vLedControl(1,TRUE)控制LED0處于點亮狀態(tài),表示雙方綁定成功,并且獲取對方短地址,此時能夠與EnddeviceB進行通信;然后就開始讀取按鍵值,若有按鍵按下,則調(diào)用按鍵處理函數(shù)進行按鍵處理;同時若收到目標地址的MSG信息,則執(zhí)行對應控制指令。主程序流程圖如下圖所示:EnddeviceA主程序流程圖:開始系統(tǒng)初始化網(wǎng)絡是否建立成功NY是否有新的節(jié)點加入NY檢測按鍵是否按下SW0NY以廣播的形式發(fā)送數(shù)據(jù)是否收到應答綁定信息NYN是否有MSG信息幀NY檢測是否有按鍵按下調(diào)用接收函數(shù)控制Y相應的功能SW1SW2orSW3解除綁定,調(diào)用vSendData()發(fā)LED閃爍3s送數(shù)據(jù)給BEnddeviceB:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷網(wǎng)絡是否加入網(wǎng)絡成功,若加入成功,則硬件上的標志位LED0滅。判斷若接收到廣播請求綁定信息,則獲取對方短地址,且EnddeviceB的LED0閃爍,若按下其SW0,則返回綁定應答信息,同時調(diào)用vLedControl(1,TRUE)控制LED0處于點亮狀態(tài),并且調(diào)用vSendData(0)函數(shù)發(fā)送應答信息,此時與EnddeviceA建立通信;若有按鍵按下,則讀取按鍵的值,若讀取成功則調(diào)用按鍵處理函數(shù)進行按鍵處理;同時若收到目標地址的MSG信息,則執(zhí)行對應控制指令。主程序流程圖如下圖所示:EnddeviceB主程序流程圖:開始系統(tǒng)初始化N是否加入網(wǎng)絡成功YN是否接收到廣播信息Y檢測按鍵N是否按下SW0Y返回綁定應答信息N是否有MSG信息幀NY檢測是否有按鍵按下調(diào)用接收函數(shù)控制Y相應的功能SW1SW2orSW3解除綁定,調(diào)用vSendData()發(fā)LED閃爍3s送數(shù)據(jù)給B四、實驗結(jié)果與分析給電路板上電后,Coordinator負責建立網(wǎng)絡和分配短地址,且三方的網(wǎng)絡建立成功。然后按下EndDeviceA的SW0向EndDeviceB發(fā)送廣播請求綁定信息,此時EndDeviceA的LED0不斷地閃爍,收到該信息的EndDeviceB的LED0也閃爍,在程序中我定義了他們兩方是一直閃爍的。當按下 EndDeviceB的SW0按鈕則返回綁定應答信息,此時EndDeviceB通過其中的JZA_bAfMsgObject函數(shù)將EndDeviceA的地址記錄下來,作為目標地址,同時LED0處于點亮狀態(tài)。與此同時EndDeviceA收到應答后也同樣將EndDeviceB的地址作為目標地址,同時LED0也處于點亮狀態(tài),表示雙方綁定成功。之后按動每個EndDevice的按鈕SW2、SW3可分別切換對方對應LED亮/滅狀態(tài)。如果按下任何EndDevice的SW1此時的目標地址都為0,解除綁定,且LED1閃爍3秒,實驗現(xiàn)象符合要求。五、存在問題和解決方法1.在本次實驗中,當EndDeviceA發(fā)送信息后LED0我設(shè)置了長閃,但會出現(xiàn)永遠閃爍的情況,即跳不出閃爍的循環(huán)子程序,針對這一問題,我寫了兩個閃爍程序,同時設(shè)置了一個標志位,使得n=1的時候才執(zhí)行閃爍程序,問題得以解決。實驗五 DIO中斷實驗一、實驗內(nèi)容分別為Coordinator和EndDevice設(shè)計一個程序,運用DIO中斷的方式分別用按鍵控制切換對方對應LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的分別為Coordinator和EndDevice設(shè)計一個程序,運用DIO中斷的方式分別用DIO4、DIO5、DIO6、DIO7切換對方相應LED亮/滅狀態(tài)。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。二、實驗原理1.vAHI_DioSetDirection()函數(shù)該函數(shù)用來設(shè)置DIO引腳的方向(輸入或輸出),其函數(shù)原型和使用方法參見講義2。當某個DIO作為外部終端源時,則意味著該DIO引腳設(shè)置為輸入。如果一個DIO引腳已安排給另一個外設(shè)且該外設(shè)已啟用,則該函數(shù)對該DIO引腳不產(chǎn)生影響。2.vAHI_DioInterruptEdge()函數(shù)當某個DIO作為輸入引腳時,則用該函數(shù)設(shè)置中斷產(chǎn)生時是采用上升沿還是下降沿觸發(fā)。該函數(shù)的原型如下:voidvAHI_DIOInterruptEdge(uint32u32Rising,uint32u32Falling);各參數(shù)的具體含義描述如下:u32Rising:32位位掩碼,其位0至位20對應于每一個DIO引腳。當某一位為1時,則意味著該位對應的引腳在輸入信號的上升沿觸發(fā)中斷。 u32Rising的位21至位31無定義,可設(shè)置為1或0。u32Falling:32位位掩碼,其位0至位20對應于每一個DIO引腳。當某一位為1,則意味著該位對應的引腳在輸入信號的下降沿觸發(fā)中斷。u32Rising的位21至位31無定義,可設(shè)置為1或0。該函數(shù)僅將u32Rising中為1的位對應的引腳設(shè)置為上升沿觸發(fā)中斷, u32Falling中為1的位對應的引腳設(shè)置為下降沿觸發(fā)中斷,沒有涉及到的引腳保持它原來的狀態(tài)。 如果某一個引腳在u32Rising和u32Falling中都進行了設(shè)置,則默認為上升沿觸發(fā)。該函數(shù)僅對設(shè)置為輸入的DIO引腳有效。如果一個DIO引腳已安排給另一個外設(shè)且該外設(shè)已啟用,則該函數(shù)對該DIO引腳不產(chǎn)生影響。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);函數(shù)vAHI_DioSetDirection設(shè)置DIO0、DIO1、DIO7等8個引腳方向為輸入,函數(shù)vAHI_DIOInterruptEdge設(shè)置DIO0、DIO1、DIO2和DIO3等4個引腳為上升沿觸發(fā)中斷,DIO4、DIO5和DIO6等3個引腳為下降沿觸發(fā)中斷,DIO7引腳保持原狀態(tài)。3.vAHI_DioInterruptEnable()函數(shù)當某個DIO作為輸入引腳時,則該函數(shù)用來設(shè)置接收或屏蔽該引腳發(fā)來的中斷,及使能/屏蔽中斷。該函數(shù)的原型如下:voidvAHI_DIOInterruptEnable(uint32u32Enable,uint32u32Disable);各參數(shù)的具體含義描述如下:u32Enable:32位位掩碼,它的位0至位20對應于每一個DIO引腳。當某一位為1時,則使能該位對應的引腳發(fā)來的中斷。u32Enable的位21至位31無定義。u32Disable:32位位掩碼,它的位0至位20對應于每一個DIO引腳。當某一位為1時,則屏蔽該位對應的引腳發(fā)來的中斷。u32Disable的位21至位31無定義。該函數(shù)僅使能u32Enable中為1的位對應的引腳中斷,屏蔽u32Disable中為1的位對應的引腳中斷,沒有涉及到的引腳保持它原來的狀態(tài)。如果某一個引腳在u32Enable和u32Disable中都進行了設(shè)置,則默認為屏蔽中斷。該函數(shù)僅對設(shè)置為輸入的DIO引腳有效。如果一個DIO引腳已安排給另一個外設(shè)且該外設(shè)已啟用,則對該DIO引腳不產(chǎn)生影響。DIO引腳中斷可用來喚醒處于睡眠模式的設(shè)備。例如:vAHI_DioSetDirection(0x000000FF,0x00000000);vAHI_DioInterruptEdge(0x0000000F,0x00000077);vAHI_DioInterruptEnable(0x00000007,0x0000007C);使能DIO0和DIO1兩個引腳的中斷,上升沿觸發(fā)中斷,屏蔽DIO2、DIO3、DIO4、DIO5和DIO6等5個引腳。DIO7引腳為輸入,其它引腳保持原狀態(tài)。JZA_vPeripheralEvent()函數(shù)該函數(shù)在中斷上下文時調(diào)用,即微處理器在執(zhí)行中斷處理程序的過程中調(diào)用,用于處理硬件中斷。該函數(shù)的原型為:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap);各參數(shù)的具體含義描述如下:u32Device:產(chǎn)生中斷的外圍設(shè)備 ID號,在802.15.4規(guī)范中被定義為枚舉值。u32ItemBitmap:與u32Device相對應的外圍設(shè)備中斷源的位映射圖, 在802.15.4規(guī)范中被定義為枚舉值。5.vAHI_DioSetPullup()函數(shù)當某個DIO作為輸入輸出引腳時,則用該函數(shù)設(shè)置相應引腳是否上拉。該函數(shù)的原型如下:voidvAHI_DioSetPullup(uint32u32On,uint32u32Off);各參數(shù)的具體含義描述如下:u32On:32位位掩碼,其位0至位20對應于每一個DIO引腳。當某一位為1時,則意味著該位對應的引腳被上拉。u32On的位21至位31無定義,可設(shè)置為1或0。u32Off:32位位掩碼,其位0至位20對應于每一個DIO引腳。當某一位為1時,則意味著該位對應的引腳關(guān)閉上拉。u32Off的位21至位31無定義,可設(shè)置為1或0。三、軟件設(shè)計分別為Coordinator和EndDevice設(shè)計一個程序,運用DIO中斷的方式分別用按鍵控制切換對方對應LED亮/滅狀態(tài)。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0等等。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、中斷口和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位 LED0滅,其次再判斷是否有新的結(jié)點加入,若有新結(jié)點加入,硬件上得標志位LED1滅;判斷是否有按鍵被按下,若按下了則表示有中斷,所以調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到 MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:開始系統(tǒng)、LED、按鍵、中斷口初始化N網(wǎng)絡是否啟動成功YN是否有新的結(jié)點加入Y設(shè)置中斷端口N是否有MSG信息幀NY是否有中斷調(diào)用接收函數(shù)控制YLED亮滅調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、中斷端口和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷是否加入網(wǎng)絡成功,若加入成功,則硬件上的標志位LED0滅;判斷是否有按鍵被按下,若按下了則表示有中斷,所以調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:開始系統(tǒng)、LED、按鍵、中斷端口初始化N是否加入網(wǎng)絡成功Y設(shè)置中斷端口N是否有MSG信息幀NY是否有中斷調(diào)用接收函數(shù)控制YLED亮滅調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)分別為Coordinator和EndDevice設(shè)計一個程序,運用DIO中斷的方式分別用DIO4、DIO5、DIO6、DIO7切換對方相應LED亮/滅狀態(tài)。如Coordinator的DIO4控制EndDevice的LED0,EndDevice的DIO5控制Coordinator的LED1等等。Coordinator:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED燈、中斷口和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷網(wǎng)絡是否啟動成功,若啟動成功,則硬件上的標志位 LED0滅,其次再判斷是否有新的結(jié)點加入,若有新結(jié)點加入,硬件上得標志位LED1滅;判斷是否有中斷,若有中斷,調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Coordinator主程序流程圖:開始系統(tǒng)、LED、中斷口初始化N網(wǎng)絡是否啟動成功YN是否有新的結(jié)點加入Y設(shè)置中斷端口N是否有MSG信息幀NY是否有中斷調(diào)用接收函數(shù)控制YLED亮滅調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)Enddevice:程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、LED燈、中斷端口和協(xié)議棧,并且啟動BOS定時時鐘;其后判斷是否加入網(wǎng)絡成功,若加入成功,則硬件上的標志位LED0滅;判斷是否有中斷,若有中斷,則調(diào)用vSendData()函數(shù)向enddevice發(fā)送一個數(shù)據(jù),在程序運行過程中若接收到MSG信息,則調(diào)用vLedControl(0,bToggle)控制燈的亮滅。主程序流程圖如下圖所示:Enddevice主程序流程圖:開始系統(tǒng)、LED、中斷端口初始化N是否加入網(wǎng)絡成功Y設(shè)置中斷端口N是否有MSG信息幀NY是否有中斷調(diào)用接收函數(shù)控制YLED亮滅調(diào)用vSendData()函數(shù)發(fā)送數(shù)據(jù)四、實驗結(jié)果與分析在實驗一中,分別按動Coordinator和Enddevice的SW0、SW1、SW2、SW3可以控制對方的相應的LED燈出現(xiàn)亮滅交替的狀態(tài),因為SW0、SW1、SW2、SW3對應的是DIO9、DIO10、DIO11、DIO20口,按下按鍵的時候即給這些端口以中斷,從而控制了LED的亮滅,實驗現(xiàn)象與要求的相同,說明程序正確且正常運行。在實驗二中,通過用杜邦線連接相應的中斷端口,中斷端口在程序中有所設(shè)置,插拔杜邦線,即給以端口中斷,從而控制了 LED燈的亮滅。五、存在問題和解決方法在實驗中,會存在不只中斷一次的情況,經(jīng)過多番嘗試,發(fā)現(xiàn)原程序中的vAHI_DioInterruptEnable()函數(shù)本身就存在問題,以我自己的理解,執(zhí)行這個程序的時候并沒有起到消抖的作用,所以我在程序中設(shè)置了一個標志位,起到了消抖的作用,使其只中斷一次,同時在硬件和軟件上都起到了屏蔽中斷的作用。實驗六 定時器實驗一、實驗內(nèi)容設(shè)計一個程序,運用Timer1中斷實現(xiàn)流水燈,周期1秒。設(shè)計一個程序,初始化DIO16(LED0)為輸入,運用Timer0PWM輸出控制LED0的亮滅狀態(tài),一個周期內(nèi)亮2秒,滅1秒。二、實驗原理1.vAHI_TimerEnable()函數(shù)該函數(shù)用來使能指定的定時器,并為該定時器設(shè)置參數(shù)。該函數(shù)的原型如下:voidvAHI_TimerEnable(uint8u8Timer,uint8u8Prescale,bool_tbIntRiseEnable,bool_tbIntPeriodEnable,bool_tbOutputEnable);各參數(shù)的具體含義描述如下:u8Timer:定時器的標識,在JN5121/JN513x微控制器中有兩個應用級定時器/計數(shù)器,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標識Time0和Timer1。u8Prescale:時鐘的預分頻值,它的最大值為 16。分頻后的頻率為原頻率的u8Prescale1/2 。bIntRiseEnable:該參數(shù)值為TRUE時,定時器的輸出變?yōu)楦唠娖綍r使能中斷。bIntPeriodEnable:該參數(shù)值為TRUE時,當定時器的一個周期到且輸出變?yōu)榈碗娖綍r,使能中斷。bOutputEnable:該參數(shù)值為TRUE時,使定時器的輸出出現(xiàn)在與PWM相關(guān)的輸出引腳上。Timer0使用DIO8-10引腳,Timer1使用DIO11-13引腳。2.vAHI_TimerClockSelect()函數(shù)選擇內(nèi)部或外部時鐘,當使用內(nèi)部時鐘時要設(shè)置輸出門。該函數(shù)的原型如下:voidvAHI_TimerClockSelect(uint8u8Timer,bool_tbExternalClock,bool_tbGateControl);各參數(shù)的具體含義描述如下:u8Timer:定時器的標識,與函數(shù)vAHI_TimerEnable()中的用法相同,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標識Time0和Timer1。bExternalClock:該參數(shù)值為TRUE,表示使用外部時鐘;為FALSE,表示使用16MHz的內(nèi)部時鐘。bGateControl:該參數(shù)值為TRUE時,表示當定時器的門輸入是高電平時,打開輸出引腳;為FALSE時,表示當定時器的門輸入為低電平時,打開輸出引腳。vAHI_TimerStartRepeat()函數(shù)設(shè)置重復定時器。該函數(shù)的原型如下:voidvAHI_TimerStartRepeat(uint8u8Timer,uint16u16Hi,uint16u16Lo);各參數(shù)的具體含義描述如下:u8Timer:定時器的標識,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標識Time0和Timer1。u16Hi:該參數(shù)值表示在開始一個定時器之后,在定時器的輸出變?yōu)楦唠娖街敖?jīng)歷的時鐘周期數(shù)。u16Lo:該參數(shù)值表示在開始一個定時器之后,在定時器的輸出變?yōu)榈碗娖街敖?jīng)歷的時鐘周期數(shù)。即定時器有效時間內(nèi)的時鐘周期數(shù)。啟動定時器后,當經(jīng)歷u16Hi個時鐘周期后,定時器的輸出由低電平變?yōu)楦唠娖?,再?jīng)歷u16Lo-u16Hi個時鐘周期后,定時器的輸出由高電平變?yōu)榈碗娖?,重新啟動定時器。這個過程重復執(zhí)行,直到執(zhí)行vAHI_TimerStop()函數(shù)停止定時器為止。如果定時器的中斷使能,可設(shè)置當定時器的輸出由低電平變?yōu)楦唠娖綍r觸發(fā)中斷,也可設(shè)置當定時器的輸出電平由高變低時觸發(fā)中斷。停止定時對于設(shè)置了重復定時器,當需要停止定時時,則需要執(zhí)行vAHI_TimerStop()函數(shù)停止定時器,其函數(shù)原型如下:voidvAHI_TimerStop(uint8u8Timer);參數(shù)u8Timer為定時器的標識,用E_AHI_TIMER_0和E_AHI_TIMER_1分別標識Time0和Timer1。定時時間計算以內(nèi)部時鐘為例計算定時時間為: LouMHzescaleu162161Pr8××,例如當設(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);則定時器時間為:u8Prescale 101/16MHz×2 ×u16Lo=1/162××15625=1s定時器的設(shè)置在程序中用E_AHI_TIMER_0和E_AHI_TIMER_1分別標識Time0和Timer1。在使用定時器之前需要對定時器進行設(shè)置,主要使用三個函數(shù):第一個函數(shù)vAHI_TimerEnable(),用來使能指定的定時器,并為該定時器設(shè)置參數(shù);第二個函數(shù)是vAHI_TimerClockSelect(),用來選擇內(nèi)部或外部時鐘,當使用內(nèi)部時鐘時還要設(shè)置輸出門;第三個函數(shù)是vAHI_TimerStartRepeat(),設(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);定時中斷響應處理JZA_vPeripheralEvent()函數(shù)在JennicZigBee協(xié)議棧處理硬件中斷時調(diào)用,定時器中斷也屬于外部中斷,因此在該函數(shù)中加入定時器中斷處理程序,例如當有Timer1中斷時,如果EndDevice已加入網(wǎng)絡,則發(fā)送一個數(shù)據(jù)包給Coordinator,其程序代碼如下:PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap){vAHI_TimerStartRepeat(E_AHI_TIMER_0,if(u32Device==E_AHI_DEVICE_TIMER1)if(bNwkJoined)vSendData(2);}其中u32Device指產(chǎn)生中斷的設(shè)備ID號,E_AHI_DEVICE_TIMER1是指定時器Tiner1的ID號,這段程序的意思是:若中斷來自于Timer1并且EndDevice已加入網(wǎng)絡的情況下給Coordinator發(fā)送數(shù)據(jù)包。三、軟件設(shè)計設(shè)計一個程序,運用Timer1中斷實現(xiàn)流水燈,周期1秒。程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈、定時器和協(xié)議棧,并且啟動BOS定時時鐘;然后調(diào)用JZS_vStartStack()函數(shù),啟動網(wǎng)絡,如果網(wǎng)絡啟動,在硬件電路上的標志為LED0滅;其次檢測是否有按鍵按下,如果 SW3按下,則判斷標志為Flag1,若Flag=1則開定時器1,并執(zhí)行中斷處理函數(shù),使得LED流水燈順時針顯示,周期為1s,若Flag=0,則關(guān)定時器1;如果按下SW2按下,則判斷標志為Flag2,若Flag=2則開定時器1,并執(zhí)行中斷處理函數(shù),使得LED流水燈逆時針顯示,周期為1s,若Flag=0,則關(guān)定時器1。主程序流程圖如下圖所示:開始系統(tǒng)、LED、按鍵、定時器初始化Y是否啟動網(wǎng)絡成功NY檢測是否有按鍵按下NY按下SW3按下SW2NNFlag2=1Flag1=1YY關(guān)定時器1開定時器1關(guān)定時器1開定時器1調(diào)用中斷處理函數(shù),調(diào)用中斷處理函數(shù),LED流水燈順時針顯LED流水燈逆時針顯示,周期為1s示,周期為1s設(shè)計一個程序,初始化DIO16(LED0)為輸入,運用Timer0PWM輸出控制LED0的亮滅狀態(tài),一個周期內(nèi)亮2秒,滅1秒。程序首先執(zhí)行AppColdStart()函數(shù),設(shè)置信道號和PANID,然后調(diào)用vInit()函數(shù),初始化系統(tǒng)、按鍵、LED燈和協(xié)議棧,同時調(diào)用vAHI_DioSetDirection()函數(shù)設(shè)置DIO16(LED0)為輸入腳,DIO10(Timer0PWM)為輸出腳,并且啟動BOS定時時鐘;然后調(diào)用JZS_vStartStack()函數(shù),啟動網(wǎng)絡,如果網(wǎng)絡啟動,在硬件電路上的標志為LED0滅;其次檢測是否有按鍵按下,如果SW0按下,則判斷標志為Flag1,若Flag=1則開定時器1,并執(zhí)行中斷處理函數(shù),根據(jù)PWM輸出控制LED的亮滅狀態(tài),亮滅的時間通過函數(shù)31250,62500)設(shè)置,本次實驗中,我設(shè)置了定時4s,亮2s,滅2s。主程序流程圖如下圖所示:開始系統(tǒng)、LED初始化DIO16為輸入腳,DIO10為輸出腳初始化YN是否啟動網(wǎng)絡成功YN檢測是否有按鍵按下Y按下SW0NFlag1=1Y關(guān)定時器0 開定時器0調(diào)用中斷處理函數(shù),LED交替亮滅四、實驗結(jié)果與分析在實驗一中,按動SW3,LED流水燈順時針顯示,周期為1s,再按一下SW3,定時器關(guān),LED停止流水燈顯示;按動SW2,LED流水燈逆時針顯示,周期為1s,再按一下SW3,定時器關(guān),LED停止流水燈顯示。符合題目要求,說明程序正確。在實驗二中,用一根杜邦線將DIO16腳與DIO10腳相連接,按下SW0后,定時器0開,根據(jù)高低電平的變化,實現(xiàn)了 LED0亮2s,滅2s的現(xiàn)象,符合題目要求,程序正確。五、存在問題和解決方法在實驗先開始,沒有確定LED等式低電平亮還是高電平亮,所以在實驗二中,導致設(shè)置的LED亮滅的狀態(tài)與自己預定的相反,解決的方法即在實驗前測試了一下,確定了LED燈是當?shù)碗娖降臅r候點亮。在實驗二中,要通過插杜邦線,將DIO16和DIO10腳相連接,但是,開電源之后,LED并沒有任何變化,在檢查程序沒有錯誤的情況下,發(fā)現(xiàn)是杜邦線插錯了腳,這告訴我們做任何事情都要細心,注意細節(jié)。在實驗二中,我開始設(shè)置定時器是vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,FALSE),結(jié)果無法正常顯示,于是后來我將定時器設(shè)置為vAHI_TimerEnable(E_AHI_TIMER_0,10,FALSE,TRUE,TRUE),因為必須設(shè)置為輸出才能有PWM輸出。實驗七 UART實驗一、實驗內(nèi)容分別為Coordinator和EndDevice設(shè)計一個程序:按動EndDevice的不同按鈕能夠向Coordinator發(fā)送不同信息,再由Coordinator經(jīng)串口轉(zhuǎn)發(fā)給PC機,串口調(diào)試工具輸出窗口能夠看到相關(guān)信息。分別為Coordinator和EndDevice設(shè)計一個程序:通過PC機串口調(diào)試工具經(jīng)串口發(fā)送文本信息給Coordinator,再由其轉(zhuǎn)發(fā)給EndDevice,然后在與EndDevice相連的LCD上顯示文本信息內(nèi)容。二、實驗原理1.vAHI_UartEnable()函數(shù)UART使能指定。函數(shù)的原型如下:voidvAHI_UartEnable(uint8u8Uart);參數(shù)u8Uart用來標識UART,其值可以是E_AHI_UART_0或E_AHI_UART_1,前者表示UART0,后者表示UART1。vUART_printInit()函數(shù)該函數(shù)用來初始化串口0,函數(shù)的原型如下:PUBLICvoidvUART_printInit(void);調(diào)用該函數(shù)需要在工程文件中加入頭文件Printf.h,例如:#include<Printf.h>vPrintf()函數(shù)使用vPrintf()函數(shù)往串口0發(fā)送數(shù)據(jù),函數(shù)的原型如下:PUBLICvoidvPrintf(constchar*fmt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南工程職業(yè)學院《重金屬冶金學》2023-2024學年第二學期期末試卷
- 新疆應用職業(yè)技術(shù)學院《外國戲劇史》2023-2024學年第二學期期末試卷
- 2025屆河南省駐馬店市驛城區(qū)高三上學期一模歷史試卷
- 黑龍江職業(yè)學院《勞動定額學》2023-2024學年第二學期期末試卷
- 2024-2025學年浙江省部分重點高中高二上學期12月月考歷史試卷
- 九江學院《文具設(shè)計》2023-2024學年第二學期期末試卷
- 青海師范大學《汽車電子電氣A》2023-2024學年第二學期期末試卷
- 煙臺理工學院《中國古代文學作品》2023-2024學年第二學期期末試卷
- 南陽農(nóng)業(yè)職業(yè)學院《就業(yè)與創(chuàng)業(yè)教育》2023-2024學年第二學期期末試卷
- 桂林信息工程職業(yè)學院《生物質(zhì)能源概論》2023-2024學年第二學期期末試卷
- QES三體系內(nèi)審檢查表 含審核記錄
- 信息論與編碼 自學報告
- 二年級乘除法口訣專項練習1000題-推薦
- 貸款項目資金平衡表
- 唯美動畫生日快樂電子相冊視頻動態(tài)PPT模板
- 設(shè)計文件簽收表(一)
- 義務教育語文課程標準2022年版
- 公務員入職登記表
- 臨水臨電計算公式案例
- 2022新教科版六年級科學下冊第二單元《生物的多樣性》全部教案(共7節(jié))
- PEP人教版小學英語單詞四年級上冊卡片(可直接打印)
評論
0/150
提交評論