CC1101 433无线模块,STM8串口透传
原理图:http://download.csdn.net/detail/cp1300/7496509
下面是STM8程序
CC1101.C
[cpp] view plaincopy
- /*************************************************************************************************************
- * 文件名: CC1101.c
- * 功能: STM8 CC1101驱动函数
- * 作者: [email protected]
- * 创建时间: 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
- * 返回 : 寄存器的值
- * 依赖 : 底层宏定义
- * 作者 : [email protected]
- * 时间 : 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
- * 返回 : 寄存器的值
- * 依赖 : 底层宏定义
- * 作者 : [email protected]
- * 时间 : 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:需要写入的数据
- * 返回 : 状态寄存器的值
- * 依赖 : 底层宏定义
- * 作者 : [email protected]
- * 时间 : 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:需要写入的数据长度
- * 返回 : 无
- * 依赖 : 底层宏定义
- * 作者 : [email protected]
- * 时间 : 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:需要读取的数据长度
- * 返回 : 无
- * 依赖 : 底层宏定义
- * 作者 : [email protected]
- * 时间 : 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
[cpp] view plaincopy
- /*************************************************************************************************************
- * 文件名: CC1101.c
- * 功能: STM8 CC1101驱动函数
- * 作者: [email protected]
- * 创建时间: 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收发透传
[cpp] view plaincopy
- #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();
- }
- }
- }
实现透传,调试中发现问题就是接收的时候必须关闭发射增益,否则无法接收,应该是内部发送接收天线进行了切换.
实物图
时间: 2024-10-31 19:37:06