STC89C52单片机驱动CC1101无线模块的接收C语言程序 作者: 时间:2016-11-30 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count){INT8U i,temp;temp = addr | READ_BURST;//写入要读的配置寄存器地址和读命令CSN = 0;while (MISO);SpiTxRxByte(temp); for (i = 0; i < count; i++){buffer[i] = SpiTxRxByte(0);}CSN = 1;}//******************************//函数名:INT8U halSpiReadReg(INT8U addr)//输入:地址//输出:该状态寄存器当前值//功能描述:SPI读状态寄存器//*******************************INT8U halSpiReadStatus(INT8U addr){INT8U value,temp;temp = addr | READ_BURST;//写入要读的状态寄存器的地址同时写入读命令CSN = 0;while (MISO);SpiTxRxByte(temp);value = SpiTxRxByte(0);CSN = 1;return value;}//*********************************//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)//输入:无//输出:无//功能描述:配置CC1100的寄存器//********************************void halRfWriteRfSettings(void){halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);// Write register settingshalSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);halSpiWriteReg(CCxxx0_DEVIATN, rfSettings.DEVIATN);halSpiWriteReg(CCxxx0_FREND1, rfSettings.FREND1);halSpiWriteReg(CCxxx0_FREND0, rfSettings.FREND0);halSpiWriteReg(CCxxx0_MCSM0 , rfSettings.MCSM0 );halSpiWriteReg(CCxxx0_FOCCFG, rfSettings.FOCCFG);halSpiWriteReg(CCxxx0_BSCFG, rfSettings.BSCFG);halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);halSpiWriteReg(CCxxx0_FSCAL3, rfSettings.FSCAL3);halSpiWriteReg(CCxxx0_FSCAL2, rfSettings.FSCAL2);halSpiWriteReg(CCxxx0_FSCAL1, rfSettings.FSCAL1);halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0); halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);}//**********************************************//函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)//输入:发送的缓冲区,发送数据个数//输出:无//功能描述:CC1100发送一组数据//*****************************************void halRfSendPacket(INT8U *txBuffer, INT8U size){halSpiWriteReg(CCxxx0_TXFIFO, size);halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);//写入要发送的数据halSpiStrobe(CCxxx0_STX);//进入发送模式发送数据// Wait for GDO0 to be set -> sync transmittedwhile (!GDO0);// Wait for GDO0 to be cleared -> end of packetwhile (GDO0);halSpiStrobe(CCxxx0_SFTX);}void setRxMode(void){halSpiStrobe(CCxxx0_SRX);//进入接收状态}//---------------------------------------------------------------------------INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length){INT8U status[2];INT8U packetLength;INT8U i=(*length)*4; // 具体多少要根据datarate和length来决定halSpiStrobe(CCxxx0_SRX);//进入接收状态//delay(5);//while (!GDO1);//while (GDO1);delay(2);while (GDO0){delay(2);--i;if(i<1)return 0; }if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0{packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度{halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据*length = packetLength;//把接收数据长度的修改为当前数据的长度// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位halSpiStrobe(CCxxx0_SFRX);//清洗接收缓冲区return (status[1] & CRC_OK);//如果校验成功返回接收成功}else{*length = packetLength;halSpiStrobe(CCxxx0_SFRX);//清洗接收缓冲区return 0;}}elsereturn 0;}//*****************************************************************************************void disdignit(){char i;if(temp[0]){for(i=0;i<3;i++){P0=0xC6;led0=0;delay1(40);led0=1;P0=seg[temp[1]];led1=0;delay1(40);led1=1;P0=seg1[temp[5]];led2=0;delay1(40);led2=1;P0=seg[temp[4]];led3=0;delay1(40);led3=1;}}}//********************************************************************************void StartUART( void ){ //波特率4800SCON = 0x50;TMOD = 0x20;TH1 = 0xFA;TL1 = 0xFA;PCON = 0x00;TR1 = 1;}void R_S_Byte(INT8U R_Byte){SBUF = R_Byte; while( TI == 0 );//查询法TI = 0;}void main(void){INT8U i,leng =0;INT8U RxBuf[8]={0};// 8字节, 如果需要更长的数据包,请正确设置CpuInit();POWER_UP_RESET_CC1100();halRfWriteRfSettings();halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);//发射功率设置delay(6000);StartUART();while(1){leng =4; // 预计接受8 bytesif(halRfReceivePacket(RxBuf,&leng)) //判断是否接收到数据{temp[0]=RxBuf[3]; //符号位temp[2]=((RxBuf[2]<<4)|RxBuf[1]);//整数位temp[1]=RxBuf[0];//小数位temp[4]=RxBuf[2];//十位temp[5]=RxBuf[1];/*for(i=0;i<3;i++){R_S_Byte(temp[2-i]);delay(100);} */disdignit();disdignit();R_S_Byte(t);disdignit();disdignit();disdignit();R_S_Byte(0x30+temp[4]);R_S_Byte(0x30+temp[5]);R_S_Byte(.);R_S_Byte(0x30+temp[1]);disdignit();disdignit();}if(temp[2]>=0x30)//大于30度时报警,0x30转换成10进制为48{BELL=0; //打开蜂明器}else{BELL=1; //关闭蜂明器}}} 上一页 1 2 3 下一页
评论