您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI MSP430 >> MSP430 >> 正文
  CC1101与MSP430F5438的无线通信           ★★★ 【字体:
CC1101与MSP430F5438的无线通信
作者:玩转工控    文章来源:玩转工控    点击数:    更新时间:2015-5-15    

CC1101的功能强大远比于24L01。尤其通讯距离和低功耗。CC1101的数据手册网络上很多,找个搜索软件一搜一片一片的。。CC1101与MSP430F5438的无线通信CC1101与MSP430F5438的无线通信CC1101与MSP430F5438的无线通信不过我建议大家还是去ti的官网吧,那里的资料比较权威,也省得一些中文化的误解导致自己白花好几天的功夫。。

    我在CC1101通讯的时候主要值得注意的,1、SPI的底层是个基础,包括单片机带的SPI接口也好,自己用IO口实现也好,怎么来实现和硬件之间的链接了。2、编程实现的时候注意时序问题。。SPI的时序都一样,但是操作芯片的时候可能有应答,可能没有应答。。3、花最大功夫研究里面的寄存器的配置。整个通讯成功与否,通讯效果好不好都在寄存器的配置上。。个人认为必须理解各个寄存器的作用及使用的目的及意义了。。4、GDO0等IO口的配置在整个系统中的运用非常重要。常见配置值0x01,0x02,0x03,0x06,0x07,其中配置值最为常用配置0x06了,但是了,对于各种需求可以相应修改了,具体手册上写的比较明白。。

   以下为2个CC1101和一个MSP430F5438的一发一收通讯测试程序,实验证明通讯效果比,MC31213(xbee),2401AG,24L01都强,表现在1、通讯视距中有障碍物(如一般水泥墙壁)不影响通讯;2、整个系统电流消耗比较小大约电流在10D多个ma。具体代码如下。

//*****************************************************************************
//
//  【名称】:CC1101测试程序  
//  【功能】:一个开发板实现两个CC1101模块间通讯
//  【版本】:V1.0
//  【作者】:刘
//  【日期】:2011-11-28 14:05:00
//  【说明】:软件版本定义为:V1.0为初始版本,以后改进完善的版本以此类推为V2.0,V3.0.......
//
//*****************************************************************************
//
//  【功能】:头文件定义
//
//*****************************************************************************
#include <msp430x54x.h>
//*****************************************************************************
//  常量定义
//*****************************************************************************
#define  WRITE_BURST      0x40  //连续写入
#define  READ_SINGLE      0x80  //读
#define  READ_BURST       0xC0  //连续读
#define  BYTES_IN_RXFIFO         0x7F    //接收缓冲区的有效字节数
#define  CRC_OK                  0x80   //CRC校验通过位标志
//*****************************************************************************
#define  Set_CC1101_GDO0_1 P1OUT |= BIT0;
#define  Clr_CC1101_GDO0_1 P1OUT &= ~BIT0;
#define  Set_CC1101_GDO2_1 P1OUT |= BIT2;
#define  Clr_CC1101_GDO2_1 P1OUT &= ~BIT2;
#define Set_CC1101_MISO_1 P1OUT |= BIT4;
#define Clr_CC1101_MISO_1 P1OUT &= ~BIT4;
#define Set_CC1101_MOSI_1 P1OUT |= BIT6;
#define Clr_CC1101_MOSI_1 P1OUT &= ~BIT6;
#define Set_CC1101_SCK_1 P2OUT |= BIT0;
#define Clr_CC1101_SCK_1 P2OUT &= ~BIT0;
#define Set_CC1101_CSN_1 P2OUT |= BIT2;
#define Clr_CC1101_CSN_1 P2OUT &= ~BIT2;

#define  Set_CC1101_GDO0_2 P3OUT |= BIT0;
#define  Clr_CC1101_GDO0_2 P3OUT &= ~BIT0;
#define  Set_CC1101_GDO2_2 P3OUT |= BIT2;
#define  Clr_CC1101_GDO2_2 P3OUT &= ~BIT2;
#define Set_CC1101_MISO_2 P3OUT |= BIT4;
#define Clr_CC1101_MISO_2 P3OUT &= ~BIT4;
#define Set_CC1101_MOSI_2 P3OUT |= BIT6;
#define Clr_CC1101_MOSI_2 P3OUT &= ~BIT6;
#define Set_CC1101_SCK_2 P4OUT |= BIT0;
#define Clr_CC1101_SCK_2 P4OUT &= ~BIT0;
#define Set_CC1101_CSN_2 P4OUT |= BIT2;
#define Clr_CC1101_CSN_2 P4OUT &= ~BIT2;
//*****************************************************************************
unsigned char PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};
//*****************************************************************************
unsigned char TxBuf[4]={0x01,0x02,0x03,0x00};
unsigned char RxBuf[4]={0x11,0x22,0x33,0x00};
//*****************************************************************************
void InitSys();
void delay(unsigned int s);
void IOinit(void);
void SpiInit(void);
void CpuInit(void);
void RESET_CC1100(unsigned char ch);
void POWER_UP_RESET_CC1100(void);
void halSpiWriteReg(unsigned char addr, unsigned char value,unsigned char ch);
void halSpiWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count,unsigned char ch);
void halSpiStrobe(unsigned char strobe,unsigned char ch);
unsigned char halSpiReadReg(unsigned char addr,unsigned char ch);
void halSpiReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count,unsigned char ch);
unsigned char halSpiReadStatus(unsigned char addr,unsigned char ch);
void halRfWriteRfSettings(void);
void halRfSendPacket(unsigned char *txBuffer, unsigned char size,unsigned char ch);
unsigned char halRfReceivePacket(unsigned char *rxBuffer, unsigned char *length,unsigned char ch);
unsigned char SpiTxRxByte(unsigned char dat,unsigned char ch);
void setRxMode(void);
//*****************************************************************************
// CC1100 STROBE, CONTROL AND STATUS REGSITER
#define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
#define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
#define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
#define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
#define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
#define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
#define CCxxx0_PKTLEN       0x06        // Packet length
#define CCxxx0_PKTCTRL1     0x07        // Packet automation control
#define CCxxx0_PKTCTRL0     0x08        // Packet automation control
#define CCxxx0_ADDR         0x09        // Device address
#define CCxxx0_CHANNR       0x0A        // Channel number
#define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
#define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
#define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
#define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
#define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
#define CCxxx0_MDMCFG4      0x10        // Modem configuration
#define CCxxx0_MDMCFG3      0x11        // Modem configuration
#define CCxxx0_MDMCFG2      0x12        // Modem configuration
#define CCxxx0_MDMCFG1      0x13        // Modem configuration
#define CCxxx0_MDMCFG0      0x14        // Modem configuration
#define CCxxx0_DEVIATN      0x15        // Modem deviation setting
#define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
#define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
#define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
#define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
#define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
#define CCxxx0_AGCCTRL2     0x1B        // AGC control
#define CCxxx0_AGCCTRL1     0x1C        // AGC control
#define CCxxx0_AGCCTRL0     0x1D        // AGC control
#define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
#define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
#define CCxxx0_WORCTRL      0x20        // Wake On Radio control
#define CCxxx0_FREND1       0x21        // Front end RX configuration
#define CCxxx0_FREND0       0x22        // Front end TX configuration
#define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
#define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
#define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
#define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
#define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
#define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
#define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
#define CCxxx0_PTEST        0x2A        // Production test
#define CCxxx0_AGCTEST      0x2B        // AGC test
#define CCxxx0_TEST2        0x2C        // Various test settings
#define CCxxx0_TEST1        0x2D        // Various test settings
#define CCxxx0_TEST0        0x2E        // Various test settings

// Strobe commands
#define CCxxx0_SRES         0x30        // Reset chip.
#define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
                                        // If in RX/TX: Go to a wait state where only the synthesizer is
                                        // running (for quick RX / TX turnaround).
#define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
#define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
                                        // (enables quick start).
#define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
                                        // MCSM0.FS_AUTOCAL=1.
#define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
                                        // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
                                        // Only go to TX if channel is clear.
#define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
                                        // Wake-On-Radio mode if applicable.
#define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
#define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
#define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
#define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
#define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
#define CCxxx0_SWORRST      0x3C        // Reset real time clock.
#define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
                                        // INT8Us for simpler software.

#define CCxxx0_PARTNUM      0x30
#define CCxxx0_VERSION      0x31
#define CCxxx0_FREQEST      0x32
#define CCxxx0_LQI          0x33
#define CCxxx0_RSSI         0x34
#define CCxxx0_MARCSTATE    0x35
#define CCxxx0_WORTIME1     0x36
#define CCxxx0_WORTIME0     0x37
#define CCxxx0_PKTSTATUS    0x38
#define CCxxx0_VCO_VC_DAC   0x39
#define CCxxx0_TXBYTES      0x3A
#define CCxxx0_RXBYTES      0x3B

#define CCxxx0_PATABLE      0x3E
#define CCxxx0_TXFIFO       0x3F
#define CCxxx0_RXFIFO       0x3F

// RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
typedef struct S_RF_SETTINGS
{
    unsigned char FSCTRL2;  //自已加的
    unsigned char FSCTRL1;   // Frequency synthesizer control.
    unsigned char FSCTRL0;   // Frequency synthesizer control.
    unsigned char FREQ2;     // Frequency control word, high INT8U.
    unsigned char FREQ1;     // Frequency control word, middle INT8U.
    unsigned char FREQ0;     // Frequency control word, low INT8U.
    unsigned char MDMCFG4;   // Modem configuration.
    unsigned char MDMCFG3;   // Modem configuration.
    unsigned char MDMCFG2;   // Modem configuration.
    unsigned char MDMCFG1;   // Modem configuration.
    unsigned char MDMCFG0;   // Modem configuration.
    unsigned char CHANNR;    // Channel number.
    unsigned char DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
    unsigned char FREND1;    // Front end RX configuration.
    unsigned char FREND0;    // Front end RX configuration.
    unsigned char MCSM0;     // Main Radio Control State Machine configuration.
    unsigned char FOCCFG;    // Frequency Offset Compensation Configuration.
    unsigned char BSCFG;     // Bit synchronization Configuration.
    unsigned char AGCCTRL2;  // AGC control.
    unsigned char AGCCTRL1;  // AGC control.
    unsigned char AGCCTRL0;  // AGC control.
    unsigned char FSCAL3;    // Frequency synthesizer calibration.
    unsigned char FSCAL2;    // Frequency synthesizer calibration.
    unsigned char FSCAL1;    // Frequency synthesizer calibration.
    unsigned char FSCAL0;    // Frequency synthesizer calibration.
    unsigned char FSTEST;    // Frequency synthesizer calibration control
    unsigned char TEST2;     // Various test settings.
    unsigned char TEST1;     // Various test settings.
    unsigned char TEST0;     // Various test settings.
    unsigned char IOCFG2;    // GDO2 output pin configuration
    unsigned char IOCFG0;    // GDO0 output pin configuration
    unsigned char PKTCTRL1;  // Packet automation control.
    unsigned char PKTCTRL0;  // Packet automation control.
    unsigned char ADDR;      // Device address.
    unsigned char PKTLEN;    // Packet length.
} RF_SETTINGS;

