基于CC1101与STC89C52无线收发程序(发射程序)

好像用CC1101的朋友好少,在此也贴上CC1101收发程序吧!这样会减少大家大量时间去调试。不多说了直接上程序了:

#include <reg52.h>
#include <intrins.h>

#define IOCFG2   0x00
#define IOCFG1  0x01
#define IOCFG0  0x02
#define FIFOTHR  0x03//rx和tx FIFO门限
#define SYNC1  0x04//同步词汇,高字节
#define SYNC0  0x05//同步词汇,低字节
#define PKTLEN  0x06//数据包长度
#define PKTCTRL1 0x07//数据包自动控制
#define PKTCTRL0 0x08//数据包自动控制
#define ADDR  0x09//设备地址
#define CHANNR  0x0a//信道数
#define FSCTRL1  0x0b//频率合成控制器
#define FSCTRL0  0x0c//频率控制词汇,高字节
#define FREQ2  0x0d//频率控制词汇,中间字节
#define FREQ1  0x0e//频率控制词汇,低字节
#define FREQ0  0x0f//调置器配置
#define MDMCFG4  0x10//调置器配置
#define MDMCFG3  0x11//调置器配置
#define MDMCFG2  0x12//调置器配置
#define MDMCFG1  0x13//调置器配置
#define MDMCFG0  0x14//调置器配置
#define DEVIATN  0x15//主通信控制状态机配置
#define MCSM2  0x16//主通信控制状态机配置
#define MCSM1  0x17//主通信控制状态机配置
#define MCSM0  0x18//频率偏移补偿配置
#define FOCCFG  0x19//位同步配置
#define BSCFG  0x1a//AGC控制
#define AGCCTRL2  0x1b//AGC控制
#define AGCCTRL1  0x1c//AGC控制
#define AGCCTRL0  0x1d//高字节时间0暂停
#define WOREVT1  0x1e//低字节时间0暂停
#define WOREVT0  0x1f//电磁波激活控制
#define WORCTRL  0x20//前末端RX配置
#define FREND1  0x21//前末端TX配置
#define FREND0  0x22//频率合成器校准
#define FSCAL3  0x23//频率合成器校准
#define FSCAL2  0x24//频率合成器校准
#define FSCAL1  0x25//频率合成器校准
#define FSCAL0  0x26//RC振荡器配置
#define RCCTRL1  0x27//RC振荡器配置
#define RCCTRL0  0x28//频率合成器校准控制
#define FSTEST  0x29//产品测试
#define PTEST  0x2a//AGC测试
#define AGCTEST  0x2b//不同的测试设置
#define TEST2  0x2c//不同的测试设置
#define TEST1  0x2d//不同的测试设置
#define TEST0  0x2e//

#define SRES  0x30//重启芯片
#define SFSTXON  0x31//开启和校准频率合成器
#define SXOFF  0x32//关闭晶体振荡器
#define SCAL  0x33//校准频率合成器并判断
#define SRX   0x34//启用SRX
#define STX   0x35//空闲状态:启用STX
#define SIDLE  0x36//离开RX/TX,关断频率合成器
#define SAFC  0x37//频率合成器AFC调节
#define SWOR  0x38//自动RX选举序列(电磁波激活)
#define SPWD  0x39//当CSN为高时进入功率降低模式
#define SFRX  0x3a//冲洗RX FIFO缓存
#define SFTX  0x3b//冲洗TX FIFO缓存
#define SWORRST  0x3c//重新设置真实时间时钟
#define SNOP  0x3d//无操作

#define PARTNUM  0x30//CC2550组成部分数目
#define VERSION  0x31//当前版本数
#define FREQEST  0x32//频率偏移估计
#define LQI   0x33//连接质量的解调器估计
#define RSSI  0x34//接收信号强度指示
#define MARCSTATE 0x35//控制状态机状态
#define WORTIME1 0x36//WOR计时器高字节
#define WORTIME0 0x37//WOR计时器低字节
#define PKTSTATUS 0x38//当前GDOx状态和数据包状态
#define VCO_VC_DAC 0x39//PLL校准模块的当前设定
#define TXBYTES  0x3a//TX FIFO中的下溢和比特数
#define RXBYTES  0x3b//RX FIFO中的下溢和比特数
#define PATABLE  0x3e
#define TX_FIFO  0x3f
#define RX_FIFO  0x3f
#define data_len 8

typedef  unsigned int uint;
typedef  unsigned char uchar;

uchar rx_buffer[data_len]={0,0,0,0,0,0,0,0};//rx data
//uchar RX_data[data_len];
uchar code tx_buffer[data_len]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//tx data
uchar data_length=0;
uchar code P_Config[]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0};//功率配置

