datasheet

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

2015-09-08来源: eefocus关键字:CC1101  STC89C52  无线收发
好像用CC1101的朋友好少,在此也贴上CC1101收发程序吧!这样会减少大家大量时间去调试。不多说了直接上程序了:

#include
#include

#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();
}[page]

//-----------------------------------------------/
//函数功能: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  {
  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   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));
 }
}

关键字:CC1101  STC89C52  无线收发

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2015/0908/article_22073.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于CC1101与STC89C52无线收发程序(接收程序)
下一篇:A7105(2.4G)与STC89C52单片机无线收发程序(接收程序)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

CC2530 的SPI通信中的问题和解决方法

打算使用TI公司的CC2530控制TI的电压芯片DAC081S101,需要用到SPI模块。因为我的开发板只能测试UART1对应的IO口,因此做了下面的测试。TI论坛提供的spi文档:http://www.ti.com.cn/cn/lit/an/swra223a/swra223a.pdf1. 两个CC2430测试,一个作为master,一个作为slave代码完全使用TI 的SPI文档中的code,slave采用中断接收的方式,收到数据之后通过UART0发送到电脑上查看数据,完全正确。注意事项:*接线,非常重要。Master的MOSI接Slave的MOSI; Master的MISO接Slave 的MISO;千万不要交叉接线
发表于 2018-05-05

STM32+CC1101 低功耗

始还挺满意的,但是测试厂商提供的样板,功耗却只有几十uA,有点郁闷了。为什么会这样?反复查看硬件、程序,都找不出原因,而且这个时候的工作效果很烂,根本就不能唤醒,所以我就怀疑是读卡芯片一端低功耗有问题,因为我将PA0脚直接短接VCC,这样就可以产生一个边沿触发STM32唤醒了,但是用读卡芯片无法唤醒,所以我怀疑是读卡芯片的RESET脚电平不对,经检查,确实是因为RESET脚加了上拉电阻,读卡芯片是高电平复位,在STM32进入待机后,管脚全都浮空了,导致RESET被拉高,一直在复位;我去掉上拉电阻,觉得很有希望解决问题了,但是测试结果是:有时候能唤醒,有时候不能,我仔细一想难道是因为STM32待机后管脚电平不确定,导致读卡芯片
发表于 2018-05-04

P87LPC762单片机写CC1000内部寄存器的程序

P87LPC762单片机写CC1000内部寄存器的程序如下:C程序write_com(uchar addr,uchar com_data) //写内部寄存器子程序{ char i;addr<<=1;pale=0; //允许地址锁存for(i=0;i<7;i++) { //送地址addr<<=1;p_data=CY;pclk=0; //上升沿pclk=1;}p_data=1; //写操作pclk=0;pclk=1;pale=1; //禁止地址锁存for(i=0;i<8;i++){com_data<<=1;p_data=CY;pclk=0;pclk=1;}}
发表于 2018-03-11

基于ARM、嵌入式Linux和CC2530构建的无线气象数据通信系统开发

以及ZigBee、ZigBee PRO和ZigBee RF4CE标准,提供101 dB的链路质量,具有高接收灵敏度和强抗干扰性,同时具有低功耗、低成本、时延短、高安全等特点。此外,系统采用Samsung S3C2440AL来实现高分辨率彩色显示、触摸控制、高速数据处理及管理、网络接口扩展等需要。    CC2530与S3C2440AL之间采用串口通信,其连接如图2所示。CC2530的串行数据发送端P0_3与S3C2440AL的串行数据接收端RXD1相连,CC25 30的串行数据接收端P0_2与S3C2440AL的串行数据发送端TXD1相连。此处将CC2530的设备类型设置为协调器,实现无线接收各个传感器节点
发表于 2018-02-16
基于ARM、嵌入式Linux和CC2530构建的无线气象数据通信系统开发

采用可编程的多核处理器SoC体系的CC1100架构设计

    CC1100是第二代数字多媒体处理器,外形如图1所示。    CC1100采用可编程的多核处理器SoC体系架构设计。主CPU是主频350MHz的超级标量RISC处理器.运行Linux操作系统。它可以每个指令周期执行4条指令,并支持硬件双线程技术。视频编解码工作由3个可编程但不同架构的子处理器(256位的向量处理器,Motion Estimation引擎和Entropy引擎)分阶段协同完成。异构的多DSP架构将复杂的运动图像的处理流程按照其功能和运算复杂度特性分解成多个相对独立的过程,然后用不同架构的处理器去适应和处理运动图像在编解码过程中算法复杂度的变化,平衡性能,灵活性
发表于 2018-02-16
采用可编程的多核处理器SoC体系的CC1100架构设计

基于STM32和CC2520的TinyOS移植方法

,WSN)是一种应用相关的网络。需要对某些操作系统进行移植。本文采用TinyOS作为软件平台,成功移植了Radio、Timer、USART、SPI和General I/O等5个底层模块。测试结果表明,移植的5个底层模块能够正常工作。    1 MCU和无线模块介绍    STM32系列按性能分成两个系列:STM32F103“增强型”系列和STM32F101“基本型”系列,时钟频率达到72 MHz,是同类产品中性能最高的产品。本项目采用芯片STM32F103RBT6。CC2520选用第二代ZigBee/IEEE 802.15.4无线电频率(RF)收发器。    2 TinyOS
发表于 2018-02-12
基于STM32和CC2520的TinyOS移植方法

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved