⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrmcucontrolcc100program.txt

📁 AVR控制CC1100收发程序 该模块采用CC1100是一种低成本真正单片的UHF收发器
💻 TXT
字号:
该模块采用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[i]);
    }
    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[i] = 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);        //清洗发送缓冲区
专业无线总汇
QQ:1002421875 MSN:yunjiakeji@hotmail.com 
Skype:yunjiakeji EMAIL:myb33695@163.com 
PHONE:13430970167    http://shop35991384.taobao.com

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -