国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

06 無線通信概念

2019-11-08 20:09:27
字體:
來源:轉載
供稿:網友
一.基本概念:1.射頻通信:(1)發送:必須將數據脫載在高頻載波上發送出去,才能提高發送效率。(2)接收:和發送端在同一個高頻載波頻段,將高頻信號去掉,抽離出數據。(3)ZigBee工作在2.4G頻段。由于是頻段,所以引出了信道的概念。這個頻段是16個信道,每增加5MHz是一個信道。從2405,對應11信道,依次增加,一直到2480,對應26信道。收發信道要一致。2.網絡(短)地址:兩個字節,由于ZigBee組成網絡以后類似于以太網的局域網,在同一個局域網里面,每臺PC都有唯一的一個ip地址。所以我們ZigBee組成的網絡里面,每一個ZigBee模塊也有唯一的網絡短地址。3.PANID:也就是常說的個域網ID。 由于可能在同一個場合存在很多個網絡,為了區分不同的網絡組,就用到了個域網ID,可以理解為網絡組編號。二.系統初始化:1.板級資源初始化2.射頻初始化(1)關總中斷(2)推薦配置(3)開射頻中斷(4)設置信道(5)設置PANID(6)清空接收緩沖器(7)開啟接收使能(8)打開總中斷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底層協議,硬件必須要支持
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈巴河县| 河北区| 阿拉善左旗| 揭东县| 天祝| 南雄市| 洛川县| 政和县| 桐庐县| 辽宁省| 彭阳县| 公主岭市| 杭锦旗| 乐平市| 临朐县| 剑阁县| 和林格尔县| 邵阳县| 来宾市| 舒城县| 镇巴县| 南陵县| 横山县| 萨迦县| 抚州市| 东光县| 宜宾县| 全南县| 天长市| 青阳县| 如东县| 交口县| 平南县| 攀枝花市| 通城县| 福建省| 龙门县| 东丽区| 大悟县| 巴里| 土默特左旗|