该模块采用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技术。<br /><br />AVR程序:<br /><br />/*****************************************************************************************<br />//函数名:UartInit()<br />//输入:无<br />//输出:无<br />//功能描述:串口初始化程序<br />/*****************************************************************************************/<br />void UartInit(void) //用232串口发数据到PC,收集数据<br /> {<br /> UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收<br /> UBRRL= (F_osc/9600/16-1)%256;<br /> UBRRH= (F_osc/9600/16-1)/256;<br /> UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位<br /> }<br /><br /><br />void SpiInit(void)<br />{<br /> DDRB|=(1<<SPI_DO);<br /> DDRB|=(1<<SPI_Clock);<br /> DDRB|=(1<<Chip_Select);<br /> <br /> PORTB|=(1<<SPI_DI);<br /> <br /> <br /> CSN_0;<br /> SCK_0;<br /> CSN_1;<br />}<br /><br />/*****************************************************************************************<br />//函数名:CpuInit()<br />//输入:无<br />//输出:无<br />//功能描述:SPI初始化程序<br />/*****************************************************************************************/<br />void CpuInit(void)<br />{<br /> UartInit();<br /> <br /> SpiInit();<br /> delay(5000);<br />}<br /> <br />//*****************************************************************************************<br />//函数名:SpisendByte(INT8U dat)<br />//输入:发送的数据<br />//输出:无<br />//功能描述:SPI发送一个字节<br />//*****************************************************************************************<br />INT8U SpiTxRxByte(INT8U dat)<br />{<br /> INT8U i,temp;<br /> temp = 0;<br /> <br /> SCK_0;<br /> for(i=0; i<8; i++)<br /> {<br /> if(dat & 0x80)<br /> {<br /> MOSI_1;<br /> }<br /> else MOSI_0;<br /> dat <<= 1;<br /><br /> SCK_1;<br /> _nop_();<br /> _nop_();<br /><br /> temp <<= 1;<br /> if(MISO)temp++;<br /> SCK_0;<br /> _nop_();<br /> _nop_(); <br /> }<br /> return temp;<br />}<br /><br />//*****************************************************************************************<br />//函数名:void RESET_CC1100(void)<br />//输入:无<br />//输出:无<br />//功能描述:复位CC1100<br />//*****************************************************************************************<br />void RESET_CC1100(void)<br />{<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(CCxxx0_SRES); //写入复位命令<br /> while (GDO0);<br /> CSN_1;<br />}<br /><br />//*****************************************************************************************<br />//函数名:void POWER_UP_RESET_CC1100(void)<br />//输入:无<br />//输出:无<br />//功能描述:上电复位CC1100<br />//*****************************************************************************************<br />void POWER_UP_RESET_CC1100(void)<br />{<br /> CSN_1;<br /> halWait(1);<br /> CSN_0;<br /> halWait(1);<br /> CSN_1;<br /> halWait(41);<br /> RESET_CC1100(); //复位CC1100<br />}<br /><br />//*****************************************************************************************<br />//函数名:void halSpiWriteReg(INT8U addr, INT8U value)<br />//输入:地址和配置字<br />//输出:无<br />//功能描述:SPI写寄存器<br />//*****************************************************************************************<br />void halSpiWriteReg(INT8U addr, INT8U value)<br />{<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(addr); //写地址<br /> SpiTxRxByte(value); //写入配置<br /> CSN_1;<br />}<br /><br />//*****************************************************************************************<br />//函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)<br />//输入:地址,写入缓冲区,写入个数<br />//输出:无<br />//功能描述:SPI连续写配置寄存器<br />//*****************************************************************************************<br />void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)<br />{<br /> INT8U i, temp;<br /> temp = addr | WRITE_BURST;<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(temp);<br /> for (i = 0; i < count; i++)<br /> {<br /> SpiTxRxByte(buffer);<br /> }<br /> CSN_1;<br />}<br /><br />//*****************************************************************************************<br />//函数名:void halSpiStrobe(INT8U strobe)<br />//输入:命令<br />//输出:无<br />//功能描述:SPI写命令<br />//*****************************************************************************************<br />void halSpiStrobe(INT8U strobe)<br />{<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(strobe); //写入命令<br /> CSN_1;<br />}<br /><br /> <br /><br /> <br /><br />//*****************************************************************************************<br />//函数名:INT8U halSpiReadReg(INT8U addr)<br />//输入:地址<br />//输出:该寄存器的配置字<br />//功能描述:SPI读寄存器<br />//*****************************************************************************************<br />INT8U halSpiReadReg(INT8U addr)<br />{<br /> INT8U temp, value;<br /> temp = addr|READ_SINGLE;//读寄存器命令<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(temp);<br /> value = SpiTxRxByte(0);<br /> CSN_1;<br /> return value;<br />}<br /><br /><br />//*****************************************************************************************<br />//函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)<br />//输入:地址,读出数据后暂存的缓冲区,读出配置个数<br />//输出:无<br />//功能描述:SPI连续写配置寄存器<br />//*****************************************************************************************<br />void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)<br />{<br /> INT8U i,temp;<br /> temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(temp); <br /> for (i = 0; i < count; i++)<br /> {<br /> buffer = SpiTxRxByte(0);<br /> }<br /> CSN_1;<br />}<br /><br /><br />//*****************************************************************************************<br />//函数名:INT8U halSpiReadReg(INT8U addr)<br />//输入:地址<br />//输出:该状态寄存器当前值<br />//功能描述:SPI读状态寄存器<br />//*****************************************************************************************<br />INT8U halSpiReadStatus(INT8U addr)<br />{<br /> INT8U value,temp;<br /> temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令<br /> CSN_0;<br /> while (GDO0);<br /> SpiTxRxByte(temp);<br /> value = SpiTxRxByte(0);<br /> CSN_1;<br /> return value;<br />}<br /><br /><br />//*****************************************************************************************<br />//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)<br />//输入:无<br />//输出:无<br />//功能描述:配置CC1100的寄存器<br />//*****************************************************************************************<br />void halRfWriteRfSettings(void)<br />{<br /> //halSpiWriteReg(CCxxx0_FIFOTHR,0x09);<br /> //halSpiWriteReg(CCxxx0_MCSM1,0x00); //CCA,没有作通<br /> halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的<br /> // Write register settings<br /> halSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);<br /> halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);<br /> halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);<br /> halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);<br /> halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);<br /> halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);<br /> halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);<br /> halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);<br /> halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);<br /> halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);<br /> halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);<br /> halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);<br /> halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);<br /> halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);<br /> halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);<br /> halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);<br /> halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);<br /> halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0); <br /> halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);<br /> halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);<br /> halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);<br /> halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);<br />}<br /><br /> <br /><br /> <br /><br /><br />//*****************************************************************************************<br />//函数名:<br />//输入:<br />//输出:<br />//功能描述:CC1100发送主叫数据<br />//*****************************************************************************************<br />void halRfSendPacket(INT8U *txBuffer, INT8U size)<br />{ <br /> <br /> halSpiWriteReg(CCxxx0_TXFIFO, size+2);<br /> halSpiWriteReg(CCxxx0_TXFIFO, ID_Opponent);<br /> halSpiWriteReg(CCxxx0_TXFIFO, ID_Oneself);<br /><br /> halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据<br /> <br /> <br /> halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据<br /> <br /> // Wait for GDO0 to be set - > sync transmitted<br /> while (!GDO0);<br /> <br /> // Wait for GDO0 to be set - > sync transmitted<br /> while (GDO0);<br /> <br /> halSpiStrobe(CCxxx0_SFTX); //清洗发送缓冲区<br /> <br />}<br /> <br /> 相关链接:<a href='http://auction1.taobao.com/auction/item_detail-0db2-139665e24fc8c161b9610a81e910b8e4.jhtml'>http://auction1.taobao.com/auction/item_detail-0db2-139665e24fc8c161b9610a81e910b8e4.jhtml</a> |
|