CC2530簡介匯總課件_第1頁
CC2530簡介匯總課件_第2頁
CC2530簡介匯總課件_第3頁
CC2530簡介匯總課件_第4頁
CC2530簡介匯總課件_第5頁
已閱讀5頁,還剩163頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

CC2530簡介1CC2530簡介11CC2530芯片CC2530是基于2.4GHzIEEE802.15.4、ZigBee和RF4CE上的一個片上系統解決方案。其特點是以極低的總材料成本建立較為強大的網絡節點。CC2530芯片結合了RF收發器,增強型8051CPU,系統內可編程閃存,8KBSRAM和許多其他模塊的強大的功能。CC2530主要有四種不同的閃存版本:CC2530F32/64/128/256(32/64/128/256KB閃存)其具有多種運行模式,使得它能滿足超低功耗系統的要求。同時CC2530運行模式之間的轉換時間很短,使其進一步降低能源消耗。2CC2530芯片CC2530是基于2.4GHzIEEE802CC2530片內結構方框圖數字模擬混合輸入/輸出控制器XOSC_Q2RESET_NXSOC_Q1P2_4P2_3P2_2P2_1P2_0P1_4P1_3P1_2P1_1P1_0RF_PP1_7P1_6P1_5P1_4P1_3P1_2P1_1P1_0P1_7P1_6P1_5復位看門狗片上穩壓器32MHz晶振高速RC-OSC上電/復位/掉電32.768KHz晶振32.768KHzRC-OSC睡眠定時器調試接口多路時鐘校準睡眠模式控制器DMA8051CPU內核存儲器仲裁32/64/128/256KBFLASH8KBSRAMADC音頻/直流8通道AES加密和解密IRQ控制FLASH寫射頻寄存器CSMA/CA選通處理器USART1USART2射步數據接口定時器1(16位)定時器2IEEE802.15.4MAC定時器定時器3(8位)定時器4(8位)調制器解調器自動增益控制頻率合成器接收鏈RF_N先進選出和幀控制發送鏈VDD(2.0-3.6V)DCOUPL3CC2530片內結構方框圖數字模擬混合輸入/輸出控制器XOS3CC2530引腳描述(1)4CC2530引腳描述(1)44CC2530引腳描述(2)5CC2530引腳描述(2)55CC2530封裝6CC2530封裝66CC2530需要極少的外部連接元件,同時有很多典型電路,其模塊大致可以分為三類:1、CPU和內存相關模塊2、外設,時鐘和電源管理相關模塊3、無線信號收發相關模塊CC2530芯片內部結構7CC2530需要極少的外部連接元件,同時有很多典型電路,其模7強大的5通道DMAIEEE802.15.4MAC定時器,通用定時器(一個16位定時器,一個8位定時器)IR發生電路(IR中斷)具有捕獲功能的32-kHz睡眠定時器硬件支持CSMA/CA(載波偵聽多路訪問/沖突避免)

