原创 CC1100

2009-2-11 14:54 2444 2 2 分类: 通信
 

该模块采用CC1100是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计。电路主要设定为在315433868915MHzISM(工业,科学和医学)和SRD(短距离设备)频率波段,也可以容易地设置为300-348 MHz400-464 MHz800-928 MHz的其他频率。RF收发器集成了一个高度可配置的调制解调器。这个调制解调器支持不同的调制格式,其数据传输率可达500kbps。通过开启集成在调制解调器上的前向误差校正选项,能使性能得到提升。CC1100为数据包处理、数据缓冲、突发数据传输、清晰信道评估、连接质量指示和电磁波激发提供广泛的硬件支持。CC1100的主要操作参数和64位传输/接收FIFO(先进先出堆栈)可通过SPI接口控制。在一个典型系统里,CC1100基于0.18微米CMOS晶体的ChipconSmartRF04技术。


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);        //清洗发送缓冲区

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条