CC1101 433无线模块,STM8串口透传

1 篇文章 0 订阅
1 篇文章 0 订阅

前一段时间画了一个CC1101收发小板子,但是一直没有成功,最后发现把27nH的电感焊接成了27uH,最终导致失败.

现在更换之后可以覆盖我们公司所有的角落,已经够用了.


原理图:http://download.csdn.net/detail/cp1300/7496509


下面是STM8程序

CC1101.C

/*************************************************************************************************************
 * 文件名:	CC1101.c
 * 功能:	STM8 CC1101驱动函数
 * 作者:	cp1300@139.com
* 创建时间:	2013-12-06 14:35
 * 最后修改时间:2013-12-06
 * 详细:	433MHZ收发芯片驱动
*************************************************************************************************************/
#include "system.h"
#include "delay.h"
#include "CC1101.h"

//CC1101命令掩码
#define 	WRITE_BURST     	0x40						//连续写入
#define 	READ_SINGLE     	0x80						//读
#define 	WRITE_SINGLE     	0x00						//写
#define 	READ_BURST          0xC0



//连续读
#define 	BURST_READ_FIFO		0xff		//突发读取RX FIFO
#define 	BYTE_READ_FIFO		0xBF		//单字节读取 RX FIFO
#define 	BURST_WRITE_FIFO	0x7f		//突发写TX FIFO
#define 	BYTE_WRITE_FIFO		0x3f		//单字节写 TX FIFO

#define CC1101_DATA_LEN	64



//SPI接口
//底层接口宏定义
#define CC1101_CS_H()   			(GPIOA->ODR|=BIT3)      	//PA3=1
#define CC1101_CS_L()   			(GPIOA->ODR&=~BIT3)     	//PA3=0
#define CC1101_MOSI_H()				(GPIOC->ODR|=BIT6)			//PC6
#define CC1101_MOSI_L()				(GPIOC->ODR&=~BIT6)			//PC6
#define CC1101_SCLK_H()				(GPIOC->ODR|=BIT5)			//PC5
#define CC1101_SCLK_L()				(GPIOC->ODR&=~BIT5)			//PC5
#define CC1101_GetMISO()			(GPIOC->IDR&BIT7)			//PC7


//CC1101 SPI读写一字节
//不带片选
u8 CC1101_ReadWriteByte(u8 data)
{
	u8 i;
	u8 temp = 0;

	for(i = 0;i < 8;i ++)
	{
		if(data & 0x80)
		{
			CC1101_MOSI_H();
		}
		else
		{
			CC1101_MOSI_L();
		}
		data <<= 1;nop;
		CC1101_SCLK_H();	            //时钟上升沿写入数据
		temp <<= 1;nop;
		if(CC1101_GetMISO()) temp ++;
		CC1101_SCLK_L();	            //时钟下降沿读取数据
	}

	return temp;
}


/*************************************************************************************************************************
* 函数	:	u8 CC1101_Command(CC1101_CMD_TYPE Cmd)
* 功能	:	发送单字节命令
* 参数	:	Cmd;命令,见CC1101_CMD_TYPE
* 返回	:	寄存器的值
* 依赖	:	底层宏定义
* 作者	:	cp1300@139.com
* 时间	:	2013-12-06
* 最后修改时间 : 2013-12-06
* 说明	: 	以写的方式单直接访问将触发响应的命令
*************************************************************************************************************************/
u8 CC1101_Command(CC1101_CMD_TYPE Cmd)
{
	u8 status;

	CC1101_CS_L();	                            //片选有效
    while(CC1101_GetMISO());
	status = CC1101_ReadWriteByte((u8)Cmd);	    //发送命令
    while(CC1101_GetMISO());
	CC1101_CS_H();	                            //片选关闭
	return status;
}