支持精確的數字化RSSI/LQI(鏈路質量指示)電池監視器和溫度傳感器21個通用I/O引腳看門狗定時CC2530的外設(1)8強大的5通道DMACC2530的外設(1)88兩個8位定時器:定時器3,4為8位定時器,有一個可編程分頻器,一個8位的周期值,一個計數器通道。MAC定時器:專為MAC或其他協議而設的定時器,可以跟蹤已過周期,同時可以記錄收發某一的幀精確時間和傳輸結束時間,以便產生不同的選通命令到無線模塊ADC:支持7到12位的分辨率,帶寬范圍為7-30kHz,在DC與音頻轉換時,能夠使用8個輸入通道。AES加密/解密內核:CC2530用128位的AES算法進行加密或解密數據,從而保證了ZigBee網絡層和應用層的安全要求。USART0和USART1分別被配置為一個主從或一個UART,其功能是為RX和TX提供雙緩沖,以及硬件流控制。調試接口:用于內部電路調試,具有兩線串形接口I/O控制器:負責所有的通用的I/O引腳CC2530的外設(2)9兩個8位定時器:定時器3,4為8位定時器,有一個可編程分頻器9CC2530具備一個IEEE802.15.4兼容無線收發器,其中的RF內核控制模擬無線模塊,另外它還提供了一個連接外部設備的端口,從而可以發出命令和讀取狀態,操縱各執行電路的事件順序。同時無線設備還包括數據包過慮模塊和地址識別模塊。無線設備10CC2530具備一個IEEE802.15.4兼容無線收發器10CC2530最小系統11CC2530最小系統1111CC2530的典型應用12CC2530的典型應用1212輸入輸出匹配:當使用單極子的一個不平衡天線,需要用一個巴倫(平衡非平衡轉換器)來對性能進行優化,可以采用低成本分立電感或電容來實現,這里主要運用C262,L261,C252,L252.如果使用了諸如折疊偶極子這樣的平衡天線,巴倫可以忽略。1.8V片上穩壓器:用以提供1.8V的數字邏輯電壓,采用這一個穩壓器要求用一個去耦電容C401來獲得穩定運行效果。電源去耦和過濾必須使用合適的電源去耦以獲得最佳的性能。在一個應用中去耦電容和電源過濾的位置和尺寸對獲得最佳性能是非常重要的。TI提供了一個緊湊的參考設計,應該很好地遵循。晶振32MHz晶振使用了一個外部32-MHz振蕩器XTAL1和兩個負載電容(C221和C231)。晶振XTAL2是一個可選的32.768kHz晶振,有兩個負載電容(C321和C331)用于32.768-kHz晶振。32.768kHz晶振用于要求非常低的睡眠電流消耗和精確喚醒時間的應用。元件說明13輸入輸出匹配:當使用單極子的一個不平衡天線,需要用一個巴倫(13CC2530模塊傳感器板14CC2530模塊傳感器板1414步進電機結點15步進電機結點1515CCDebug仿真器16CCDebug仿真器1616CC2530使用的8051CPU是一個單周期的兼容內核,它有三種不同的訪問總線。其中包括中斷控制器,內存仲裁器,8KBSRAM,32/64/128/256KB閃存塊。增強型8051內核使用標準的8051指令集。因為以下原因指令執行比標準的8051更快:每個指令周期是一個時鐘,而標準的8051每個指令周期是12個時鐘消除了總線狀態的浪費。因為一個指令周期與可能的內存存取是一致的,大多數單字節指令在一個時鐘周期內執行。除了速度提高之外,增強型8051內核還包括結構上的改善。第二個數據指針一個擴展的18源中斷單元8051內核的對象代碼兼容業界標準的8051微控制器。即對象代碼使用8051內核上執行的業界標準的8051編譯器或匯編器編譯,在功能上是等同的。CC2530的CPU17CC2530使用的8051CPU是一個單周期的兼容內核,它有17CC2530的CPU中斷控制器:其為18個中斷源提供服務,它們中的每個中斷都被賦予4個中斷優先級中的某一個。內存仲裁器:位于系統中心,它負責執行仲裁,即決定同時訪問系統物理存儲器時的順序,便于系統效率的提高。8KBSRAM:為超低功耗的SRAM,使數字部分即使掉電也能保存其中內容,是芯片低功耗原因所在。閃存塊:用于保存電腦傳輸進入的程序代碼以及常量數據,節約了搜尋時間。18CC2530的CPU中斷控制器:其為18個中斷源提供服務,它18CC2530的存儲器CC2530里的四種存儲空間:CODE程序存儲器:用處存放程序代碼和一些常量,尋址范圍0000H~FFFFH共64KB。DATA:內部數據存儲空間,可以直接或間接被一個單周期CPU指令訪問。這一存儲空間是256B。其中較低的128B可以直接或間接尋址,較高的128B只能間接尋址。XDATA:外部數據存儲空間,通常需要4-5個CPU指令周期來訪問。這一存儲空間是64KB。訪問XDATA存儲器慢于訪問DATA,因為CODE和XDATA存儲空間共享CPU內核上的一個通用總線。SFR:寄存器存儲空間,可以直接被一個CPU指令訪問。這一存儲空間含有128字節。對于地址是被8整除的SFR寄存器,每一位還可以單獨尋址。

這四個存儲空間在8051結構中是分開的,但是在設備中有部分是重疊的,以減輕DMA傳輸和硬件調試操作的負擔。19CC2530的存儲器CC2530里的四種存儲空間:1919CC2530的XDATA存儲器映射為使DMA訪問全部物理存儲空間,并由此使得DMA在不同8051存儲空間之間進行傳輸,CODE和SFR部分存儲空間映射到XDATA存儲空間。XDATA較高的32KB是一個只讀區域(XBANK),任何可用的32KB閃存區均可以映射到這里。這使得軟件可以訪問整個閃存存儲器。這一區域主要用作存儲另外的常量數據。20CC2530的XDATA存儲器映射為使DMA訪問全部物理存20CC2530的CODE存儲器映射機制一

機制一是標準的8051映射,只有程序存儲器(即閃存)映射到CODE存儲空間,這是復位后默認映射方式。RootBankFMAP.MAP[2:0]確定過來的Bank21CC2530的CODE存儲器映射機制一21CC2530的CODE存儲器映射機制二22CC2530的CODE存儲器映射機制二2222CPU存儲空間SRAM映射到的地址范圍是0x0000到(SRAM_SIZE–1)。XREG區域映射到1KB地址區域(0x6000–0x63FF)。這些寄存器是另外的寄存器,有效地擴展SFR寄存器空間。一些外設寄存器和大多數無線電控制和數據寄存器映射到這里。SFR寄存器映射到地址區域(0x7080–0x70FF)。閃存信息頁面(2KB)映射到地址區域(0x7800–0x7FFF)。這是一個只讀區域,包含有關設備的各種信息。XDATA存儲空間(0x8000–0xFFFF)的較高32KB是一個只讀的閃存代碼區(XBANK),可以使用MEMCTR.XBANK[2:0]位映射到任何一個可用的閃存區。閃存存儲器SRAM和寄存器到XDATA的映射允許DMA控制器和CPU訪問在一個統一的地址空間內的所有物理存儲器。寫入存儲映射中未執行的區域(圖中的陰影部分)沒有影響。從為執行的區域讀出返回0x00。寫只讀區域比如閃存區域將被忽略。23CPU存儲空間SRAM映射到的地址范圍是0x0000到23物理存儲器閃存存儲器:片上閃存存儲器主要是為了保存程序代碼和常量數據。閃存存儲器有以下功能:頁面大小:2KB閃存頁面擦除時間:20ms閃存芯片(批量)擦除時間:20ms閃存寫時間(4字節):20μs數據保留(室溫下):100年編程/擦除次數:20,000次信息頁面是一個2KB的只讀區域,存儲設備信息。其他信息中它包括來自TI地址范圍的一個唯一的IEEE地址。它以最低位優先的形式存儲在XDATA地址0x780C。將出版一個單獨的設計說明,詳細介紹信息頁面的內容。SFR寄存器:特殊功能寄存器(SFR)控制8051CPU內核和/或外設的一些功能。許多8051CPU內核的SFR和標準的8051SFR相同。但是有一些控制功能的另外的SFR,是標準8051中所沒有的。另外的SFR用于和外設單元以及RF收發器接口。24物理存儲器閃存存儲器:片上閃存存儲器主要是為了保存程序代碼和24與端口有關的寄存器寄存器名稱地址描述端口P00x80端口0。可從XDATA(0x7080)只讀。P10x90端口1。可從XDATA(0x7090)只讀。P20xA0端口2。可從XDATA(0x70A0)只讀。寄存器名稱地址描述端口控制寄存器P0SEL0xF3端口0功能選擇(0-通用I/O,1-外圍功能)P1SEL0xF4端口1功能選擇(0-通用I/O,1-外圍功能)P2SEL0xF5端口2功能選擇(0-通用I/O,1-外圍功能)P0INP0x8F端口0輸入模式(0-三態,1-上拉)P1INP0xF6端口1輸入模式(0-三態,1-上拉)P2INP0xF7端口2輸入模式(0-三態,1-上拉)P0DIR0xFD端口0方向選擇(0-輸入,1-輸出)P1DIR0xFE端口1方向選擇(0-輸入,1-輸出)P2DIR0xFF端口2方向選擇(0-輸入,1-輸出)25與端口有關的寄存器寄存器名稱地址描述端P00x8025以下代碼使P1_0引腳電平每隔一定時間反向一次:#include<ioCC2530.h>#defineBLEDP1_0//定義LED為P1_0口控制voidmain(){unsignedintd;P1SEL&=~0x01;//選擇P1_0為通用I/O引腳P1DIR|=0x01;//I/O方向選擇為輸出while(1){for(d=0;d<30000;d++);//延時BLED=~BLED;//電平反向,LED閃爍}}26以下代碼使P1_0引腳電平每隔一定時間反向一次:#inclu26將P1_2設為三態輸入,讀取按鍵狀態#definekeyP0_1P0SEL&=~0X02;//P0_1作為通用I/O口P0DIR&=~0X02;//P0_1輸入P0INP|=0x02;//P0_1上拉ucharkey_scan(void){ if(key==0){//低電平有效 delay(100);//延時消抖動 if(key==0){ ……//處理按鍵事件 while(!key);//直到松開按鍵 } }}27將P1_2設為三態輸入,讀取按鍵狀態#definekey27定時器T1(1)16位遞增或遞減計數器由CLKCON.TICKSPD定義活動時鐘邊沿周期,它設置從0.25MHz到32MHz的不同的時鐘標簽頻率(可以使用32MHzXOSC作為時鐘源)。由T1CTL.DIV設置分頻器值可以從1、8、32或128。因此當32MHz晶振用作系統時鐘源時,定時器1可以使用的最低時鐘頻率是1953.125Hz,最高是32MHz。28定時器T1(1)16位遞增或遞減計數器2828可以通過兩個8位的SFR讀取16位的計數器值:T1CNTH和T1CNTL,分別包含在高位字節和低位字節中。當讀取T1CNTL時,計數器的高位字節在那時被緩沖到T1CNTH,以便高位字節可以從T1CNTH中讀出。因此T1CNTL必須總是在讀取T1CNTH之前首先讀取。對T1CNTL寄存器的所有寫入訪問將復位16位計數器。當達到最終計數值(溢出)時,計數器產生一個中斷請求。可以用T1CTL控制寄存器設置啟動并停止該計數器。當一個不是00值的寫入到T1CTL.MODE時,計數器開始運行。如果00寫入到T1CTL.MODE,計數器停止在它現在的值上。一般來說控制寄存器T1CTL用于控制定時器操作。狀態寄存器T1STAT保存中斷標志。定時器T1(2)29可以通過兩個8位的SFR讀取16位的計數器值:T1CNTH29與定時器1有關的寄存器寄存器名稱地址描述T1CC0L0xDA通道0捕獲/比較值低字節T1CC0H0xDB通道0捕獲/比較值高字節T1CC1L0xDC通道1捕獲/比較值低字節T1CC1H0xDD通道1捕獲/比較值高字節T1CC2L0xDE通道2捕獲/比較值低字節T1CC2H0xDF通道2捕獲/比較值高字節T1CNTL0xE2計數器低字節T1CNTH0xE3計數器高字節T1CTL0xE4控制T1CCTL00xE5通道0捕獲/比較控制T1CCTL10xE6通道1捕獲/比較控制T1CCTL20xE7通道2捕獲/比較控制T1STAT0xAF狀態常用30與定時器1有關的寄存器寄存器名稱地址描述T1CC030T1CTL定時器1的控制和狀態位名稱復位R/W描述7:4-0000RO保留3:2DIV[1:0]00R/W分頻器劃分值。產生主動的時鐘邊緣用來更新計數器,如下:00:標記頻率/101:標記頻率/810:標記頻率/3211:標記頻率/1281:0MODE[1:0]00R/W選擇定時器1模式。定時器操作模式通過下列方式選擇:00:暫停運行。01:自由運行,從0x0000到0xFFFF反復計數10:從0x0000到T1CC0反復計數。11:正計數/倒計數,從0x0000到T1CC0反復計數并且從T1CC0倒計數到0x000031T1CTL定時器1的控制和狀態位名稱復位R/W描31T1STAT定時器1狀態寄存器位名稱復位R/W描述7:6-0R0保留5OVFIF0R/W0定時器1計數器溢出中斷標志。當計數器在自由運行或模模式下達到最終計數值時設置,當在正/倒計數模式下達到零時倒計數。寫1沒有影響。4CH4IF0R/W0定時器1通道4中斷標志。當通道4中斷條件發生時設置。寫1沒有影響。3CH3IF0R/W0定時器1通道3中斷標志。當通道3中斷條件發生時設置。寫1沒有影響。2CH2IF0R/W0定時器1通道2中斷標志。當通道2中斷條件發生時設置。寫1沒有影響。1CH1IF0R/W0定時器1通道1中斷標志。當通道1中斷條件發生時設置。寫1沒有影響。0CH0IF0R/W0定時器0通道0中斷標志。當通道0中斷條件發生時設置。寫1沒有影響。32T1STAT定時器1狀態寄存器位名稱復位R/W描32利用定時器中斷實現指示燈的閃爍#include<ioCC2530.h>#defineuintunsignedint#defineucharunsignedchar#defineRLEDP1_0 //定義LED1為P10口控制#defineYLEDP1_1 //定義LED2為P11口控制uintcounter=0; //統計溢出次數uintLEDFlag; //標志是否要閃爍voidInitialT1test(void)//T1初始化程序{ P1DIR=0x03;//初始化LED控制端口P1,P10P11為輸出 RLED=0; YLED=0; T1CTL=0x05;//初始化計數器1T1STAT=0x21;//通道0,中斷有效,8分頻}//自動重裝模式(0x0000->0xffff)

33利用定時器中斷實現指示燈的閃爍#include<ioCC233利用定時器中斷實現指示燈的閃爍voidmain()//主函數{ InitialT1test();//調用初始化函數while(1){ //查詢溢出 if(IRCON>0){//中斷標志寄存器,其中bit1為T1IFIRCON=0;//清溢出標志counter++;if(counter==15){//中斷計數,約0.25scounter=0;LEDFlag=!LEDFlag;}}if(LEDFlag){ YLED=RLED;RLED=!RLED; //每1sLED燈閃爍一下LEDFlag=!LEDFlag;//閃爍標志變量置0 } }}34利用定時器中斷實現指示燈的閃爍voidmain()//主34串口0使用(初始化)voidinitUARTSEND(void){CLKCONCMD&=~0x40;//設置系統時鐘源為32MHZ晶振while(CLKCONSTA&0x40);//等待晶振穩定CLKCONCMD&=~0x47;//設置系統主時鐘頻率為32MHZPERCFG=0x00; //位置1P0口P0SEL=0x3c;//P0_2,P0_3,P0_4,P0_5用作串口P2DIR&=~0XC0;//P0優先作為UART0U0CSR|=0x80; //UART方式U0GCR|=9; U0BAUD|=59; //波特率設為19200UTX0IF=0;//UART0TX中斷標志初始置位0}函數功能:將系統時鐘設為高速晶振,將P0口設置為串口0功能引腳,串口0使用UART模式,波特率設為19200,允許接收。該函數在使用串口之前調用。CLKCONCMDCLKCONSTAPERCFGU0CSRU0GCRU0BAUDUTX0IF35串口0使用(初始化)voidinitUARTSEND(vo35串口0使用(發送字符串)voidUartTX_Send_String(char*Data,intlen){intj;for(j=0;j<len;j++){U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=0;}}函數功能:串口發送數據,*data為發送緩沖的指針,len為發送數據的長度該函數在初始化串口后才可以正常調用。36串口0使用(發送字符串)voidUartTX_Send_S36#include<ioCC2530.h>#include<string.h>#defineRLEDP1_0//定義控制燈的端口#defineGLEDP1_1charTxdata[25]="XWWKTestData!";voidmain(void){ uchari;P1DIR=0x03;//P1_0,P1_1輸出,控制LED RLED=1; //RLED滅 GLED=0; //GLED亮 initUARTSEND(); UartTX_Send_String(Txdata,25);for(i=0;i<30;i++)Txdata[i]='';strcpy(Txdata,"HELLO");//將UART0TXtest賦給Txdata; while(1){UartTX_Send_String(Txdata,sizeof("HELLO"));//串口發送數據Delay(50000);//延時GLED=!GLED;//GLED閃爍Delay(50000);Delay(50000); }}串口0使用(主函數)37#include<ioCC2530.h>串口0使用(主函數37通過內置溫度傳感器實現溫度采集(初始化)/***********************************************************溫度傳感器初始化函數 ************************************************************/voidinitTempSensor(void){DISABLE_ALL_INTERRUPTS();//關閉所有中斷InitClock();//設置系統主時鐘為32M*((BYTE__xdata*)0x624B)=0x01;//開啟溫度傳感器*((BYTE__xdata*)0x61BD)=0x01;//將溫度傳感器與

//ADC連接起來}voidInitClock(void){CLKCONCMD=0x28;//設定計數器時鐘為1MHz,系統時鐘為32MHzwhile(CLKCONSTA&0x40);//等晶振穩定}#defineDISABLE_ALL_INTERRUPTS()(IEN0=IEN1=IEN2=0x00)38通過內置溫度傳感器實現溫度采集(初始化)/*********38INT8getTemperature(void){UINT8i;UINT16AdcValue;UINT16value;AdcValue=0;for(i=0;i<4;i++){ADC_SINGLE_CONVERSION(ADC_REF_1_25_V|ADC_14_BIT|ADC_TEMP_SENS);//使用1.25V內部電壓,12位分辨率,AD源為溫度傳感器ADC_SAMPLE_SINGLE();//開啟單通道ADCwhile(!ADC_SAMPLE_READY());//等待AD轉換完成value=ADCL>>2;//ADCL寄存器低2位無效value|=(((UINT16)ADCH)<<6);AdcValue+=value;//AdcValue被賦值為4次AD值之和}value=AdcValue>>2;//累加除以4,得到平均值returnADC14_TO_CELSIUS(value);//根據AD值,計算出實際的溫度}通過內置溫度傳感器實現溫度采集(讀AD值)#defineADC_SINGLE_CONVERSION(settings)\do{ADCCON3=(settings);}while(0)#defineADC_SAMPLE_SINGLE()\do{ADC_STOP();ADCCON1|=0x40;}while(0)00HHHHHHADCHLLLLLLXXADCL0000HHHH00LLLLLLHH0000000000HHHHHHLLLLLL#defineADC14_TO_CELSIUS(ADC_VALUE)(((ADC_VALUE)>>4)-335)#defineADC_SAMPLE_READY()\(ADCCON1&0x80)39INT8getTemperature(void){通過內置39voidmain(void){ chari;charTempValue[10]; InitUART0();//初始化串口 initTempSensor();//初始化ADCwhile(1){AvgTemp=0;for(i=0;i<64;i++){AvgTemp+=getTemperature();AvgTemp>>=1;//每次累加后除2.}sprintf(TempValue,(char*)"%dC",(INT8)AvgTemp);UartTX_Send_String(TempValue,4);Delay(50000);}}通過內置溫度傳感器實現溫度采集(主函數)40voidmain(void)通過內置溫度傳感器實現溫度采集40CC2530BasicRF(簡單無線點對點傳輸協議)BasicRF由TI公司提供,它包含了IEEE802.15.4標準的數據包的收發。這個協議只是用來演示無線設備是如何進行數據傳輸的,不包含完整功能的協議。但是它采用了與802.15.4MAC兼容的數據包結構及ACK包結構,其功能限制如下:不提供“多跳”、“設備掃描”及Beacon(信標

)。不提供不同種的網絡設備,如協調器、路由器等,所有節點同級,只實現點對點傳輸。傳輸時會等待信道空閑,但不按802.15.4CSMA-CA要求進行兩次CCA檢測。不重傳數據。簡言之,BasicRF不適合直接用于產品的開發,但可用來進行無線設備數據傳輸的入門學習。41CC2530BasicRF(簡單無線點對點傳輸協議)Ba41BasicRF工作原理(2)啟動創建一個basicRfCfg_t的數據結構,并初始化其中的成員。調用basicRfInit()函數進行協議的初始化。數據發送1.創建一個buffer,把payload放入其中。2.調用basicRfSendPacket()函數發送。數據接收上層通過basicRfPacketIsReady()函數來檢查是否收到一個新的數據包,調用basicRfReceive()函數,把收到的數據復制到buffer中。42BasicRF工作原理(2)啟動4242基于BasicRF的無線燈光控制實驗程序功能是一個基本的點對點通信實驗,實現了一個節點板上的開關控制另一個節點板上的LED的功能。每一個節點是用來做開關還是用來做燈的控制器,可以通過源程序的不同定義進行選擇。可作為一個無線通信的入門級程序。TI例程工程名:cc2530_sw_examples.eww43基于BasicRF的無線燈光控制實驗程序功能4343baseRF通信基本流程1.初始化網絡地址,打開接收機。2.初始化basicRfConfig,確定網絡ID、信道。3.初始化外圍設備,如時鐘、各個I/O口等。4.事件的處理,如發送報文或接受報文后的數據處理等。44baseRF通信基本流程1.初始化網絡地址,打開接收機。444初始化網絡(1)voidmain(void){//射頻配置basicRfConfig.panId=PAN_ID;basicRfConfig.channel=RF_CHANNEL;basicRfConfig.ackRequest=TRUE;//要求接受方應答//IO初始化halBoardInit();//初始化指示燈和按鈕initUART0();//初始化串口//RF初始化if(halRfInit()==FAILED){HAL_ASSERT(FALSE);}45初始化網絡(1)voidmain(void)4545初始化網絡(2)uint8halRfInit(void)//上電設置默認參數

{FRMCTRL0|=(AUTO_ACK|AUTO_CRC);

//推薦的RX設置TXFILTCFG=0x09;//TX過濾器配置寄存器AGCCTRL1=0x15;//AGC控制寄存器FSCAL1=0x00;//調整頻率校準halRfEnableRxInterrupt();//使能RX中斷returnSUCCESS;}voidhalRfEnableRxInterrupt(void){//enableRXPKTDONEinterruptRFIRQM0|=1<<6;

//enablegeneralRFinterruptsIEN2|=1;}FRMCTRL0-幀控制寄存器46初始化網絡(2)uint8halRfInit(void)46事件處理while(1){#ifdefTX_TESTappSwitch();//發送#endif#ifdefRX_TESTappLight();//接收#endif}47事件處理while(1){4747發送函數(按鈕事件)staticvoidappSwitch(){pTxData[0]=LIGHT_TOGGLE_CMD;//開關指示燈的命令

//初始化BasicRFbasicRfConfig.myAddr=SWITCH_ADDR;//設置地址if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}while(TRUE)//主循環{if(halButtonPushed()==HAL_BUTTON_1)//判斷按鈕是否按下{basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);//發送數據函數

halLedToggle(LED_RED);//改變狀態Wait(3);halLedToggle(LED_RED);//改變狀態while(halButtonPushed()==HAL_BUTTON_1);//等待按鈕抬起}}}48發送函數(按鈕事件)staticvoidappSwitc48staticvoidappLight(){//初始化射頻配置basicRfConfig.myAddr=LIGHT_ADDR;//設置地址if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}basicRfReceiveOn();//打開接收while(1)//主循環{while(!basicRfPacketIsReady());if(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0){if(pRxData[0]==LIGHT_TOGGLE_CMD){UartTX_Send_String(UartData,17);//向串口發送測試數據halLedToggle(LED_RED);//改變狀態Wait(3);halLedToggle(LED_RED);//改變狀態}}}}接收函數(點亮LED)49staticvoidappLight()接收函數(點亮L49發送數據包函數(1)uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;if(!txState.receiveOn){//如果沒有打開接收機halRfReceiveOn();}length=min(length,BASIC_RF_MAX_PAYLOAD_SIZE);//包長度halRfWaitTransceiverReady();//等到收發空閑

halRfDisableRxInterrupt();//關閉接收幀完成中斷避免對SPI接口的干擾

mpduLength=basicRfBuildMpdu(destAddr,pPayload,length);halRfWriteTxBuf(txMpdu,mpduLength);halRfEnableRxInterrupt();//打開接收幀ACK接收完成中斷

if(halRfTransmit()!=SUCCESS){//如果發送幀不成功,返回失敗

status=FAILED;}50發送數據包函數(1)uint8basicRfSendPac50發送數據包函數(2)if(pConfig->ackRequest){//等待確認被接受

;//自動進入接收

halMcuWaitUs((12*BASIC_RF_SYMBOL_DURATION)+(BASIC_RF_ACK_DURATION)+(2*BASIC_RF_SYMBOL_DURATION)+10);status=txState.ackReceived?SUCCESS:FAILED;}else{status=SUCCESS;}if(!txState.receiveOn){halRfReceiveOff();//關掉接收機

}if(status==SUCCESS){txState.txSeqNumber++;}returnstatus;}51發送數據包函數(2)if(pConfig->ackRequ51Z-Stack協議棧軟件層次(1)APP用戶應用程序目錄HAL硬件接口層目錄MAC、NWK底層封裝目錄(無源碼)MT串口操作工具目錄OSAL操作系統抽象層目錄ZMAIN協議棧入口目錄ZDO設備對象層管理代碼目錄TOOL工程配置文件目錄(信道、PANID)52Z-Stack協議棧軟件層次(1)APP用戶應用程序目錄52

整個Z-Stack采用分層的軟件結構,硬件抽象層(HAL)提供各種硬件模塊的驅動,包括定時器Timer,通用I/O口GPIO,通用異步收發傳輸器UART,模數轉換ADC的應用程序接口API,提供各種服務的擴展集。操作系統抽象層OSAL實現了一個易用的操作系統平臺,通過時間片輪轉函數實現任務調度,提供多任務處理機制。用戶可以調用OSAL提供的相關API進行多任務編程,將自己的應用程序作為一個獨立的任務來實現。Z-Stack協議棧軟件層次(2)53整個Z-Stack采用分層的軟件結構,硬件抽53工程的選擇設備類型協調器路由器節點設備開發板類型EB 54工程的選擇設備類型5454工程的配置(1)預編譯宏

Z-Stack協議棧的代碼采用了大量的預編譯宏定義來模塊化代碼,以此來節省硬件代碼空間。用戶可以根據具體應用環境適當添加或刪除宏定義。 具體編譯宏由協議棧相關文檔詳細解釋。Project->Options->C/C++Compiler->Preprocessor中查看55工程的配置(1)預編譯宏5555配置文件

在f8wConfig.cfg等配置文件中定義了工程相關的網絡通訊設置。其中比較重要的是和ZigBee通信相關的信道通道的設置,和PANID的設置,用戶可以通過更改該文件中的相關宏定義,來控制ZigBee網絡的通道和PANID。 Project->Options->C/C++Compiler->Preprocessor中查看工程的配置(2)56配置文件工程的配置(2)5656如何使用ZStack——網絡配置(1)1.PANID和Channel(在Tools\f8wConfig.cfg中)ZigBee協議使用一個14位的個域網標志符(PANID)來標識一個網絡。ZStack允許用兩種方式配置PANID,當ZDAPP_CONFIG_PAN_ID值不設置為0xFFFF時,那么設備建立或加入網絡的PANID由ZDAPP_CONFIG_PAN_ID指定;如果設置ZDAPP_CONFIG_PAN_ID為0xFFFF,那么設備就將建立或加入一個“最優”的網絡。-DZDAPP_CONFIG_PAN_ID=0xFFFF

//-DZDAPP_CONFIG_PAN_ID=0x2FFFIEEE802.15.4/ZIGBEE規范在2.4G頻段上規定了16各頻道,用戶可以通過選擇DEFAULT_CHANLIST不同的值選擇不同的頻道,協議默認頻道為0xB即0x00000800。//-DDEFAULT_CHANLIST=0x04000000

//26-0x1A

//-DDEFAULT_CHANLIST=0x02000000

//25-0x19

-DDEFAULT_CHANLIST=0x01000000

//24-0x18

//-DDEFAULT_CHANLIST=0x00800000

//23-0x17

//-DDEFAULT_CHANLIST=0x00400000

//22-0x16

//-DDEFAULT_CHANLIST=0x00200000

//21-0x15

//-DDEFAULT_CHANLIST=0x00100000

//20-0x14

//-DDEFAULT_CHANLIST=0x00080000

//19-0x13

//-DDEFAULT_CHANLIST=0x00040000

//18-0x12

//-DDEFAULT_CHANLIST=0x00020000

//17-0x11

//-DDEFAULT_CHANLIST=0x00010000

//16-0x10

//-DDEFAULT_CHANLIST=0x00008000

//15-0x0F

//-DDEFAULT_CHANLIST=0x00004000

//14-0x0E

//-DDEFAULT_CHANLIST=0x00002000

//13-0x0D

//-DDEFAULT_CHANLIST=0x00001000

//12-0x0C

//-DDEFAULT_CHANLIST=0x00000800

//11-0x0B

57如何使用ZStack——網絡配置(1)1.PANID和C57

2.網絡結構(nwk_globals.h,nwk_globals.c)STACK_PROFILE_ID定義為NETWORK_SPECIFIC、HOME_CONTROLS、BUILDING_AUTOMATION、GENERIC_STAR、GENERIC_TREE中的一個,默認為HOME_CONTROLS,并據此設置MAX_NODE_DEPTH、NWK_MODE等,具體如下:#defineSTACK_PROFILE_ID

HOME_CONTROLS#if(STACK_PROFILE_ID==HOME_CONTROLS)

#defineMAX_NODE_DEPTH

5

#defineNWK_MODE

NWK_MODE_MESH

#defineSECURITY_MODE

SECURITY_RESIDENTIAL

#if

(SECURE!=0

)

#defineUSE_NWK_SECURITY

1

//trueorfalse

#defineSECURITY_LEVEL

5

#else

#defineUSE_NWK_SECURITY

0

//trueorfalse

#defineSECURITY_LEVEL

0

#endif網絡最大設備數設定:#if!defined(NWK_MAX_DEVICE_LIST)

#defineNWK_MAX_DEVICE_LIST

20

//MaximumnumberofdevicesintheAssoc/Devicelist.

#endif如何使用ZStack——網絡配置(2)58

2.網絡結構(nwk_globals.h,nwk_glob58路由器和終端設備數設定:#ifdefined(RTR_NWK)

//changethisifusingadifferentstackprofile...

//Cskiparray

uint16*Cskip;

#if(STACK_PROFILE_ID==HOME_CONTROLS)

byteCskipRtrs[MAX_NODE_DEPTH+1]={6,6,6,6,6,0};

byteCskipChldrn[MAX_NODE_DEPTH+1]={20,20,20,20,20,0};

#elif(STACK_PROFILE_ID==GENERIC_STAR)

byteCskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};

byteCskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};

#elif(STACK_PROFILE_ID==NETWORK_SPECIFIC)

byteCskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};

byteCskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};

#endif//STACK_PROFILE_ID

#endif

//RTR_NWK其中CskipRtrs和CskipChldrn分別為每一級的最大路由器數和最大節點數,前者是后者的子集。如何使用ZStack——網絡配置(3)59路由器和終端設備數設定:如何使用ZStack——網絡配置(359PANIDZigBee協議使用一個16位的個域網標志符(PANID)來標識一個網絡。ZStack允許用兩種方式配置PANID,當ZDAPP_CONFIG_PAN_ID值不設置為0xFFFF時,那么設備建立或加入網絡的PANID由ZDAPP_CONFIG_PAN_ID指定;如果設置ZDAPP_CONFIG_PAN_ID為0xFFFF,那么設備就將建立或加入一個“最優”的網絡。PANID的出現一般是伴隨在,確定信道以后的。PANID其全稱是PersonalAreaNetworkID,網絡的ID(即網絡標識符),是針對一個或多個應用的網絡,用于區分不同的ZigBee網絡,一般是mesh或者clustertree兩種拓撲結構之一。所有節點的panID唯一,一個網絡只有一個PANID,它是由pan協調器生成的,PANID是可選配置項,用來控制ZigBee路由器和終端節點要加入那個網絡。文件f8wConfg.cfg中的ZDO_CONFIG_PAN_ID參數可以設置為一個0~0x3FFF之間的一個值。協調器使用這個值,作為它要啟動的網絡的PANID。而對于路由器節點和終端節點來說只要加入一個已經用這個參數配置了PANID的網絡。如果要關閉這個功能,只要將這個參數設置為0xFFFF。要更進一步控制加入過程,需要修改ZDApp.c文件中的ZDO_NetworkDiscoveryConfirmCB函數。當然,如果ZDAPP_CONFIG_PAN_ID被定義為0xFFFF,那么協調器將根據自身的IEEE地址建立一個隨機的PANID(0~0x3FFF)。60PANIDZigBee協議使用一個16位的個域網標志符(P60Z-Stack協議棧工作流程Z-Stack采用操作系統的思想來構建,采用事件輪循機制,當各層初始化之后,系統進入低功耗模式,當事件發生時,喚醒系統,開始進入中斷處理事件,結束后繼續進入低功耗模式。如果同時有幾個事件發生,判斷優先級,逐次處理事件。

整個Z-stack的主要工作流程,大致分為系統啟動,驅動初始化,OSAL初始化和啟動,進入任務輪循幾個階段。61Z-Stack協議棧工作流程Z-Stack采用操作系統的思想61Z-Stack系統運行流程圖62Z-Stack系統運行流程圖6262主函數例子(即啟動程序)ZSEGintmain(void){osal_int_disable(INTS_ALL);//關閉中斷HAL_BOARD_INIT();//初始化HAL

zmain_vdd_check();//電壓檢測

zmain_ram_init();//初始化stack存儲區

InitBoard(OB_COLD);//初始化板載IO

HalDriverInit();//初始化HAL驅動

osal_nv_init(NULL);//初始化NV系統

zmain_ext_addr();//確定MAC地址

zgInit();//初始化基本NV條目

ZMacInit();//初始化MAC

afInit();//初始化AF

osal_init_system();//初始化操作系統

osal_int_enable(INTS_ALL);//允許中斷

InitBoard(OB_READY);//初始化開發板

zmain_dev_info();//顯示設備信息

zmain_lcd_init();//液晶初始化

osal_start_system();//啟動操作系統

}63主函數例子(即啟動程序)ZSEGintmain(voi63應用程序任務Z-stack的任何一個子系統都作為OSAL的一個任務,因此在開發應用層的時候,必須通過創建OSAL任務來運行應用程序。通過osalInitTasks()函數創建OSAL任務任何OSAL任務必須分為兩步:一是進行任務初始化;二是處理任務事件。64應用程序任務Z-stack的任何一個子系統都作為OSAL的一64OSAL的任務處理

主循環中的兩個關鍵數組*tasksEvents與*tasksArr。tasksEvents存放從序號為0到tasksCnt每個任務在本次循環中是否要被運行,需要運行的任務其值非0,否則為0。tasksArr數組則存放了對應每個任務的入口地址,只有在tasksEvents中記錄的需要運行的任務,在本次循環中才會被調用到。

65OSAL的任務處理主循環中的兩個關鍵數組*tasksEve65Sensor發送數據的函數staticvoidsendReport(void){uint8pData[SENSOR_REPORT_LENGTH];//存放數據的數組staticuint8reportNr=0;uint8txOptions;pData[SENSOR_TEMP_OFFSET]=readTemp();//ReadandreporttemperaturevaluepData[SENSOR_VOLTAGE_OFFSET]=readVoltage();//Readandreportvoltage

valuepData[SENSOR_PARENT_OFFSET]=HI_UINT16(parentShortAddr);pData[SENSOR_PARENT_OFFSET+1]=LO_UINT16(parentShortAddr);//SetACKrequestoneachACK_INTERVALreport//Ifareportfailed,setACKrequestonnextreportif(++reportNr<ACK_REQ_INTERVAL&&reportFailureNr==0){txOptions=AF_TX_OPTIONS_NONE;}else{txOptions=AF_MSG_ACK_REQUEST;reportNr=0;}

//Destinationaddress0xFFFE:Destinationaddressissenttopreviously//establishedbindingforthecommandId.zb_SendDataRequest(0xFFFE,SENSOR_REPORT_CMD_ID,SENSOR_REPORT_LENGTH,pData,0,txOptions,0);}66Sensor發送數據的函數staticvoidsendR66Sensor讀溫度的函數staticint8readTemp(void){staticuint16voltageAtTemp22;staticuint8bCalibrate=TRUE;//Calibratethefirsttimethetempsensorisreaduint16value;int8temp;ATEST=0x01;TR0|=0x01;ADCIF=0;/*ClearADCinterruptflag*/ADCCON3=(HAL_ADC_REF_125V|HAL_ADC_DEC_512|HAL_ADC_CHN_TEMP);while(!ADCIF);/*Waitfortheconversiontofinish*/value=ADCL;/*Gettheresult*/value|=((uint16)ADCH)<<8;value>>=4;//Usethe12MSBofadcValue/*

/*AssumeADC=1480at25CandADC=4/C*/#defineVOLTAGE_AT_TEMP_251480#defineTEMP_COEFFICIENT4temp=22+((value-voltageAtTemp22)/TEMP_COEFFICIENT);if(temp>=100){//Set0Casminimumtemperature,and100Casmaxreturn100;}elseif(temp<=0){return0;}else{returntemp;}}67Sensor讀溫度的函數staticint8readTe67Sensor讀取電壓staticuint8readVoltage(void){uint16value;ADCIF=0;//ClearADCinterruptflag

ADCCON3=(HAL_ADC_REF_125V|HAL_ADC_DEC_128|HAL_ADC_CHN_VDD3);while(!ADCIF);//Waitfortheconversiontofinish

value=ADCL;//Gettheresultvalue|=((uint16)ADCH)<<8;

//valuenowcontainsmeasurementofVdd/3//0indicates0Vand32767indicates1.25V//voltage=(value*3*1.25)/32767volts//wewillmultiplybythisby10toallowunitsof0.1voltsvalue=value>>6;//dividefirstby2^6value=(uint16)(value*37.5);value=value>>9;

//...andlaterby2^9...topreventoverflowduringmultiplicationreturnvalue;}68Sensor讀取電壓staticuint8readVol68696969707070717171727272時鐘控制寄存器CLKCONCMD位名稱復位R/W描述7OSC32K1R/W32kHz時鐘振蕩器選擇。設置該位只能發起一個時鐘源改變。CLKCONSTA.OSC32K反映當前的設置。當要改變該位必須選擇16MHzRCOSC作為系統時鐘。0:32kHzXOSC1:32kHzRCOSC6OSC1R/W系統時鐘源選擇。設置該位只能發起一個時鐘源改變。CLKCONSTA.OSC反映當前的設置。0:32MHzXOSC1:16MHzRCOSC5:3TICKSPD[2:0]001R/W定時器標記輸出設置。不能高于通過OSC位設置的系統時鐘設置。000:32MHz001:16MHz010:8MHz011:4MHz100:2MHz101:1MHz110:500kHz111:250kHz2:0CLKSPD001R/W時鐘速度。不能高于通過OSC位設置的系統時鐘設置。表示當前系統時鐘頻率。000:32MHz001:16MHz010:8MHz011:4MHz100:2MHz101:1MHz110:500kHz111:250kHz73時鐘控制寄存器CLKCONCMD位名稱復位R/W描73時鐘控制狀態寄存器CLKCONSTA位名稱復位R/W描述7OSC32K1R當前選擇的32kHz時鐘源0:32kHzXOSC1:32kHzRCOSC6OSC1R當前選擇的系統時鐘0:32MHzXOSC1:16MHzRCOSC5:3TICKSPD[2:0]001R當前設置的定時器標記輸出000:32MHz100:2MHz001:16MHz101:1MHz010:8MHz110:500kHz011:4MHz111:250kHz2:0CLKSPD001R當前時鐘速度000:32MHz100:2MHz001:16MHz101:1MHz010:8MHz110:500kHz011:4MHz111:250kHz74時鐘控制狀態寄存器CLKCONSTA位名稱復位R/W描74PERCFG(0xF1

溫馨提示

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

評論

0/150

提交評論