const RF_SETTINGS rfSettings =
{
    0x00,
    0x08,   // FSCTRL1   Frequency synthesizer control.
    0x00,   // FSCTRL0   Frequency synthesizer control.
    0x10,   // FREQ2     Frequency control word, high byte.
    0xA7,   // FREQ1     Frequency control word, middle byte.
    0x62,   // FREQ0     Frequency control word, low byte.
    0x5B,   // MDMCFG4   Modem configuration.
    0xF8,   // MDMCFG3   Modem configuration.
    0x03,   // MDMCFG2   Modem configuration.
    0x22,   // MDMCFG1   Modem configuration.
    0xF8,   // MDMCFG0   Modem configuration.

    0xff,   // CHANNR    Channel number.
    0x47,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
    0xB6,   // FREND1    Front end RX configuration.
    0x10,   // FREND0    Front end RX configuration.
    0x18,   // MCSM0     Main Radio Control State Machine configuration.
    0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
    0x1C,   // BSCFG     Bit synchronization Configuration.
    0xC7,   // AGCCTRL2  AGC control.
    0x00,   // AGCCTRL1  AGC control.
    0xB2,   // AGCCTRL0  AGC control.

    0xEA,   // FSCAL3    Frequency synthesizer calibration.
    0x2A,   // FSCAL2    Frequency synthesizer calibration.
    0x00,   // FSCAL1    Frequency synthesizer calibration.
    0x11,   // FSCAL0    Frequency synthesizer calibration.
    0x59,   // FSTEST    Frequency synthesizer calibration.
    0x81,   // TEST2     Various test settings.
    0x35,   // TEST1     Various test settings.
    0x09,   // TEST0     Various test settings.
    0x0B,   // IOCFG2    GDO2 output pin configuration.
    0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

    0x04,   // PKTCTRL1  Packet automation control.
    0x05,   // PKTCTRL0  Packet automation control.
    0xff,   // ADDR      Device address.
    0x0c    // PKTLEN    Packet length.
};
//*****************************************************************************
//
//  【名称】  IOinit
//  【功能】  单片机IO口初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void IOinit(void)
{
    P1DIR &= ~(BIT0 + BIT2 + BIT4);
    P1DIR |= BIT6;
    P2DIR |= BIT0 + BIT2;
    P3DIR &= ~(BIT0 + BIT2 + BIT4);
    P3DIR |= BIT6;
    P4DIR |= BIT0 + BIT2;  
    P10DIR |= BIT6 + BIT7;
}
//*****************************************************************************
//
//  【名称】  delay
//  【功能】  软件延时
//  【参数】  S:时间
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void delay(unsigned int s)
{
    while (s != 0)
    {
        s--;
    }
}
//*****************************************************************************
//
//  【名称】  InitSys
//  【功能】  晶振初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void InitSys()
{
    int i;
    WDTCTL = WDTPW + WDTHOLD;                                      
    P5SEL |= 0x0C;                                                
    UCSCTL6 &= ~XT2DRIVE_1;                                        
    UCSCTL4  |= SELS__XT2CLK;                                     
    for(i=0xFF;i>0;i--);                                           
    UCSCTL7 &= ~(XT2OFFG + DCOFFG);
    SFRIFG1 &= ~OFIFG;
}
//*****************************************************************************
//
//  【名称】  halWait
//  【功能】  短延时
//  【参数】  timeout:时间
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halWait(unsigned int timeout)
{
    do
    {
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        _NOP();
    }
    while (--timeout);
}
//*****************************************************************************
//
//  【名称】  SpiInit
//  【功能】  无线通讯模块初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void SpiInit(void)
{
    Clr_CC1101_CSN_1;
    Clr_CC1101_SCK_1;
    Set_CC1101_CSN_1;

    Clr_CC1101_CSN_2;
    Clr_CC1101_SCK_2;
    Set_CC1101_CSN_2;          
}
//*****************************************************************************
//
//  【名称】  CpuInit
//  【功能】  单片机初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void CpuInit(void)
{
    InitSys();
    IOinit();
    SpiInit();
}
//*****************************************************************************
//
//  【名称】  SpiTxRxByte
//  【功能】  读写一字节
//  【参数】  dat:写入数据
//            ch:通道
//  【返回】  状态值或读取值
//  【说明】  无  
//
//*****************************************************************************
unsigned char SpiTxRxByte(unsigned char dat,unsigned char ch)
{
    unsigned char i,temp;
    temp = 0;
    switch (ch)
    {
    case 1:
        Clr_CC1101_SCK_1;
        for(i=0; i<8; i++)
        {
            if(dat & 0x80)
            {
                Set_CC1101_MOSI_1;
            }
            else
            {
                Clr_CC1101_MOSI_1;
            }
            dat <<= 1;
            Set_CC1101_SCK_1;
            delay(20);
            temp <<= 1;
            if(P1IN&0x10)
            {
                temp++;
            }
            Clr_CC1101_SCK_1;
            delay(20);
        }
    break;
    case 2:
        Clr_CC1101_SCK_2;
        for(i=0; i<8; i++)
        {
            if(dat & 0x80)
            {
                Set_CC1101_MOSI_2;
            }
            else
            {
                Clr_CC1101_MOSI_2;
            }
            dat <<= 1;
            Set_CC1101_SCK_2;
            delay(20);
            temp <<= 1;
            if(P3IN&0x10)
            {
                temp++;
            }
            Clr_CC1101_SCK_2;
            delay(10);
        } 
      break;
    }
return temp;
}
//*****************************************************************************
//
//  【名称】  RESET_CC1100
//  【功能】  复位芯片
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void RESET_CC1100(unsigned char ch)
{
    switch (ch)
    {
    case 1:
      Clr_CC1101_CSN_1;
      while (P1IN & 0x10 );
      SpiTxRxByte(CCxxx0_SRES,1);
      while (P1IN & 0x10);
      Set_CC1101_CSN_1;
      break;
    case 2:
      Clr_CC1101_CSN_2;
      while (P3IN & 0x10);
      SpiTxRxByte(CCxxx0_SRES,2);
      while (P3IN & 0x10);
      Set_CC1101_CSN_2;
      break;
    }
}
//*****************************************************************************
//
//  【名称】  POWER_UP_RESET_CC1100
//  【功能】  上电复位
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void POWER_UP_RESET_CC1100(void)
{
    Set_CC1101_CSN_1;
    halWait(1);
    Clr_CC1101_CSN_1;
    halWait(1);
    Set_CC1101_CSN_1;
    halWait(41);
    RESET_CC1100(1);
 
    Set_CC1101_CSN_2;
    halWait(1);
    Clr_CC1101_CSN_2;
    halWait(1);
    Set_CC1101_CSN_2;
    halWait(41);
    RESET_CC1100(2);
}
//*****************************************************************************
//
//  【名称】  halSpiWriteReg
//  【功能】  写寄存器
//  【参数】  addr:地址
//            value:值
//            ch:模块通道
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halSpiWriteReg(unsigned char addr, unsigned char value,unsigned char ch)
{
  switch (ch)
  {
  case 1:
    Clr_CC1101_CSN_1;
    while (P1IN & 0x10);
    SpiTxRxByte(addr,1);
    SpiTxRxByte(value,1);
    Set_CC1101_CSN_1;
    break;
  case 2:
    Clr_CC1101_CSN_2;
    while (P3IN & 0x10);
    SpiTxRxByte(addr,2);
    SpiTxRxByte(value,2);
    Set_CC1101_CSN_2;
    break;
  }
}
//*****************************************************************************
//
//  【名称】  halSpiWriteBurstReg
//  【功能】  连续写寄存器
//  【参数】  addr:地址
//            *buffer:值
//            count:个数
//            ch:模块通道
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halSpiWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count,unsigned char ch)
{
    unsigned char i, temp;
    temp = addr | WRITE_BURST;
    switch (ch)
    {
    case 1:
      Clr_CC1101_CSN_1;
      while (P1IN & 0x10);
      SpiTxRxByte(temp,1);
      for (i = 0; i < count; i++)
      {
          SpiTxRxByte(buffer[i],1);
      }
      Set_CC1101_CSN_1;
      break;
    case 2:
      Clr_CC1101_CSN_2;
      while (P3IN & 0x10);
      SpiTxRxByte(temp,2);
      for (i = 0; i < count; i++)
      {
          SpiTxRxByte(buffer[i],2);
      }
      Set_CC1101_CSN_2;
      break;
    }
}
//*****************************************************************************
//
//  【名称】  halSpiStrobe
//  【功能】  写命令
//  【参数】  strobe:命令
//            ch:模块通道
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halSpiStrobe(unsigned char strobe,unsigned char ch)
{
    switch (ch)
    {
    case 1:
      Clr_CC1101_CSN_1;
      while (P1IN & 0x10);
      SpiTxRxByte(strobe,1);
      Set_CC1101_CSN_1;
      break;
    case 2:
      Clr_CC1101_CSN_2;
      while (P3IN & 0x10);
      SpiTxRxByte(strobe,2);
      Set_CC1101_CSN_2;
      break;
    }
}
//*****************************************************************************
//
//  【名称】  halSpiReadReg
//  【功能】  读取状态
//  【参数】  addr:地址
//            ch:模块通道
//  【返回】  状态值
//  【说明】  无  
//
//*****************************************************************************
unsigned char halSpiReadReg(unsigned char addr,unsigned char ch)
{
    unsigned char temp, value;
    temp = addr|READ_SINGLE;
    switch (ch)
    {
      case 1:
        Clr_CC1101_CSN_1;
        while (P1IN & 0x10);
        SpiTxRxByte(temp,1);
        value = SpiTxRxByte(0,1);
        Set_CC1101_CSN_1;
        break;
      case 2:
        Clr_CC1101_CSN_2;
        while (P3IN & 0x10);
        SpiTxRxByte(temp,2);
        value = SpiTxRxByte(0,2);
        Set_CC1101_CSN_2;
        break;
    }
    return value;
}
//*****************************************************************************
//
//  【名称】  halSpiReadBurstReg
//  【功能】  读取状态
//  【参数】  addr:地址
//            *buffer:返回值
//            count:连续读取值
//            ch:模块通道
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halSpiReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count,unsigned char ch)
{
    unsigned char i,temp;
    temp = addr | READ_BURST;
    switch (ch)
    {
      case 1:
        Clr_CC1101_CSN_1;
        while (P1IN & 0x10);
        SpiTxRxByte(temp,1); 
        for (i = 0; i < count; i++)
        {
            buffer[i] = SpiTxRxByte(0,1);
        }
        Set_CC1101_CSN_1;
        break;
      case 2:
        Clr_CC1101_CSN_2;
        while (P3IN & 0x10);
        SpiTxRxByte(temp,2); 
        for (i = 0; i < count; i++)
        {
            buffer[i] = SpiTxRxByte(0,2);
        }
        Set_CC1101_CSN_2;
        break;
    }
}
//*****************************************************************************
//
//  【名称】  halSpiReadStatus
//  【功能】  读取状态
//  【参数】  addr:地址
//            ch:模块通道
//  【返回】  状态值
//  【说明】  无  
//
//*****************************************************************************
unsigned char halSpiReadStatus(unsigned char addr,unsigned char ch)
{
    unsigned char value,temp;
    temp = addr | READ_BURST;
    switch (ch)
    {
      case 1:
        Clr_CC1101_CSN_1;
        while (P1IN & 0x10);
        SpiTxRxByte(temp,1);
        value = SpiTxRxByte(0,1);
        Set_CC1101_CSN_1;
        break;
      case 2:
        Clr_CC1101_CSN_2;
        while (P3IN & 0x10);
        SpiTxRxByte(temp,2);
        value = SpiTxRxByte(0,2);
        Set_CC1101_CSN_2;
        break;
    }
    return value;
}
//*****************************************************************************
//
//  【名称】  halRfWriteRfSettings
//  【功能】  寄存器设置
//  【参数】  无
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halRfWriteRfSettings(void)
{

    halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2,1);
    halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1,1);
    halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0,1);
    halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2,1);
    halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1,1);
    halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0,1);
    halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4,1);
    halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3,1);
    halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2,1);
    halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1,1);
    halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0,1);
    halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR,1);
    halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN,1);
    halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1,1);
    halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0,1);
    halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0,1);
    halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG,1);
    halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG,1);
    halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2,1);
    halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1,1);
    halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0,1);
    halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3,1);
    halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2,1);
    halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1,1);
    halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0,1);
    halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST,1);
    halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2,1);
    halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1,1);
    halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0,1);
    halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2,1);
    halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0,1);
    halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1,1);
    halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0,1);
    halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR,1);
    halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN,1);
 
  
    halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2,2);
    halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1,2);
    halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0,2);
    halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2,2);
    halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1,2);
    halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0,2);
    halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4,2);
    halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3,2);
    halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2,2);
    halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1,2);
    halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0,2);
    halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR,2);
    halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN,2);
    halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1,2);
    halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0,2);
    halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0,2);
    halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG,2);
    halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG,2);
    halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2,2);
    halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1,2);
    halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0,2);
    halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3,2);
    halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2,2);
    halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1,2);
    halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0,2);
    halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST,2);
    halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2,2);
    halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1,2);
    halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0,2);
    halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2,2);
    halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0,2);  
    halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1,2);
    halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0,2);
    halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR,2);
    halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN,2);
  
}
//*****************************************************************************
//
//  【名称】  halRfSendPacket
//  【功能】  一数据包发送函数
//  【参数】  *txBuffer:发送指针
//            size:数据长度
//            ch:模块通道
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void halRfSendPacket(unsigned char *txBuffer, unsigned char size,unsigned char ch)
{
    switch (ch)
    {
    case 1:
      halSpiWriteReg(CCxxx0_TXFIFO, size,1);
      halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size,1);
      halSpiStrobe(CCxxx0_STX,1);
      while (!(P1IN&0x01));
      while (P1IN&0x01);
      halSpiStrobe(CCxxx0_SFTX,1);
      break;
    case 2:
      halSpiWriteReg(CCxxx0_TXFIFO, size,2);
      halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size,2);
      halSpiStrobe(CCxxx0_STX,2);
      while (!(P3IN&0x01));
      while (P3IN&0x01);
      halSpiStrobe(CCxxx0_SFTX,2);
      break;    
    }
}
//*****************************************************************************
//
//  【名称】  halRfReceivePacket
//  【功能】  一数据包接收函数
//  【参数】  *rxBuffer:接收指针
//            *length:数据长度
//            ch:模块通道
//  【返回】  接收成功与否。
//  【说明】  无  
//
//*****************************************************************************
unsigned char halRfReceivePacket(unsigned char *rxBuffer, unsigned char *length,unsigned char ch)
{
    unsigned char status[2],a;
    unsigned char packetLength;
    unsigned char i=(*length)*4;
    switch (ch)
    {
      case 1:
        halSpiStrobe(CCxxx0_SRX,1);
        delay(2);
        while (P1IN&0x01)
        {
 delay(2);
 --i;
 if(i<1)
            {
                a=0;
            }   
        }
        if ((halSpiReadStatus(CCxxx0_RXBYTES,1) & BYTES_IN_RXFIFO))
        {
            packetLength = halSpiReadReg(CCxxx0_RXFIFO,1);
            if (packetLength <= *length)
 {
                halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength,1);
                *length = packetLength;
                halSpiReadBurstReg(CCxxx0_RXFIFO, status,2,1);
     halSpiStrobe(CCxxx0_SFRX,1);
                a=status[1] & CRC_OK;
            }
            else
            {
                *length = packetLength;
                halSpiStrobe(CCxxx0_SFRX,1);
                a=0;
            }
        }
        else
        {
  a=0;
        }
        break;
      case 2:
        halSpiStrobe(CCxxx0_SRX,2);
        delay(2);
        while (P3IN&0x01)
        {
 delay(2);
 --i;
 if(i<1)
            {
                a=0;
            }   
        }
        if ((halSpiReadStatus(CCxxx0_RXBYTES,2) & BYTES_IN_RXFIFO))
        {
            packetLength = halSpiReadReg(CCxxx0_RXFIFO,2);
            if (packetLength <= *length)
 {
                halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength,2);
                *length = packetLength;
                halSpiReadBurstReg(CCxxx0_RXFIFO, status,2,2);
     halSpiStrobe(CCxxx0_SFRX,2);
                a=status[1] & CRC_OK;
            }
            else
            {
                *length = packetLength;
                halSpiStrobe(CCxxx0_SFRX,2);
                a=0;
            }
        }
        else
        {
  a=0;
        }
        break;      
    }
    return a;
}
//*****************************************************************************
//
//  【名称】  main
//  【功能】  主函数
//  【参数】  无                               
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
void main(void)
{
    unsigned char leng = 4;
    CpuInit();
    POWER_UP_RESET_CC1100();
    halRfWriteRfSettings();
    halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8,1);
    halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8,2);
    for(;;)
    {
        TxBuf[0]=0x01;
        TxBuf[1]=0x02;
        TxBuf[2]=0x03;
        TxBuf[3]=0x00;
        halRfSendPacket(TxBuf,leng,1); // Transmit Tx buffer data
        delay(10000);
        if(halRfReceivePacket(RxBuf,&leng,2))
        {
            RxBuf[3]='\0';
            P10OUT |= BIT6;
            P10OUT &= ~BIT7;
            RxBuf[0]=0x11;
            RxBuf[1]=0x22;
            RxBuf[2]=0x33;
            RxBuf[3]=0x00;
            delay(10000);
        }
        else
        {
            P10OUT |= BIT7;
            P10OUT &= ~BIT6;
            delay(10000);
        }
      
    }
}

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    CC1101的WOR电磁波唤醒的使用…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2