/*************************************************************************************************************************
* 函数	:	u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)
* 功能	:	读取CC1101通用寄存器
* 参数	:	RegAddr:寄存器地址,见:CC1101_REG_TYPE
* 返回	:	寄存器的值
* 依赖	:	底层宏定义
* 作者	:	cp1300@139.com
* 时间	:	2013-12-06
* 最后修改时间 : 2013-12-06
* 说明	: 	一次读取一个寄存器
*************************************************************************************************************************/
u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)
{
	u8 data;

	CC1101_CS_L();	                                //片选有效
	CC1101_ReadWriteByte((u8)READ_SINGLE|RegAddr);	//发送读命令以及寄存器索引
	data = CC1101_ReadWriteByte(0xff);				//读取
	CC1101_CS_H();	                                //片选关闭
	return data;
}


/*************************************************************************************************************************
* 函数	:	u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)
* 功能	:	写入CC1101通用寄存器
* 参数	:	RegAddr:寄存器地址,见:CC1101_REG_TYPE,data:需要写入的数据
* 返回	:	状态寄存器的值
* 依赖	:	底层宏定义
* 作者	:	cp1300@139.com
* 时间	:	2013-12-06
* 最后修改时间 : 2013-12-06
* 说明	: 	一次写入一个寄存器,并返回状态
			不要对只读的寄存器进行写操作
*************************************************************************************************************************/
u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)
{
	u8 status;

	if(RegAddr > 0x80) return 0;		                        //防止误操作,0x30以后的寄存器为只读状态寄存器
	CC1101_CS_L();	                                            //片选有效
    while(CC1101_GetMISO());
	status = CC1101_ReadWriteByte((u8)WRITE_SINGLE|RegAddr);	//发送写命令以及寄存器索引
	CC1101_ReadWriteByte(data);			                        //写入数据
	CC1101_CS_H();	                                            //片选关闭
	return status;
}