sbit CSN=P2^1;
sbit SCLK=P2^7;
sbit SI=P2^2;
sbit SO=P2^0;
sbit GDO0=P2^6;

sbit key=P2^5;

sbit LED=P0^0;
//sbit LED1=P0^6;

void CC1101_Init(void);
void CC1101_RESET(void);
void POWER_UP_RESET(void);
uchar SPI_WR_Byte(uchar value);
void SPI_Write_Byte(uchar addr,uchar value);
uchar SPI_Read_Byte(uchar addr);
void SPI_Write_Strobe(uchar strobe);
void SPI_Write_Burst(uchar addr,uchar *buffer,uchar count);
void SPI_Read_Burst(uchar addr,uchar *buffer,uchar count);
void SPI_Write_Packet(uchar *TX_Buffer,uchar size);
uchar SPI_Read_Packet(uchar *RX_Buffer,uchar length);
void CC1101_Set_TX(void);
void CC1101_Set_RX(void);
void Write_Config(void);

void delay_ms(uint x)
{
 uint i;
 while(x--)for(i=0;i<120;i++);
}

void delay_us(uint x)
{
 do {
        _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
    } while (--x);
}
//------------------------------------------------/
//函数功能:通过SPI写读一字节                     /
//输入参数:value                                 /
//输出参数:B_value                               /
//-----------------------------------------------/
uchar SPI_WR_Byte(uchar value)
{
 uchar i,B_value=0;
 SCLK=0;
 for(i=0;i<8;i++)
 {
  if(value&0x80)
   SI=1;
  else
   SI=0;
  value<<=1;
  SCLK=1;
  _nop_();_nop_();
  B_value<<=1;
  if(SO)
   B_value|=0x01;
  SCLK=0;
  _nop_();_nop_();
 }
 return B_value;
}
//-------------------------------------------------/
//函数功能:重置CC1101                            /
//输入参数:无                                    /
//输出参数:无                                 /
//----------------------------------------------/
void CC1101_RESET(void)
{
 SPI_Write_Strobe(SIDLE);
 CSN=0;
 while(SO);
 SPI_WR_Byte(SRES);
 while(SO);
 CSN=1;
}
//-----------------------------------------------/
//函数功能:CC1101上电重置                      /
//输入参数:无                                   /
//输出参数:无                                 /
//--------------------------------------------/
void POWER_UP_RESET(void)
{
 
 CSN=1;
 delay_us(1);
 CSN=0;
 delay_us(1);
 CSN=1;
 delay_us(41);
 CC1101_RESET();
}

//-----------------------------------------------/
//函数功能:CC1101初始化                         /
//输入参数:无                                  /
//输出参数:无                                  /
//--------------------------------------------/
void CC1101_Init(void)
{
 CSN=0;
 SCLK=0;
 CSN=1;
 delay_ms(10);
 POWER_UP_RESET();
 Write_Config();
 SPI_Write_Burst(PATABLE,P_Config,8);
 SPI_Write_Strobe(SCAL);
 SPI_Write_Strobe(SIDLE);
 SPI_Write_Strobe(SFTX);
// for(i=0;i<100;i++)
//  SPI_Write_Strobe(SNOP);
// SPI_Write_Strobe(SIDLE);
// SPI_Write_Strobe(SRX);
}
//-----------------------------------------------/
//函数功能:SPI写命令                           /
//输入参数:Strobe                              /
//输出参数:无                                  /
//---------------------------------------------/
void SPI_Write_Strobe(uchar strobe)
{
 CSN=0;
 while(SO);
 SPI_WR_Byte(strobe);
 CSN=1;
}

uchar SPI_Read_Byte(uchar addr)
{
 uchar value;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0x80);
 value=SPI_WR_Byte(0);
 CSN=1;
 return value;
}
void SPI_Write_Byte(uchar addr,uchar value)
{
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr);
 SPI_WR_Byte(value);
 CSN=1;
}

void SPI_Write_Burst(uchar addr,uchar *buffer,uchar count)
{
 uchar i;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0x40);
 for(i=0;i<count;i++)
 {
  SPI_WR_Byte(buffer[i]);
  delay_us(10);
 }
 CSN=1;
}

void SPI_Read_Burst(uchar addr,uchar *buffer,uchar count)
{
 uchar i;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0xc0);
 for(i=0;i<count;i++)
  buffer[i]=SPI_WR_Byte(0);
 CSN=1;
}

uchar SPI_Read_Status(uchar addr)
{
 uchar value;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0xc0);//
 value=SPI_WR_Byte(0);
 CSN=1;
 return value;
}

void SPI_Write_Packet(uchar *TX_Buffer,uchar size)
{
// uchar j;
 
 SPI_Write_Byte(TX_FIFO,size);
 SPI_Write_Burst(TX_FIFO,TX_Buffer,size);
 SPI_Write_Strobe(STX);
 while(!GDO0);
 LED=1;
 while(GDO0);
 LED=0;
 SPI_Write_Strobe(SIDLE);
 SPI_Write_Strobe(SFTX);
 
}

void Write_Config(void)
{
    SPI_Write_Byte(IOCFG2,   0x0b);//

    SPI_Write_Byte(IOCFG0,   0x06);//

 SPI_Write_Byte(FIFOTHR,  0x07);//
// SPI_Write_Byte(SYNC1,  0xd3);//
// SPI_Write_Byte(SYNC0,  0x91);//
 SPI_Write_Byte(PKTLEN,   0xff);//
    SPI_Write_Byte(PKTCTRL1, 0x04);//
    SPI_Write_Byte(PKTCTRL0, 0x05);//
// SPI_Write_Byte(ADDR,  0x01);//
// SPI_Write_Byte(CHANNR,   0x00);//
 SPI_Write_Byte(FSCTRL1,  0x06);//
    SPI_Write_Byte(FSCTRL0,  0x00);//
    SPI_Write_Byte(FREQ2,    0x10);//
    SPI_Write_Byte(FREQ1,    0xb0);//
    SPI_Write_Byte(FREQ0,    0x71);//
    SPI_Write_Byte(MDMCFG4,  0x2d);//
    SPI_Write_Byte(MDMCFG3,  0x3b);//
    SPI_Write_Byte(MDMCFG2,  0x71);//
    SPI_Write_Byte(MDMCFG1,  0xa2);//
    SPI_Write_Byte(MDMCFG0,  0xf8);//
 SPI_Write_Byte(DEVIATN,  0x15);//
// SPI_Write_Byte(MCSM2 ,   0x07);//
 SPI_Write_Byte(MCSM1 ,   0x30);//
    SPI_Write_Byte(MCSM0 ,   0x18);//

    SPI_Write_Byte(FOCCFG,   0x16);//
    SPI_Write_Byte(BSCFG,    0x6c);//
 SPI_Write_Byte(AGCCTRL2, 0x03);//
// SPI_Write_Byte(AGCCTRL1, 0x00);//
    SPI_Write_Byte(AGCCTRL0, 0x91);//
// SPI_Write_Byte(WOREVT1 , 0x87);//
// SPI_Write_Byte(WOREVT0 , 0x6b);//
// SPI_Write_Byte(WORCTRL,  0xf8);//
    SPI_Write_Byte(FREND1,   0x56);//
    SPI_Write_Byte(FREND0,   0x10);//
    
    
    
    SPI_Write_Byte(FSCAL3,   0xe9);//
 SPI_Write_Byte(FSCAL2,   0x0a);//
// SPI_Write_Byte(FSCAL1,   0x00);//
    SPI_Write_Byte(FSCAL0,   0x1f);//
// SPI_Write_Byte(RCCTRL1 , 0x41);//
// SPI_Write_Byte(RCCTRL0 , 0x00);//
    SPI_Write_Byte(FSTEST,   0x59);//
// SPI_Write_Byte(PTEST ,   0x7f);//
    SPI_Write_Byte(TEST2,    0x81);//
    SPI_Write_Byte(TEST1,    0x35);//
    SPI_Write_Byte(TEST0,    0x09);//

   
}

uchar SPI_Read_Packet(uchar *RX_Buffer,uchar length)
{
 uchar status[2];
 uchar size=0; 
 SPI_Write_Strobe(SRX);
 delay_ms(1);
 if(SPI_Read_Status(RXBYTES)==0) return 0;
 while(GDO0)
 {
  SPI_Write_Strobe(SIDLE);
  return 0;
 }
 size=SPI_Read_Byte(RX_FIFO);
 
 if(size==length)
 {
  SPI_Read_Burst(RX_FIFO,RX_Buffer,size);
  SPI_Read_Burst(RX_FIFO,status,2);
  SPI_Write_Strobe(SFRX);
  return(status[1]&0x80);
 }
 else
 {
  SPI_Write_Strobe(SIDLE);
  SPI_Write_Strobe(SFRX);
  return 0;
 }

}

void main(void)
{
 CC1101_Init();
 delay_ms(100);
 while(1)
 {
  SPI_Write_Packet(tx_buffer,sizeof(tx_buffer));
 }
}

 想要更多免费单片机教程及学习,请大家多关注,谢谢!

 

posted @ 2013-03-17 18:49  天涯海角路  阅读(286)  评论(0)    收藏  举报