原理图:http://download.csdn.net/detail/cp1300/7496509
下面是STM8程序
CC1101.C
- /*************************************************************************************************************
- *文件名:CC1101.c
- *功用:STM8CC1101驱动函数
- *作者:cp1300@139.com
- *创立时刻:2013-12-0614:35
- *最终修正时刻:2013-12-06
- *具体:433MHZ收发芯片驱动
- *************************************************************************************************************/
- #include”system.h”
- #include”delay.h”
- #include”CC1101.h”
- //CC1101指令掩码
- #defineWRITE_BURST0x40//接连写入
- #defineREAD_SINGLE0x80//读
- #defineWRITE_SINGLE0x00//写
- #defineREAD_BURST0xC0
- //接连读
- #defineBURST_READ_FIFO0xff//突发读取RXFIFO
- #defineBYTE_READ_FIFO0xBF//单字节读取RXFIFO
- #defineBURST_WRITE_FIFO0x7f//突发写TXFIFO
- #defineBYTE_WRITE_FIFO0x3f//单字节写TXFIFO
- #defineCC1101_DATA_LEN64
- //SPI接口
- //底层接口宏界说
- #defineCC1101_CS_H()(GPIOA->ODR=BIT3)//PA3=1
- #defineCC1101_CS_L()(GPIOA->ODR&=~BIT3)//PA3=0
- #defineCC1101_MOSI_H()(GPIOC->ODR=BIT6)//PC6
- #defineCC1101_MOSI_L()(GPIOC->ODR&=~BIT6)//PC6
- #defineCC1101_SCLK_H()(GPIOC->ODR=BIT5)//PC5
- #defineCC1101_SCLK_L()(GPIOC->ODR&=~BIT5)//PC5
- #defineCC1101_GetMISO()(GPIOC->IDR&BIT7)//PC7
- //CC1101SPI读写一字节
- //不带片选
- u8CC1101_ReadWriteByte(u8data)
- {
- u8i;
- u8temp=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();//时钟下降沿读取数据
- }
- returntemp;
- }
- /*************************************************************************************************************************
- *函数:u8CC1101_Command(CC1101_CMD_TYPECmd)
- *功用:发送单字节指令
- *参数:Cmd;指令,见CC1101_CMD_TYPE
- *回来:寄存器的值
- *依靠:底层宏界说
- *作者:cp1300@139.com
- *时刻:2013-12-06
- *最终修正时刻:2013-12-06
- *阐明:以写的方法单直接拜访将触发呼应的指令
- *************************************************************************************************************************/
- u8CC1101_Command(CC1101_CMD_TYPECmd)
- {
- u8status;
- CC1101_CS_L();//片选有用
- while(CC1101_GetMISO());
- status=CC1101_ReadWriteByte((u8)Cmd);//发送指令
- while(CC1101_GetMISO());
- CC1101_CS_H();//片选封闭
- returnstatus;
- }
- /*************************************************************************************************************************
- *函数:u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
- *功用:读取CC1101通用寄存器
- *参数:RegAddr:寄存器地址,见:CC1101_REG_TYPE
- *回来:寄存器的值
- *依靠:底层宏界说
- *作者:cp1300@139.com
- *时刻:2013-12-06
- *最终修正时刻:2013-12-06
- *阐明:一次读取一个寄存器
- *************************************************************************************************************************/
- u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
- {
- u8data;
- CC1101_CS_L();//片选有用
- CC1101_ReadWriteByte((u8)READ_SINGLERegAddr);//发送读指令以及寄存器索引
- data=CC1101_ReadWriteByte(0xff);//读取
- CC1101_CS_H();//片选封闭
- returndata;
- }
- /*************************************************************************************************************************
- *函数:u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
- *功用:写入CC1101通用寄存器
- *参数:RegAddr:寄存器地址,见:CC1101_REG_TYPE,data:需求写入的数据
- *回来:状况寄存器的值
- *依靠:底层宏界说
- *作者:cp1300@139.com
- *时刻:2013-12-06
- *最终修正时刻:2013-12-06
- *阐明:一次写入一个寄存器,并回来状况
- 不要对只读的寄存器进行写操作
- *************************************************************************************************************************/
- u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
- {
- u8status;
- if(RegAddr>0x80)return0;//避免误操作,0x30今后的寄存器为只读状况寄存器
- CC1101_CS_L();//片选有用
- while(CC1101_GetMISO());
- status=CC1101_ReadWriteByte((u8)WRITE_SINGLERegAddr);//发送写指令以及寄存器索引
- CC1101_ReadWriteByte(data);//写入数据
- CC1101_CS_H();//片选封闭
- returnstatus;
- }
- #include”LED.h”
- voidCC1101_Init(u8Addr)
- {
- //初始化片选
- 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);//RXFIFO和TXFIFO门限
- 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);
- }
- /*************************************************************************************************************************
- *函数:voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
- *功用:写入数据到发送缓冲区
- *参数:pBuff:需求写入的数据缓冲区指针,len:需求写入的数据长度
- *回来:无
- *依靠:底层宏界说
- *作者:cp1300@139.com
- *时刻:2014-01-01
- *最终修正时刻:2014-01-01
- *阐明:写入数据到发送FIFO
- *************************************************************************************************************************/
- voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
- {
- u16i;
- CC1101_CS_L();
- CC1101_ReadWriteByte(BURST_WRITE_FIFO);
- for(i=0;i
- {
- CC1101_ReadWriteByte(pBuff[i]);
- }
- CC1101_CS_H();
- }
- /*************************************************************************************************************************
- *函数:voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
- *功用:读取接纳缓冲区
- *参数:pBuff:需求读取的数据缓冲区指针,len:需求读取的数据长度
- *回来:无
- *依靠:底层宏界说
- *作者:cp1300@139.com
- *时刻:2014-01-01
- *最终修正时刻:2014-01-01
- *阐明:从接纳FIFO读取数据
- *************************************************************************************************************************/
- voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
- {
- u16i;
- CC1101_CS_L();
- CC1101_ReadWriteByte(BURST_READ_FIFO);
- for(i=0;i
- {
- pBuff[i]=CC1101_ReadWriteByte(0xff);
- }
- CC1101_CS_H();
- }
- //发送数据,将缓冲区数据悉数发送出去
- //一次最多64B,由于遭到FIFO约束
- voidCC1101_RfDataSend(u8*pBuff,u8len)
- {
- 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
- voidCC1101_RfDataSendPack(u8*pBuff,u16len)
- {
- u16i,m,n,j;
- m=len/(CC1101_DATA_LEN-1);//整数数据帧数量
- n=len%(CC1101_DATA_LEN-1);//余数
- //发送整数包
- for(i=0;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
- {
- CC1101_ReadWriteByte(*pBuff++);//写入数据到发送缓冲区
- }
- CC1101_CS_H();
- CC1101_Command(CC1101_CMD_STX);//开端发送数据
- while(!CC1101_GDO0);
- while(CC1101_GDO0);//等候发送完结
- }
- CC1101_Command(CC1101_CMD_SIDLE);//退出当时形式
- }
- //读取芯片状况
- u8CC1101_GetStatus(void)
- {
- returnCC1101_WriteReg(CC1101_REG_TEST2,0x98);
- }
CC1101.H
- /*************************************************************************************************************
- *文件名:CC1101.c
- *功用:STM8CC1101驱动函数
- *作者:cp1300@139.com
- *创立时刻:2013-12-0614:35
- *最终修正时刻:2013-12-06
- *具体:433MHZ收发芯片驱动
- *************************************************************************************************************/
- #ifndef_CC1101_H_
- #define_CC1101_H_
- #include”system.h”
- //CC1101指令
- //以写的方法单直接拜访将触发呼应的指令
- typedefenum
- {
- 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,//冲刷RXFIFO缓冲
- CC1101_CMD_SFTX=0x3b,//冲刷TXFIFO缓冲
- CC1101_CMD_SWORRST=0x3c,//从头设置实在时刻时钟
- CC1101_CMD_SNOP=0x3d,//无操作。或许用来为更简略的软件将滤波指令变为2字节。
- }CC1101_CMD_TYPE;
- //CC1101寄存器界说
- typedefenum
- {
- //可读写的寄存器
- CC1101_REG_IOCFG2=0x00,//GDO2输出脚装备
- CC1101_REG_IOCFG1=0x01,//GDO1输出脚装备
- CC1101_REG_IOCFG0=0x02,//GDO0输出脚装备
- CC1101_REG_FIFOTHR=0x03,//RXFIFO和TXFIFO门限
- 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,//TXFIFO中的下溢和比特数
- CC1101_REG_RXBYTES=0xfB,//RXFIFO中的下溢和比特数
- //手册上面没有的
- 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
- #defineCC1101_GDO0(GPIOC->IDR&BIT3)//PC3
- #defineCC1101_GDO2(GPIOC->IDR&BIT4)//PC4
- voidCC1101_Init(u8Addr);//初始化CC1101
- u8CC1101_ReadReg(CC1101_REG_TYPERegAddr);//读取CC1101通用寄存器
- u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data);//写入CC1101通用寄存器
- u8CC1101_Command(CC1101_CMD_TYPECmd);//发送单字节指令
- u8CC1101_GetStatus(void);//读取芯片状况
- voidCC1101_RfDataSend(u8*pBuff,u8len);
- voidCC1101_ReadRxFIFO(u8*pBuff,u8len);
- //CC1101PackSize有用数据包巨细,0-64,也便是CC1101单次发送数据巨细-1
- voidCC1101_RfDataSendPack(u8*pBuff,u16len);
- #endif//CC1101
MAIN.C收发透传
- #include”system.h”
- #include”uart1.h”
- #include”delay.h”
- #include”main.h”
- #include”LED.h”
- #include”cc1101.h”
- //串口缓冲区
- #defineUART_BUFF_SIZE256//串口接纳缓冲区巨细
- u8UartBuff[2][UART_BUFF_SIZE];//串口接纳缓冲区
- u16UartLen1=0;//串口接纳数据长度
- u16UartLen2=0;//串口接纳数据长度
- //CC1101缓冲区
- #defineRF_BUFF_SIZE64//CC1101缓冲区巨细
- u8RfBuff[RF_BUFF_SIZE];//CC1101缓冲区
- u8RfLen=0;//CC1101接纳缓冲区巨细
- //缓冲区挑选
- u8UART_RxNum=0;//串口缓冲区挑选
- //主函数
- voidmain(void)
- {
- u8LastNum=0;
- u32delay=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==120)
- {
- 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();
- }
- }
- }
完成透传,调试中发现问题便是接纳的时分有必要封闭发射增益,不然无法接纳,应该是内部发送接纳天线进行了切换.
实物图