#include "LED.h"
void CC1101_Init(u8 Addr)
{

	//初始化片选
    GPIOx_Init(GPIOA, BIT3, OUT_PP_10M);
    CC1101_CS_H();
	//初始化SCLK
	GPIOx_Init(GPIOC, BIT5, OUT_PP_10M);
    CC1101_SCLK_H();
	//初始化MOSI
	GPIOx_Init(GPIOC, BIT6, OUT_PP_10M);
    CC1101_MOSI_H();
	//初始化MISO
	GPIOx_Init(GPIOC, BIT7, IN_UP);

	CC1101_SCLK_L();
	CC1101_MOSI_L();
    //初始化GDO0,GDO2对应PC3,PC4
    GPIOx_Init(GPIOC, BIT3, IN_UP);
    GPIOx_Init(GPIOC, BIT4, IN_UP);

	//初始化寄存器
	CC1101_Command(CC1101_CMD_SRES);	                //复位
	Delay_MS(10);
	
	while(CC1101_ReadReg(CC1101_REG_AGCTEST) != 0x3F)	//检测通信
	{
		LED_ON();
		Delay_MS(10);
		LED_OFF();
		Delay_MS(100);
	}
	LED_OFF();

    CC1101_WriteReg(CC1101_REG_IOCFG0,0x06);            //发送提示引脚
    CC1101_WriteReg(CC1101_REG_IOCFG2,0x01);            //接收提示引脚

    CC1101_WriteReg(CC1101_REG_FIFOTHR,0x0f);           //RX FIFO和TX FIFO门限
    CC1101_WriteReg(CC1101_REG_SYNC1,0xD3);             //同步词汇,高字节
    CC1101_WriteReg(CC1101_REG_SYNC0,0x91);             //同步词汇,低字节
    CC1101_WriteReg(CC1101_REG_PKTLEN,CC1101_DATA_LEN); //数据包长度,255
    CC1101_WriteReg(CC1101_REG_PKTCTRL1,0x04);          //数据包自动控制
    CC1101_WriteReg(CC1101_REG_PKTCTRL0,0x04);          //数据包自动控制
    CC1101_WriteReg(CC1101_REG_ADDR,0x00);              //设备地址
    CC1101_WriteReg(CC1101_REG_CHANNR,0x00);            //信道
    CC1101_WriteReg(CC1101_REG_FSCTRL1,0x06);           //频率合成器控制,高字节
    CC1101_WriteReg(CC1101_REG_FSCTRL0,0x00);           //频率合成器控制,低字节
    CC1101_WriteReg(CC1101_REG_FREQ2,0x10);             //频率控制词汇,高字节
    CC1101_WriteReg(CC1101_REG_FREQ1,0xb1);             //频率控制词汇,中间字节
    CC1101_WriteReg(CC1101_REG_FREQ0,0x3b);             //频率控制词汇,低字节
	
	//2.4KBPS
    CC1101_WriteReg(CC1101_REG_MDMCFG4,0xF6);           //调制器配置
    CC1101_WriteReg(CC1101_REG_MDMCFG3,0x83);           //调制器配置
	
    CC1101_WriteReg(CC1101_REG_MDMCFG2,0x13);           //调制器配置
    CC1101_WriteReg(CC1101_REG_MDMCFG1,0x22);           //调制器配置
    CC1101_WriteReg(CC1101_REG_MDMCFG0,0xf8);           //调制器配置
	
    CC1101_WriteReg(CC1101_REG_DEVIATN,0x15);           //调制器背离设置
    CC1101_WriteReg(CC1101_REG_MCSM2,0x07);             //主通信控制状态机配置
    CC1101_WriteReg(CC1101_REG_MCSM1,0x30);             //主通信控制状态机配置
    CC1101_WriteReg(CC1101_REG_MCSM0,0x18);             //主通信控制状态机配置
    CC1101_WriteReg(CC1101_REG_FOCCFG,0x16);            //频率偏移补偿配置
    CC1101_WriteReg(CC1101_REG_BSCFG,0x6c);             //位同步配置
    CC1101_WriteReg(CC1101_REG_AGCTRL2,0x03);           //AGC控制
    CC1101_WriteReg(CC1101_REG_AGCTRL1,0x40);           //AGC控制
    CC1101_WriteReg(CC1101_REG_AGCTRL0,0x91);           //AGC控制
    CC1101_WriteReg(CC1101_REG_WOREVT1,0x87);           //高字节时间0暂停
    CC1101_WriteReg(CC1101_REG_WOREVT0,0x6b);           //低字节时间0暂停
    CC1101_WriteReg(CC1101_REG_WORCTRL,0xfb);           //电磁波激活控制
    CC1101_WriteReg(CC1101_REG_FREND1,0x56);            //前末端RX配置
    CC1101_WriteReg(CC1101_REG_FREND0,0x10);            //前末端TX配置
    CC1101_WriteReg(CC1101_REG_FSCAL3,0xe9);            //频率合成器校准
    CC1101_WriteReg(CC1101_REG_FSCAL2,0x2a);            //频率合成器校准
    CC1101_WriteReg(CC1101_REG_FSCAL1,0x00);            //频率合成器校准
    CC1101_WriteReg(CC1101_REG_FSCAL0,0x1f);            //频率合成器校准
    CC1101_WriteReg(CC1101_REG_RCCTRL1,0x41);           //RC振荡器配置
    CC1101_WriteReg(CC1101_REG_RCCTRL0,0x00);           //RC振荡器配置
    CC1101_WriteReg(CC1101_REG_FSTEST,0x59);            //频率合成器校准控制
	
	//10DB
	//CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0); 
	//CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0); 
	/*CC1101_WriteReg(CC1101_REG_PATABLE2,0xc0); 
	CC1101_WriteReg(CC1101_REG_PATABLE3,0xc0); 
	CC1101_WriteReg(CC1101_REG_PATABLE4,0xc0); 
	CC1101_WriteReg(CC1101_REG_PATABLE5,0xc0); 
	CC1101_WriteReg(CC1101_REG_PATABLE6,0xc0); 
	CC1101_WriteReg(CC1101_REG_PATABLE7,0xc0); */
	Delay_MS(10);
}



