3.設置網絡短地址可能同一個工程需要設置多個網絡短地址。三.數據發送:1.準備工作:(1)確保接收緩沖區是空的(2)清接收標志(3)等待射頻發送準備好(4)確保發送隊列是空的(5)清發送標志位2.將待發送數據存入發送緩沖區。cc2530一塊RAM,但是分成兩部分,一部分是發送,另一部分是接收。都作為緩沖區。分別是128字節。然后只要通過PFD寄存器就可以將數據寫入到發送緩沖區。只要接收到數據,都是先存放到接收緩沖區,然后取出來即可得到無線傳送的數據。2530會自動發送兩個字節的校驗碼加在待發送數據后面。3.啟動發送命令4.等待發送完成5.清發送完成標志位
四.數據接收1.關總中斷2.判斷接收情況(1)自己DIY的接收處理函數----》關閉接收完成中斷----》關閉RF中斷----》開啟總中斷,以上三步使得它能夠在一次RF中斷連續讀取數據,直到數據讀取完成,否則讀一個字節完成一次中斷。----》讀取第一個字節作為數據包長度控制讀取的循環次數----》繼續循環讀取PFD寄存器,取出后面的數據,包括最后兩個字節的校驗碼。----》判斷指定位置的數據是否自己要的命令。進行相應的處理----》讀取完成,關總中斷----》開啟接收完成中斷----》開啟RF中斷(2)清除RF中斷標志(3)清除接收完成中斷3.稍作延時4.清空接收緩沖器5.開啟接收使能6.開總中斷
五.注意:1.發送格式char SendPacket[]={0x0C,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,LIGHTCMD,0};是不能隨意改動的,它遵循一定的協議。第一個字節0x0C可以改動,他表示你要發送的數據長度,所以可以改動。你要想增加發送內容,要在LIGHTCMD這個宏定義后面假數據,最后一位0不可以省略,也就是說,第一個字節是你要發送的數據包長度,可改動,中間有9個固定的數據,,0x07,0x20,表示PANID。0xEF,0xBE表示接收地址,0x20,0x50表示發送地址。第十個開始是你自己要發送的數據,最后一個是0。當然第一個表示長度的字節不算在內2.實質上上述格式是802.15.4協議的一種。2530的協議是底層基于這個協議類型的。否則不能收發數據。新版筆記:1、Zigbee無線通信,需要高頻的載波來提供發射效率,Zigbee模塊之間要可以正常的收發,接收模塊必須把接收頻率設置和發射模塊的載波頻率一致。2、Zigbee有27個載波可以進行通信,載波叫做信道(無線通信的通道)。這些載波的頻率落在某些頻率區段,我們把這些區段叫做頻段。 2.4G頻段 16個信道 915M頻段 896M頻段 11個信道 但TI的所有支持Zigbee底層協議的芯片只能在2.4G頻段的16個信道里進行通信。 11 2405M 12 2410M .. 26 2480M3 網絡地址 在Zigbee無線局域網里,每一模塊都一個在該網絡里唯一的2個字節的地址,這個地址叫做網絡地址,網絡短地址。4 PANID 這是一個2個字節的編碼,用來區別不同的Zigbee無線局域網,個域網ID.無線數據包的內容#define SENDVAL 5char SendPacket[]={0x0C,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};抓包工具USBDonglechar SendPacket[]={0x19,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,'h','e','l','l','o',' ','l','a','o',' ','d','a','/r','/n'};802.15.4 Zigbee底層協議,硬件必須要支持
發送程序:#include<ioCC2530.h>#include"74LS164_8LED.h"#define SENDVAL 5char SendPacket[]={0x19,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,'h','e','l','l','o',' ','l','a','o',' ','d','a','/r','/n'};//第一個字節0x0C含義,這個自己后面還有12個字節要發送//第5 6個字節表示的是PANID//第7 8個字節是無線模塊目標設備的網絡地址 0xBEEF//第9 10就是本地模塊的網絡地址//第11 個字節是我們有用的數據// CRC碼 12 13個字節 是硬件自動追加void Delay(){ int y,x; for(y=1000;y>0;y--) for(x=30;x>0;x--);}void Init32M(){ SLEEPCMD &=0xFB;//1111 1011 開啟2個高頻時鐘源 while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M穩定 Delay(); CLKCONCMD &=0xF8;//1111 1000 不分頻輸出 CLKCONCMD &=0XBF;//1011 1111 設置32M作為系統主時鐘 while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成為當前系統主時鐘}void KeysIntCfg(){//Key3 Key4 Key5 IEN2|=0x10;//開P1IE組中斷 P1IEN|=0x02;//開Key3組內中斷 PICTL|=0x02;//設置P1_1為下降沿 EA=1; //開總中斷}void halRfInit(void){ EA=0; FRMCTRL0 |= 0x60; // Recommended RX settings TXFILTCFG = 0x09; AGCCTRL1 = 0x15; FSCAL1 = 0x00; // enable RXPKTDONE interrupt RFIRQM0 |= 0x40;//把射頻接收中斷打開 // enable general RF interrupts IEN2 |= 0x01; FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING); //設置載波為2475M PAN_ID0=0x07; PAN_ID1=0x20; //0x2007//halRfRxInterruptConfig(basicRfRxFrmDoneIsr); RFST = 0xEC;//清接收緩沖器 RFST = 0xE3;//開啟接收使能 EA=1;}void RFSend(char *pstr,char len){ char i; RFST = 0xEC; //確保接收是空的 RFST = 0xE3; //清接收標志位 while (FSMSTAT1 & 0x22);//等待射頻發送準備好 RFST = 0xEE;//確保發送隊列是空 RFIRQF1 &= ~0x02;//清發送標志位//為數據發送做好準備工作 for(i=0;i<len;i++) { RFD=pstr[i]; } //循環的作用是把我們要發送的數據全部壓到發送緩沖區里面 RFST = 0xE9; //這個寄存器一旦被設置為0xE9,發送緩沖區的數據就被發送出去 while(!(RFIRQF1 & 0x02) );//等待發送完成 RFIRQF1 = ~0x02;//清發送完成標志}void main(){ LS164_Cfg();//74LS164控制數碼管的初始化 Init32M(); //主時鐘晶振工作在32M KeysIntCfg(); halRfInit();//無線通信的初始化 初始化相關的寄存器,配置工作信道,和PANID SHORT_ADDR0=0x50; SHORT_ADDR1=0x20;//設置本模塊地址 設置本模塊的網絡地址0x2050 //大小端模式問題, LS164_BYTE(1); while(1);}#PRagma vector=P1INT_VECTOR__interrupt void Key3_ISR() //P1_1{ if(0x02 & P1IFG) { Delay(); if(0==P1_1) { P1DIR |=0X01; P1_0 ^=1; RFSend(SendPacket,24); } } P1IFG=0; P1IF=0;}#pragma vector=RF_VECTOR__interrupt void RF_IRQ(void){//這個是射頻中斷函數,當小燈模塊接收到開關模塊發送來的數據時,小燈模塊的CPU就會進入中斷函數執行 EA=0; if( RFIRQF0 & 0x40 ) { RFIRQF0&= ~0x40; // Clear RXPKTDONE interrupt } S1CON= 0; // Clear general RF interrupt flag RFST = 0xEC;//清接收緩沖器 RFST = 0xE3;//開啟接收使能 EA=1;}接收程序:#include<ioCC2530.h>#include"74LS164_8LED.h"void Delay(){ int y,x; for(y=1000;y>0;y--) for(x=30;x>0;x--);}void Init32M(){ SLEEPCMD &=0xFB;//1111 1011 開啟2個高頻時鐘源 while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M穩定 Delay(); CLKCONCMD &=0xF8;//1111 1000 不分頻輸出 CLKCONCMD &=0XBF;//1011 1111 設置32M作為系統主時鐘 while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成為當前系統主時鐘}void Uart0_Cfg(){ PERCFG &=0xFE;//把這個寄存器的第零位強行清零 1111 1110 //就是把串口0的腳位置配置在備用位置1 即P0_2 P0_3 P0SEL |=0x0C;//讓P0_2 P0_3這兩個腳工作在片上外設模式,而不是普通IO口 0000 1100 U0CSR |=0xC0; U0UCR =0; //串口0 典型的串口配置 校驗位 停止位之類的東西 U0GCR =11; U0BAUD =216;//就是重官方數據手冊中波特率表格中參照115200時的 配置值,前提是系統時鐘在32M IEN0 |=0x04; //開接收數據的中斷 0000 0100 EA=1;}void Uart0SendByte(char SendByte){ U0DBUF=SendByte; //把我們收到的數據通過串口再返回發出去 while(UTX0IF==0); UTX0IF=0;}void halRfInit(void){ EA=0; FRMCTRL0 |= 0x60; // Recommended RX settings TXFILTCFG = 0x09; AGCCTRL1 = 0x15; FSCAL1 = 0x00; // enable RXPKTDONE interrupt RFIRQM0 |= 0x40; // enable general RF interrupts IEN2 |= 0x01; FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING); PAN_ID0=0x07; PAN_ID1=0x20;//halRfRxInterruptConfig(basicRfRxFrmDoneIsr); RFST = 0xEC;//清接收緩沖器 RFST = 0xE3;//開啟接收使能 EA=1;}void main(){ LS164_Cfg();//74LS164控制數碼管的初始化 Init32M(); //主時鐘晶振工作在32M halRfInit(); Uart0_Cfg(); SHORT_ADDR0=0xEF; SHORT_ADDR1=0xBE;//設置本模塊地址 0xBEEF LS164_BYTE(2); while(1);}void RevRFProc(){ static char len; static char ch; static char Alllen; len=ch=0; RFIRQM0 &= ~0x40; IEN2 &= ~0x01; EA=1; len=RFD;//讀第一個字節判斷這一串數據后面有幾個字節; //len=0x0C 12 Alllen=len; while (len>0) {//只要后面還有數據那么就把他都從接受緩沖區取出來 ch=RFD; if(3==len) {//如果倒數第三個字節等于7,那么我們把LED0取反 LS164_BYTE(ch); } if((len>=3)&&(Alllen-len>=9)) { Uart0SendByte(ch); } len--; } EA=0; // enable RXPKTDONE interrupt RFIRQM0 |= 0x40; // enable general RF interrupts IEN2 |= 0x01;}#pragma vector=RF_VECTOR__interrupt void RF_IRQ(void){//這個是射頻中斷函數,當小燈模塊接收到開關模塊發送來的數據時,小燈模塊的CPU就會進入中斷函數執行 EA=0; if( RFIRQF0 & 0x40 ) { RevRFProc(); RFIRQF0&= ~0x40; // Clear RXPKTDONE interrupt } S1CON= 0; // Clear general RF interrupt flag RFST = 0xEC;//清接收緩沖器 RFST = 0xE3;//開啟接收使能 EA=1;}補充內容:1、Zigbee無線通信,需要高頻的載波來提供發射效率,Zigbee模塊之間要可以正常的收發,接收模塊必須把接收頻率設置和發射模塊的載波頻率一致。2、Zigbee有27個載波可以進行通信,載波叫做信道(無線通信的通道)。這些載波的頻率落在某些頻率區段,我們把這些區段叫做頻段。 2.4G頻段 16個信道 915M頻段 896M頻段 11個信道 但TI的所有支持Zigbee底層協議的芯片只能在2.4G頻段的16個信道里進行通信。 11 2405M 12 2410M .. 26 2480M3 網絡地址 在Zigbee無線局域網里,每一模塊都一個在該網絡里唯一的2個字節的地址,這個地址叫做網絡地址,網絡短地址。4 PANID 這是一個2個字節的編碼,用來區別不同的Zigbee無線局域網,個域網ID.無線數據包的內容#define SENDVAL 5char SendPacket[]={0x0C,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};抓包工具USBDonglechar SendPacket[]={0x19,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,'h','e','l','l','o',' ','l','a','o',' ','d','a','/r','/n'};802.15.4 Zigbee底層協議,硬件必須要支持
新聞熱點
疑難解答