该模块采用CC1100是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计。电路主要设定为在315、433、868和915MHz的ISM(工业,科学和医学)和SRD(短距离设备)频率波段,也可以容易地设置为300-348 MHz、400-464 MHz和800-928 MHz的其他频率。RF收发器集成了一个高度可配置的调制解调器。这个调制解调器支持不同的调制格式,其数据传输率可达500kbps。通过开启集成在调制解调器上的前向误差校正选项,能使性能得到提升。CC1100为数据包处理、数据缓冲、突发数据传输、清晰信道评估、连接质量指示和电磁波激发提供广泛的硬件支持。CC1100的主要操作参数和64位传输/接收FIFO(先进先出堆栈)可通过SPI接口控制。在一个典型系统里,。CC1100基于0.18微米CMOS晶体的Chipcon的SmartRF04技术。
AVR程序:
/***************************************************************************************** //函数名:UartInit() //输入:无 //输出:无 //功能描述:串口初始化程序 /*****************************************************************************************/ void UartInit(void) //用232串口发数据到PC,收集数据 { UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收 UBRRL= (F_osc/9600/16-1)%256; UBRRH= (F_osc/9600/16-1)/256; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位 }
void SpiInit(void) { DDRB|=(1<<SPI_DO); DDRB|=(1<<SPI_Clock); DDRB|=(1<<Chip_Select); PORTB|=(1<<SPI_DI); CSN_0; SCK_0; CSN_1; }
/***************************************************************************************** //函数名:CpuInit() //输入:无 //输出:无 //功能描述:SPI初始化程序 /*****************************************************************************************/ void CpuInit(void) { UartInit(); SpiInit(); delay(5000); } //***************************************************************************************** //函数名:SpisendByte(INT8U dat) //输入:发送的数据 //输出:无 //功能描述:SPI发送一个字节 //***************************************************************************************** INT8U SpiTxRxByte(INT8U dat) { INT8U i,temp; temp = 0; SCK_0; for(i=0; i<8; i++) { if(dat & 0x80) { MOSI_1; } else MOSI_0; dat <<= 1;
SCK_1; _nop_(); _nop_();
temp <<= 1; if(MISO)temp++; SCK_0; _nop_(); _nop_(); } return temp; }
//***************************************************************************************** //函数名:void RESET_CC1100(void) //输入:无 //输出:无 //功能描述:复位CC1100 //***************************************************************************************** void RESET_CC1100(void) { CSN_0; while (GDO0); SpiTxRxByte(CCxxx0_SRES); //写入复位命令 while (GDO0); CSN_1; }
//***************************************************************************************** //函数名:void POWER_UP_RESET_CC1100(void) //输入:无 //输出:无 //功能描述:上电复位CC1100 //***************************************************************************************** void POWER_UP_RESET_CC1100(void) { CSN_1; halWait(1); CSN_0; halWait(1); CSN_1; halWait(41); RESET_CC1100(); //复位CC1100 }
//***************************************************************************************** //函数名:void halSpiWriteReg(INT8U addr, INT8U value) //输入:地址和配置字 //输出:无 //功能描述:SPI写寄存器 //***************************************************************************************** void halSpiWriteReg(INT8U addr, INT8U value) { CSN_0; while (GDO0); SpiTxRxByte(addr); //写地址 SpiTxRxByte(value); //写入配置 CSN_1; }
//***************************************************************************************** //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count) //输入:地址,写入缓冲区,写入个数 //输出:无 //功能描述:SPI连续写配置寄存器 //***************************************************************************************** void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count) { INT8U i, temp; temp = addr | WRITE_BURST; CSN_0; while (GDO0); SpiTxRxByte(temp); for (i = 0; i < count; i++) { SpiTxRxByte(buffer); } CSN_1; }
//***************************************************************************************** //函数名:void halSpiStrobe(INT8U strobe) //输入:命令 //输出:无 //功能描述:SPI写命令 //***************************************************************************************** void halSpiStrobe(INT8U strobe) { CSN_0; while (GDO0); SpiTxRxByte(strobe); //写入命令 CSN_1; }
//***************************************************************************************** //函数名:INT8U halSpiReadReg(INT8U addr) //输入:地址 //输出:该寄存器的配置字 //功能描述:SPI读寄存器 //***************************************************************************************** INT8U halSpiReadReg(INT8U addr) { INT8U temp, value; temp = addr|READ_SINGLE;//读寄存器命令 CSN_0; while (GDO0); SpiTxRxByte(temp); value = SpiTxRxByte(0); CSN_1; return value; }
//***************************************************************************************** //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count) //输入:地址,读出数据后暂存的缓冲区,读出配置个数 //输出:无 //功能描述:SPI连续写配置寄存器 //***************************************************************************************** void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count) { INT8U i,temp; temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令 CSN_0; while (GDO0); SpiTxRxByte(temp); for (i = 0; i < count; i++) { buffer = SpiTxRxByte(0); } CSN_1; }
//***************************************************************************************** //函数名:INT8U halSpiReadReg(INT8U addr) //输入:地址 //输出:该状态寄存器当前值 //功能描述:SPI读状态寄存器 //***************************************************************************************** INT8U halSpiReadStatus(INT8U addr) { INT8U value,temp; temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令 CSN_0; while (GDO0); SpiTxRxByte(temp); value = SpiTxRxByte(0); CSN_1; return value; }
//***************************************************************************************** //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings) //输入:无 //输出:无 //功能描述:配置CC1100的寄存器 //***************************************************************************************** void halRfWriteRfSettings(void) { //halSpiWriteReg(CCxxx0_FIFOTHR,0x09); //halSpiWriteReg(CCxxx0_MCSM1,0x00); //CCA,没有作通 halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的 // Write register settings halSpiWriteReg(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_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); }
//***************************************************************************************** //函数名: //输入: //输出: //功能描述:CC1100发送主叫数据 //***************************************************************************************** void halRfSendPacket(INT8U *txBuffer, INT8U size) { halSpiWriteReg(CCxxx0_TXFIFO, size+2); halSpiWriteReg(CCxxx0_TXFIFO, ID_Opponent); halSpiWriteReg(CCxxx0_TXFIFO, ID_Oneself);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据 halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据 // Wait for GDO0 to be set - > sync transmitted while (!GDO0); // Wait for GDO0 to be set - > sync transmitted while (GDO0); halSpiStrobe(CCxxx0_SFTX); //清洗发送缓冲区 }
相关链接:http://auction1.taobao.com/auction/item_detail-0db2-f6ab401993e4825ab22c47438b30f5dd.jhtml |
|