/*************************************************************************************************************************
* 函数	:	void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)
* 功能	:	写入数据到发送缓冲区
* 参数	:	pBuff:需要写入的数据缓冲区指针,len:需要写入的数据长度
* 返回	:	无
* 依赖	:	底层宏定义
* 作者	:	cp1300@139.com
* 时间	:	2014-01-01
* 最后修改时间 : 2014-01-01
* 说明	: 	写入数据到发送FIFO
*************************************************************************************************************************/
void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)
{
    u16 i;

    CC1101_CS_L();
    CC1101_ReadWriteByte(BURST_WRITE_FIFO);
    for(i = 0;i < len;i ++)
    {
        CC1101_ReadWriteByte(pBuff[i]);
    }
    CC1101_CS_H();
}



/*************************************************************************************************************************
* 函数	:	void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)
* 功能	:	读取接收缓冲区
* 参数	:	pBuff:需要读取的数据缓冲区指针,len:需要读取的数据长度
* 返回	:	无
* 依赖	:	底层宏定义
* 作者	:	cp1300@139.com
* 时间	:	2014-01-01
* 最后修改时间 : 2014-01-01
* 说明	: 	从接收FIFO读取数据
*************************************************************************************************************************/
void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)
{
    u16 i;

    CC1101_CS_L();
    CC1101_ReadWriteByte(BURST_READ_FIFO);
    for(i = 0;i < len;i ++)
    {
        pBuff[i] = CC1101_ReadWriteByte(0xff);
    }
    CC1101_CS_H();
}


//发送数据,将缓冲区数据全部发送出去
//一次最多64B,因为受到FIFO限制
void CC1101_RfDataSend(u8 *pBuff,u8 len)
{
    CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
    CC1101_Command(CC1101_CMD_SFTX);   	//清空发送缓冲区
    CC1101_WriteTxFIFO(pBuff, len);    	//写入数据到发送缓冲区
    CC1101_Command(CC1101_CMD_STX);   	//开始发送数据
	
    while(!CC1101_GDO0);
    while(CC1101_GDO0);

    CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
}





//发送数据包
//每次发送最多65B,第一字节为长度,数据多将会重复发送
//可以发送任意大小
//CC1101PackSize有效数据包大小,0-64,也就是CC1101单次发送数据大小-1
void CC1101_RfDataSendPack(u8 *pBuff, u16 len)
{
	u16 i,m,n,j;
	
	m = len / (CC1101_DATA_LEN-1);			//整数数据帧数量
	n = len % (CC1101_DATA_LEN-1);			//余数
	
	//发送整数包
	for(i = 0;i < m;i ++)				
	{
		Delay_MS(1);
		CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
    	CC1101_Command(CC1101_CMD_SFTX);   	//清空发送缓冲区
		
		CC1101_CS_L();
		CC1101_ReadWriteByte(BURST_WRITE_FIFO);
		
		CC1101_ReadWriteByte(CC1101_DATA_LEN-1);//先写入包大小	
		for(j = 0;j < (CC1101_DATA_LEN-1);j ++)
		{
			CC1101_ReadWriteByte(*pBuff++);	//写入数据到发送缓冲区
		}
		CC1101_CS_H();
		
		CC1101_Command(CC1101_CMD_STX);   	//开始发送数据
		while(!CC1101_GDO0);
		while(CC1101_GDO0);					//等待发送完成
	}
	//发送余数包
	if(n!=0)
	{
		Delay_MS(1);
		CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
    	CC1101_Command(CC1101_CMD_SFTX);   	//清空发送缓冲区
		CC1101_CS_L();
		CC1101_ReadWriteByte(BURST_WRITE_FIFO);
		
		CC1101_ReadWriteByte(n);			//先写入包大小	
		for(j = 0;j < n;j ++)
		{
			CC1101_ReadWriteByte(*pBuff++);	//写入数据到发送缓冲区
		}
		CC1101_CS_H();
		
		CC1101_Command(CC1101_CMD_STX);   	//开始发送数据
		while(!CC1101_GDO0);
		while(CC1101_GDO0);					//等待发送完成
	}
    CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
}







//读取芯片状态
u8 CC1101_GetStatus(void)
{
    return CC1101_WriteReg(CC1101_REG_TEST2, 0x98);
}


CC1101.H

