您好,欢迎访问三七文档
#includeioCC2530.h#includestdio.h#includestring.h#defineLED1P1_0//接收标志#defineLED2P1_1//接收标志charrf_rx_buf[128];//收发缓冲区/******************************串口设置******************************/charserial_rxbuf[128];//串口接收缓冲区intserial_rxpos=0;intserial_rxlen=0;charis_serial_receive=0;/******************************串口初始化******************************/voiduart0_init(){PERCFG=0x00;//UART0选择位置0TX@P0.3RX@P0.2P0SEL|=0x0C;//P0.3P0.2选择外设功能U0CSR|=0xC0;//UART模式接收器使能U0GCR|=11;//查表获得U0GCR和U0BAUDU0BAUD=216;//115200UTX0IF=1;URX0IE=1;//使能接收中断IEN0@BIT2}/******************************串口发送字符******************************/intputchar(intc){while(!UTX0IF);UTX0IF=0;U0DBUF=c;returnc;}voiduart0_sendbuf(char*pbuf,intlen){for(inti=0;ilen;i++){while(!UTX0IF);UTX0IF=0;U0DBUF=*pbuf;pbuf++;}}voiduart0_flush_rxbuf(){serial_rxpos=0;serial_rxlen=0;}/******************************无线RF初始化******************************/voidrf_init(){TXPOWER=0xD5;//发射功率为1dBmCCACTRL0=0xF8;//推荐值smartRF软件生成FRMFILT0=0x0C;//静止接收过滤,即接收所有数据包FSCAL1=0x00;//推荐值smartRF软件生成TXFILTCFG=0x09;AGCCTRL1=0x15;AGCCTRL2=0xFE;TXFILTCFG=0x09;//推荐值smartRF软件生成FREQCTRL=0x0B;//选择通道11RFIRQM0|=(16);//使能RF数据包接收中断IEN2|=(10);//使能RF中断RFST=0xED;//清除RF接收缓冲区ISFLUSHRXRFST=0xE3;//RF接收使能ISRXON}/******************************无线RF接收*****************************/voidrf_receive_isr(){intrf_rx_len=0;intrssi=0;charcrc_ok=0;rf_rx_len=RFD-2;//长度去除两字节附加结果rf_rx_len&=0x7F;for(inti=0;irf_rx_len;i++){rf_rx_buf[i]=RFD;//连续读取接收缓冲区内容}rssi=RFD-73;//读取RSSI结果crc_ok=RFD;//读取CRC校验结果BIT7RFST=0xED;//清除接收缓冲区if(crc_ok&0x80){uart0_sendbuf(rf_rx_buf,rf_rx_len);//串口发送printf([%d],rssi);}else{printf(\r\nCRCError\r\n);}}/******************************中断初始化******************************/voidtimer1_init(){T1CTL=0x0C;//@DIV分频系数128@MODE暂停运行T1CCTL0=0x44;//@IM通道0中断使能@MODE比较匹配模式T1STAT=0x00;//清除所有中断标志T1IE=1;//IEN1@BIT1使能定时器1中断T1CC0L=250;//溢出周期为2msT1CC0H=0;}voidtimer1_disbale(){T1CTL&=~(11);//恢复为停止模式}voidtimer1_enable(){T1CTL|=(11);//改变模式为比较匹配模式MODE=0x10;T1STAT=0x00;//清除中断标志位T1CNTH=0;//重新开始计数T1CNTL=0;}/******************************主程序******************************/voidmain(void){P1DIR|=(10)|(11);//P1.0输出LED1=0;LED2=0;EA=0;//暂时关闭全局中断SLEEPCMD&=~0x04;//设置系统时钟为32MHzwhile(!(SLEEPSTA&0x40));CLKCONCMD&=~0x47;SLEEPCMD|=0x04;uart0_init();//串口初始化115200timer1_init();//定时器初始化2ms比较匹配rf_init();//RF初始化无帧过滤EA=1;//使能全局中断printf(IDxukai871105\r\n);printf(Email:xukai19871105@126.com\r\n);while(1){}}/******************************串口中断程序******************************/#pragmavector=URX0_VECTOR__interruptvoidUART0_ISR(void){URX0IF=0;//清除接收中断标志serial_rxbuf[serial_rxpos]=U0DBUF;//填充缓冲区serial_rxpos++;serial_rxlen++;timer1_enable();//定时器重新开始计数}/******************************定时器中断******************************/#pragmavector=T1_VECTOR__interruptvoidTimer1_ISR(void){T1STAT&=~(10);//清除定时器T1通道0中断标志is_serial_receive=1;//串口数据到达timer1_disbale();}/******************************无线RF中断******************************/#pragmavector=RF_VECTOR__interruptvoidrf_isr(void){LED1^=1;//LED1翻转提示作用EA=0;//接收到一个完整的数据包if(RFIRQF0&(16)){rf_receive_isr();//调用接收中断处理函数S1CON=0;//清除RF中断标志RFIRQF0&=~(16);//清除RF接收完成数据包中断}EA=1;}
本文标题:ZigBee接收
链接地址:https://www.777doc.com/doc-2829809 .html