社区导航

 

搜索
查看: 50|回复: 0

[资料分享] CC1101 433无线模块,STM8串口透传

[复制链接]

5949

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2020-1-11 20:01 | 显示全部楼层 |阅读模式

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

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

image.png

下面是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);
    }
    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 = 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();
        }
 
    }
}

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


实物图

image.png

此帖出自无线连接论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-30 04:47 , Processed in 0.083376 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表