/*************************************************************************************************************
 * 文件名:	CC1101.c
 * 功能:	STM8 CC1101驱动函数
 * 作者:	cp1300@139.com
* 创建时间:	2013-12-06 14:35
 * 最后修改时间:2013-12-06
 * 详细:	433MHZ收发芯片驱动
*************************************************************************************************************/
#ifndef _CC1101_H_
#define _CC1101_H_
#include "system.h"


//CC1101 命令
//以写的方式单直接访问将触发响应的命令
typedef enum
{
	CC1101_CMD_SRES		=	0x30,	//重启
	CC1101_CMD_SFSTXON	=	0x31,	//开启和校准频率合成器(若MCSM0.FSAUTOCAL=1)
	CC1101_CMD_SXOFF	=	0x32,	//关闭晶体振荡器
	CC1101_CMD_SCAL		=	0x33,	//校准频率合成器并关断(开启快速启动)。在不设置手动校准模式(MCSM0.FS_AUTOCAL=0)的情况下,SCAL能从空闲模式滤波。
	CC1101_CMD_SRX		=	0x34,	//启用RX。若上一状态为空闲且MCSM0.FS_AUTOCAL=1则首先运行校准。
	CC1101_CMD_STX		=	0x35,	//空闲状态:启用TX。若MCSM0.FS_AUTOCAL=1首先运行校准。若在RX状态且CCA启用:若信道为空则进入TX
	CC1101_CMD_SIDLE	=	0x36,	//离开RX/TX,关断频率合成器并离开电磁波激活模式若可用
	CC1101_CMD_SAFC		=	0x37,	//运行22.1节列出的频率合成器的AFC调节
	CC1101_CMD_SWOR		=	0x38,	//运行27.5节描述的自动RX选举序列(电磁波激活)
	CC1101_CMD_SPWD		=	0x39,	//当CSn为高时进入功率降低模式。
	CC1101_CMD_SFRX		=	0x3a,	//冲洗RX FIFO缓冲
	CC1101_CMD_SFTX		=	0x3b,	//冲洗TX FIFO缓冲
	CC1101_CMD_SWORRST	=	0x3c,	//重新设置真实时间时钟
	CC1101_CMD_SNOP		=	0x3d,	//无操作。可能用来为更简单的软件将滤波命令变为2字节。
}CC1101_CMD_TYPE;



