2023年通信新技術實驗報告_第1頁
2023年通信新技術實驗報告_第2頁
2023年通信新技術實驗報告_第3頁
2023年通信新技術實驗報告_第4頁
2023年通信新技術實驗報告_第5頁
已閱讀5頁,還剩133頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論