//CC1101寄存器定义
typedef enum
{
	//可读写的寄存器
	CC1101_REG_IOCFG2		=	0x00,	//GDO2输出脚配置
	CC1101_REG_IOCFG1		=	0x01,	//GDO1输出脚配置
	CC1101_REG_IOCFG0		=	0x02,	//GDO0输出脚配置
	CC1101_REG_FIFOTHR		=	0x03,	//RX FIFO和TX FIFO门限
	CC1101_REG_SYNC1		=	0x04,	//同步词汇,高字节
	CC1101_REG_SYNC0		=	0x05,	//同步词汇,低字节
	CC1101_REG_PKTLEN		=	0x06,	//数据包长度
	CC1101_REG_PKTCTRL1		=	0x07,	//数据包自动控制
	CC1101_REG_PKTCTRL0		=	0x08,	//数据包自动控制
	CC1101_REG_ADDR			=	0x09,	//设备地址
	CC1101_REG_CHANNR		=	0x0a,	//信道数
	CC1101_REG_FSCTRL1		=	0x0b,	//频率合成器控制,高字节
	CC1101_REG_FSCTRL0		=	0x0c,	//频率合成器控制,低字节
	CC1101_REG_FREQ2		=	0x0d,	//频率控制词汇,高字节
	CC1101_REG_FREQ1		=	0x0e,	//频率控制词汇,中间字节
	CC1101_REG_FREQ0		=	0x0f,	//频率控制词汇,低字节
	CC1101_REG_MDMCFG4		=	0x10,	//调制器配置
	CC1101_REG_MDMCFG3		=	0x11,	//调制器配置
	CC1101_REG_MDMCFG2		=	0x12,	//调制器配置
	CC1101_REG_MDMCFG1		=	0x13,	//调制器配置
	CC1101_REG_MDMCFG0		=	0x14,	//调制器配置
	CC1101_REG_DEVIATN		=	0x15,	//调制器背离设置
	CC1101_REG_MCSM2		=	0x16,	//主通信控制状态机配置
	CC1101_REG_MCSM1		=	0x17,	//主通信控制状态机配置
	CC1101_REG_MCSM0		=	0x18,	//主通信控制状态机配置
	CC1101_REG_FOCCFG		=	0x19,	//频率偏移补偿配置
	CC1101_REG_BSCFG		=	0x1a,	//位同步配置
	CC1101_REG_AGCTRL2		=	0x1b,	//AGC控制
	CC1101_REG_AGCTRL1		=	0x1c,	//AGC控制
	CC1101_REG_AGCTRL0		=	0x1d,	//AGC控制
	CC1101_REG_WOREVT1		=	0x1e,	//高字节时间0暂停
	CC1101_REG_WOREVT0		=	0x1f,	//低字节时间0暂停
	CC1101_REG_WORCTRL		=	0x20,	//电磁波激活控制
	CC1101_REG_FREND1		=	0x21,	//前末端RX配置
	CC1101_REG_FREND0		=	0x22,	//前末端TX配置
	CC1101_REG_FSCAL3		=	0x23,	//频率合成器校准
	CC1101_REG_FSCAL2		=	0x24,	//频率合成器校准
	CC1101_REG_FSCAL1		=	0x25,	//频率合成器校准
	CC1101_REG_FSCAL0		=	0x26,	//频率合成器校准
	CC1101_REG_RCCTRL1		=	0x27,	//RC振荡器配置
	CC1101_REG_RCCTRL0		=	0x28,	//RC振荡器配置
	CC1101_REG_FSTEST		=	0x29,	//频率合成器校准控制
	CC1101_REG_PTEST		=	0x2a,	//产品测试
	CC1101_REG_AGCTEST		=	0x2b,	//AGC测试
	CC1101_REG_TEST2		=	0x2c,	//不同的测试设置
	CC1101_REG_TEST1		=	0x2d,	//不同的测试设置
	CC1101_REG_TEST0		=	0x2e,	//不同的测试设置
	//只读的状态寄存器,如果写入将导致命令滤波
	CC1101_REG_PARTNUM		=	0xf0,	//CC2550的组成部分数目
	CC1101_REG_VERSION		=	0xf1,	//当前版本数
	CC1101_REG_FREQEST		=	0xf2,	//频率偏移估计
	CC1101_REG_LQI			=	0xf3,	//连接质量的解调器估计
	CC1101_REG_RSSI			=	0xf4,	//接收信号强度指示
	CC1101_REG_MARCSTATE	=	0xf5,	//控制状态机状态
	CC1101_REG_WORTIME1		=	0xf6,	//WOR计时器高字节
	CC1101_REG_WORTIME0		=	0xf7,	//WOR计时器低字节
	CC1101_REG_PKTSTATUS	=	0xf8,	//当前GDOx状态和数据包状态
	CC1101_REG_VCOVCDAC		=	0xf9,	//PLL校准模块的当前设定
	CC1101_REG_TXBYTES		=	0xfA,	//TX FIFO中的下溢和比特数
	CC1101_REG_RXBYTES		=	0xfB,	//RX FIFO中的下溢和比特数
	//手册上面没有的
	CC1101_REG_STATUS1		=	0xfc,	//
	CC1101_REG_STATUS0		=	0xfd,	//
	//功率控制
	CC1101_REG_PATABLE0		=	0x40,
	CC1101_REG_PATABLE1		=	0x41,
	CC1101_REG_PATABLE2		=	0x42,
	CC1101_REG_PATABLE3		=	0x43,
	CC1101_REG_PATABLE4		=	0x44,
	CC1101_REG_PATABLE5		=	0x45,
	CC1101_REG_PATABLE6		=	0x46,
	CC1101_REG_PATABLE7		=	0x47,
}CC1101_REG_TYPE;

//IO
#define CC1101_GDO0                 (GPIOC->IDR&BIT3)           //PC3
#define CC1101_GDO2                 (GPIOC->IDR&BIT4)           //PC4

void CC1101_Init(u8 Addr);	//初始化CC1101
u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr);	//读取CC1101通用寄存器
u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data);//写入CC1101通用寄存器
u8 CC1101_Command(CC1101_CMD_TYPE Cmd);	//发送单字节命令

u8 CC1101_GetStatus(void);//读取芯片状态

void CC1101_RfDataSend(u8 *pBuff,u8 len);
void CC1101_ReadRxFIFO(u8 *pBuff,u8 len);

//CC1101PackSize有效数据包大小,0-64,也就是CC1101单次发送数据大小-1
void CC1101_RfDataSendPack(u8 *pBuff, u16 len);

#endif //CC1101



MAIN.C收发透传

#include "system.h"
#include "uart1.h"
#include "delay.h"
#include "main.h"
#include "LED.h"
#include "cc1101.h"

//串口缓冲区
#define UART_BUFF_SIZE	256			//串口接收缓冲区大小
u8 UartBuff[2][UART_BUFF_SIZE];		//串口接收缓冲区
u16 UartLen1 = 0;						//串口接收数据长度
u16 UartLen2 = 0;						//串口接收数据长度


//CC1101缓冲区
#define RF_BUFF_SIZE	64			//CC1101缓冲区大小
u8 RfBuff[RF_BUFF_SIZE];			//CC1101缓冲区
u8 RfLen = 0;						//CC1101接收缓冲区大小


//缓冲区选择
u8 UART_RxNum	 = 0;				//串口缓冲区选择
 

//主函数
void main(void)
{
	u8 LastNum = 0;
	u32 delay = 0;
	
    SYS_ClockInit();										//初始化系统时钟为内部晶振, 16MHZ
	//初始化LED
	LED_Init();
	//初始化串口
	UART1_Init(115200, ENABLE);								//初始化UART1,开启接收中断
	UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);	//设置串口1接收缓冲区
	CC1101_Init(0Xaa);
	//CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);


	CC1101_WriteReg(CC1101_REG_PATABLE0,0x00);
	CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
	CC1101_Command(CC1101_CMD_SRX);     //进入接收模式	
	

	SYS_EnableInterrupt();						//开启系统中断
	while(1)
    {
	
		
		if(++delay == 120000)
		{
			delay = 0;
			UartLen1 = UART1_GetRxCnt();	//获取接收数据数量
			if(UartLen1>0)
			{
				SYS_DisableInterrupt();					//关闭中断
				LED_ON();
				LastNum = UART_RxNum;					//记录上一次的缓冲区编号
				UART_RxNum = (~UART_RxNum)&0x01;
				UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);	//切换串口接收缓冲区
				//UART1_ClearRxCnt();						//清除接收计数器
				SYS_EnableInterrupt();					//开启系统中断
				
				CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);//开启天线增益
				
				CC1101_RfDataSendPack(UartBuff[LastNum], UartLen1);//CC1101发送数据包
				
				CC1101_WriteReg(CC1101_REG_PATABLE0,0);	//关闭天线增益
				CC1101_Command(CC1101_CMD_SIDLE);   	//退出当前模式
				CC1101_Command(CC1101_CMD_SRX);     	//进入接收模式
				LED_OFF();
			}
		}
		
		//CC1101接收到数据
		if(CC1101_GDO2)
        {
            LED_ON();
            RfLen = CC1101_ReadReg(CC1101_REG_RXBYTES);
			CC1101_ReadRxFIFO(RfBuff,RfLen);
			UART1_SendData(&RfBuff[1], RfBuff[0]);//第0B为数据长度,后面的为有效数据
			CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式
    		CC1101_Command(CC1101_CMD_SFRX);   	//清除接收缓冲区
			CC1101_Command(CC1101_CMD_SRX);     //进入接收模式
			LED_OFF();
        }

    }
}

实现透传,调试中发现问题就是接收的时候必须关闭发射增益,否则无法接收,应该是内部发送接收天线进行了切换.


实物图

   


  • 13
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cp1300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值