zoukankan      html  css  js  c++  java
  • CC1101 433无线模块,STM8串口透传

     

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

     

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

    下面是STM8程序

    CC1101.C

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /************************************************************************************************************* 
    2.  * 文件名: CC1101.c 
    3.  * 功能:  STM8 CC1101驱动函数 
    4.  * 作者:  cp1300@139.com 
    5. * 创建时间: 2013-12-06 14:35 
    6.  * 最后修改时间:2013-12-06 
    7.  * 详细:  433MHZ收发芯片驱动 
    8. *************************************************************************************************************/  
    9. #include "system.h"  
    10. #include "delay.h"  
    11. #include "CC1101.h"  
    12.   
    13. //CC1101命令掩码  
    14. #define     WRITE_BURST         0x40                        //连续写入  
    15. #define     READ_SINGLE         0x80                        //读  
    16. #define     WRITE_SINGLE        0x00                        //写  
    17. #define     READ_BURST          0xC0  
    18.   
    19.   
    20.   
    21. //连续读  
    22. #define     BURST_READ_FIFO     0xff        //突发读取RX FIFO  
    23. #define     BYTE_READ_FIFO      0xBF        //单字节读取 RX FIFO  
    24. #define     BURST_WRITE_FIFO    0x7f        //突发写TX FIFO  
    25. #define     BYTE_WRITE_FIFO     0x3f        //单字节写 TX FIFO  
    26.   
    27. #define CC1101_DATA_LEN 64  
    28.   
    29.   
    30.   
    31. //SPI接口  
    32. //底层接口宏定义  
    33. #define CC1101_CS_H()               (GPIOA->ODR|=BIT3)       //PA3=1  
    34. #define CC1101_CS_L()               (GPIOA->ODR&=~BIT3)      //PA3=0  
    35. #define CC1101_MOSI_H()             (GPIOC->ODR|=BIT6)           //PC6  
    36. #define CC1101_MOSI_L()             (GPIOC->ODR&=~BIT6)          //PC6  
    37. #define CC1101_SCLK_H()             (GPIOC->ODR|=BIT5)           //PC5  
    38. #define CC1101_SCLK_L()             (GPIOC->ODR&=~BIT5)          //PC5  
    39. #define CC1101_GetMISO()            (GPIOC->IDR&BIT7)            //PC7  
    40.   
    41.   
    42. //CC1101 SPI读写一字节  
    43. //不带片选  
    44. u8 CC1101_ReadWriteByte(u8 data)  
    45. {  
    46.     u8 i;  
    47.     u8 temp = 0;  
    48.   
    49.     for(i = 0;i < 8;i ++)  
    50.     {  
    51.         if(data & 0x80)  
    52.         {  
    53.             CC1101_MOSI_H();  
    54.         }  
    55.         else  
    56.         {  
    57.             CC1101_MOSI_L();  
    58.         }  
    59.         data <<= 1;nop;  
    60.         CC1101_SCLK_H();                //时钟上升沿写入数据  
    61.         temp <<= 1;nop;  
    62.         if(CC1101_GetMISO()) temp ++;  
    63.         CC1101_SCLK_L();                //时钟下降沿读取数据  
    64.     }  
    65.   
    66.     return temp;  
    67. }  
    68.   
    69.   
    70. /************************************************************************************************************************* 
    71. * 函数    :   u8 CC1101_Command(CC1101_CMD_TYPE Cmd) 
    72. * 功能    :   发送单字节命令 
    73. * 参数    :   Cmd;命令,见CC1101_CMD_TYPE 
    74. * 返回    :   寄存器的值 
    75. * 依赖    :   底层宏定义 
    76. * 作者    :   cp1300@139.com 
    77. * 时间    :   2013-12-06 
    78. * 最后修改时间 : 2013-12-06 
    79. * 说明    :   以写的方式单直接访问将触发响应的命令 
    80. *************************************************************************************************************************/  
    81. u8 CC1101_Command(CC1101_CMD_TYPE Cmd)  
    82. {  
    83.     u8 status;  
    84.   
    85.     CC1101_CS_L();                              //片选有效  
    86.     while(CC1101_GetMISO());  
    87.     status = CC1101_ReadWriteByte((u8)Cmd);     //发送命令  
    88.     while(CC1101_GetMISO());  
    89.     CC1101_CS_H();                              //片选关闭  
    90.     return status;  
    91. }  
    92.   
    93.   
    94.   
    95. /************************************************************************************************************************* 
    96. * 函数    :   u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr) 
    97. * 功能    :   读取CC1101通用寄存器 
    98. * 参数    :   RegAddr:寄存器地址,见:CC1101_REG_TYPE 
    99. * 返回    :   寄存器的值 
    100. * 依赖    :   底层宏定义 
    101. * 作者    :   cp1300@139.com 
    102. * 时间    :   2013-12-06 
    103. * 最后修改时间 : 2013-12-06 
    104. * 说明    :   一次读取一个寄存器 
    105. *************************************************************************************************************************/  
    106. u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)  
    107. {  
    108.     u8 data;  
    109.   
    110.     CC1101_CS_L();                                  //片选有效  
    111.     CC1101_ReadWriteByte((u8)READ_SINGLE|RegAddr);  //发送读命令以及寄存器索引  
    112.     data = CC1101_ReadWriteByte(0xff);              //读取  
    113.     CC1101_CS_H();                                  //片选关闭  
    114.     return data;  
    115. }  
    116.   
    117.   
    118. /************************************************************************************************************************* 
    119. * 函数    :   u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data) 
    120. * 功能    :   写入CC1101通用寄存器 
    121. * 参数    :   RegAddr:寄存器地址,见:CC1101_REG_TYPE,data:需要写入的数据 
    122. * 返回    :   状态寄存器的值 
    123. * 依赖    :   底层宏定义 
    124. * 作者    :   cp1300@139.com 
    125. * 时间    :   2013-12-06 
    126. * 最后修改时间 : 2013-12-06 
    127. * 说明    :   一次写入一个寄存器,并返回状态 
    128.             不要对只读的寄存器进行写操作 
    129. *************************************************************************************************************************/  
    130. u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)  
    131. {  
    132.     u8 status;  
    133.   
    134.     if(RegAddr > 0x80) return 0;                             //防止误操作,0x30以后的寄存器为只读状态寄存器  
    135.     CC1101_CS_L();                                              //片选有效  
    136.     while(CC1101_GetMISO());  
    137.     status = CC1101_ReadWriteByte((u8)WRITE_SINGLE|RegAddr);    //发送写命令以及寄存器索引  
    138.     CC1101_ReadWriteByte(data);                                 //写入数据  
    139.     CC1101_CS_H();                                              //片选关闭  
    140.     return status;  
    141. }  
    142.   
    143.   
    144. #include "LED.h"  
    145. void CC1101_Init(u8 Addr)  
    146. {  
    147.   
    148.     //初始化片选  
    149.     GPIOx_Init(GPIOA, BIT3, OUT_PP_10M);  
    150.     CC1101_CS_H();  
    151.     //初始化SCLK  
    152.     GPIOx_Init(GPIOC, BIT5, OUT_PP_10M);  
    153.     CC1101_SCLK_H();  
    154.     //初始化MOSI  
    155.     GPIOx_Init(GPIOC, BIT6, OUT_PP_10M);  
    156.     CC1101_MOSI_H();  
    157.     //初始化MISO  
    158.     GPIOx_Init(GPIOC, BIT7, IN_UP);  
    159.   
    160.     CC1101_SCLK_L();  
    161.     CC1101_MOSI_L();  
    162.     //初始化GDO0,GDO2对应PC3,PC4  
    163.     GPIOx_Init(GPIOC, BIT3, IN_UP);  
    164.     GPIOx_Init(GPIOC, BIT4, IN_UP);  
    165.   
    166.     //初始化寄存器  
    167.     CC1101_Command(CC1101_CMD_SRES);                    //复位  
    168.     Delay_MS(10);  
    169.       
    170.     while(CC1101_ReadReg(CC1101_REG_AGCTEST) != 0x3F)   //检测通信  
    171.     {  
    172.         LED_ON();  
    173.         Delay_MS(10);  
    174.         LED_OFF();  
    175.         Delay_MS(100);  
    176.     }  
    177.     LED_OFF();  
    178.   
    179.     CC1101_WriteReg(CC1101_REG_IOCFG0,0x06);            //发送提示引脚  
    180.     CC1101_WriteReg(CC1101_REG_IOCFG2,0x01);            //接收提示引脚  
    181.   
    182.     CC1101_WriteReg(CC1101_REG_FIFOTHR,0x0f);           //RX FIFO和TX FIFO门限  
    183.     CC1101_WriteReg(CC1101_REG_SYNC1,0xD3);             //同步词汇,高字节  
    184.     CC1101_WriteReg(CC1101_REG_SYNC0,0x91);             //同步词汇,低字节  
    185.     CC1101_WriteReg(CC1101_REG_PKTLEN,CC1101_DATA_LEN); //数据包长度,255  
    186.     CC1101_WriteReg(CC1101_REG_PKTCTRL1,0x04);          //数据包自动控制  
    187.     CC1101_WriteReg(CC1101_REG_PKTCTRL0,0x04);          //数据包自动控制  
    188.     CC1101_WriteReg(CC1101_REG_ADDR,0x00);              //设备地址  
    189.     CC1101_WriteReg(CC1101_REG_CHANNR,0x00);            //信道  
    190.     CC1101_WriteReg(CC1101_REG_FSCTRL1,0x06);           //频率合成器控制,高字节  
    191.     CC1101_WriteReg(CC1101_REG_FSCTRL0,0x00);           //频率合成器控制,低字节  
    192.     CC1101_WriteReg(CC1101_REG_FREQ2,0x10);             //频率控制词汇,高字节  
    193.     CC1101_WriteReg(CC1101_REG_FREQ1,0xb1);             //频率控制词汇,中间字节  
    194.     CC1101_WriteReg(CC1101_REG_FREQ0,0x3b);             //频率控制词汇,低字节  
    195.       
    196.     //2.4KBPS  
    197.     CC1101_WriteReg(CC1101_REG_MDMCFG4,0xF6);           //调制器配置  
    198.     CC1101_WriteReg(CC1101_REG_MDMCFG3,0x83);           //调制器配置  
    199.       
    200.     CC1101_WriteReg(CC1101_REG_MDMCFG2,0x13);           //调制器配置  
    201.     CC1101_WriteReg(CC1101_REG_MDMCFG1,0x22);           //调制器配置  
    202.     CC1101_WriteReg(CC1101_REG_MDMCFG0,0xf8);           //调制器配置  
    203.       
    204.     CC1101_WriteReg(CC1101_REG_DEVIATN,0x15);           //调制器背离设置  
    205.     CC1101_WriteReg(CC1101_REG_MCSM2,0x07);             //主通信控制状态机配置  
    206.     CC1101_WriteReg(CC1101_REG_MCSM1,0x30);             //主通信控制状态机配置  
    207.     CC1101_WriteReg(CC1101_REG_MCSM0,0x18);             //主通信控制状态机配置  
    208.     CC1101_WriteReg(CC1101_REG_FOCCFG,0x16);            //频率偏移补偿配置  
    209.     CC1101_WriteReg(CC1101_REG_BSCFG,0x6c);             //位同步配置  
    210.     CC1101_WriteReg(CC1101_REG_AGCTRL2,0x03);           //AGC控制  
    211.     CC1101_WriteReg(CC1101_REG_AGCTRL1,0x40);           //AGC控制  
    212.     CC1101_WriteReg(CC1101_REG_AGCTRL0,0x91);           //AGC控制  
    213.     CC1101_WriteReg(CC1101_REG_WOREVT1,0x87);           //高字节时间0暂停  
    214.     CC1101_WriteReg(CC1101_REG_WOREVT0,0x6b);           //低字节时间0暂停  
    215.     CC1101_WriteReg(CC1101_REG_WORCTRL,0xfb);           //电磁波激活控制  
    216.     CC1101_WriteReg(CC1101_REG_FREND1,0x56);            //前末端RX配置  
    217.     CC1101_WriteReg(CC1101_REG_FREND0,0x10);            //前末端TX配置  
    218.     CC1101_WriteReg(CC1101_REG_FSCAL3,0xe9);            //频率合成器校准  
    219.     CC1101_WriteReg(CC1101_REG_FSCAL2,0x2a);            //频率合成器校准  
    220.     CC1101_WriteReg(CC1101_REG_FSCAL1,0x00);            //频率合成器校准  
    221.     CC1101_WriteReg(CC1101_REG_FSCAL0,0x1f);            //频率合成器校准  
    222.     CC1101_WriteReg(CC1101_REG_RCCTRL1,0x41);           //RC振荡器配置  
    223.     CC1101_WriteReg(CC1101_REG_RCCTRL0,0x00);           //RC振荡器配置  
    224.     CC1101_WriteReg(CC1101_REG_FSTEST,0x59);            //频率合成器校准控制  
    225.       
    226.     //10DB  
    227.     //CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);   
    228.     //CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);   
    229.     /*CC1101_WriteReg(CC1101_REG_PATABLE2,0xc0);  
    230.     CC1101_WriteReg(CC1101_REG_PATABLE3,0xc0);  
    231.     CC1101_WriteReg(CC1101_REG_PATABLE4,0xc0);  
    232.     CC1101_WriteReg(CC1101_REG_PATABLE5,0xc0);  
    233.     CC1101_WriteReg(CC1101_REG_PATABLE6,0xc0);  
    234.     CC1101_WriteReg(CC1101_REG_PATABLE7,0xc0); */  
    235.     Delay_MS(10);  
    236. }  
    237.   
    238.   
    239.   
    240. /************************************************************************************************************************* 
    241. * 函数    :   void CC1101_WriteTxFIFO(u8 *pBuff,u8 len) 
    242. * 功能    :   写入数据到发送缓冲区 
    243. * 参数    :   pBuff:需要写入的数据缓冲区指针,len:需要写入的数据长度 
    244. * 返回    :   无 
    245. * 依赖    :   底层宏定义 
    246. * 作者    :   cp1300@139.com 
    247. * 时间    :   2014-01-01 
    248. * 最后修改时间 : 2014-01-01 
    249. * 说明    :   写入数据到发送FIFO 
    250. *************************************************************************************************************************/  
    251. void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)  
    252. {  
    253.     u16 i;  
    254.   
    255.     CC1101_CS_L();  
    256.     CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
    257.     for(i = 0;i < len;i ++)  
    258.     {  
    259.         CC1101_ReadWriteByte(pBuff[i]);  
    260.     }  
    261.     CC1101_CS_H();  
    262. }  
    263.   
    264.   
    265.   
    266. /************************************************************************************************************************* 
    267. * 函数    :   void CC1101_ReadRxFIFO(u8 *pBuff,u8 len) 
    268. * 功能    :   读取接收缓冲区 
    269. * 参数    :   pBuff:需要读取的数据缓冲区指针,len:需要读取的数据长度 
    270. * 返回    :   无 
    271. * 依赖    :   底层宏定义 
    272. * 作者    :   cp1300@139.com 
    273. * 时间    :   2014-01-01 
    274. * 最后修改时间 : 2014-01-01 
    275. * 说明    :   从接收FIFO读取数据 
    276. *************************************************************************************************************************/  
    277. void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)  
    278. {  
    279.     u16 i;  
    280.   
    281.     CC1101_CS_L();  
    282.     CC1101_ReadWriteByte(BURST_READ_FIFO);  
    283.     for(i = 0;i < len;i ++)  
    284.     {  
    285.         pBuff[i] = CC1101_ReadWriteByte(0xff);  
    286.     }  
    287.     CC1101_CS_H();  
    288. }  
    289.   
    290.   
    291. //发送数据,将缓冲区数据全部发送出去  
    292. //一次最多64B,因为受到FIFO限制  
    293. void CC1101_RfDataSend(u8 *pBuff,u8 len)  
    294. {  
    295.     CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    296.     CC1101_Command(CC1101_CMD_SFTX);    //清空发送缓冲区  
    297.     CC1101_WriteTxFIFO(pBuff, len);     //写入数据到发送缓冲区  
    298.     CC1101_Command(CC1101_CMD_STX);     //开始发送数据  
    299.       
    300.     while(!CC1101_GDO0);  
    301.     while(CC1101_GDO0);  
    302.   
    303.     CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    304. }  
    305.   
    306.   
    307.   
    308.   
    309.   
    310. //发送数据包  
    311. //每次发送最多65B,第一字节为长度,数据多将会重复发送  
    312. //可以发送任意大小  
    313. //CC1101PackSize有效数据包大小,0-64,也就是CC1101单次发送数据大小-1  
    314. void CC1101_RfDataSendPack(u8 *pBuff, u16 len)  
    315. {  
    316.     u16 i,m,n,j;  
    317.       
    318.     m = len / (CC1101_DATA_LEN-1);          //整数数据帧数量  
    319.     n = len % (CC1101_DATA_LEN-1);          //余数  
    320.       
    321.     //发送整数包  
    322.     for(i = 0;i < m;i ++)                  
    323.     {  
    324.         Delay_MS(1);  
    325.         CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    326.         CC1101_Command(CC1101_CMD_SFTX);    //清空发送缓冲区  
    327.           
    328.         CC1101_CS_L();  
    329.         CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
    330.           
    331.         CC1101_ReadWriteByte(CC1101_DATA_LEN-1);//先写入包大小      
    332.         for(j = 0;j < (CC1101_DATA_LEN-1);j ++)  
    333.         {  
    334.             CC1101_ReadWriteByte(*pBuff++); //写入数据到发送缓冲区  
    335.         }  
    336.         CC1101_CS_H();  
    337.           
    338.         CC1101_Command(CC1101_CMD_STX);     //开始发送数据  
    339.         while(!CC1101_GDO0);  
    340.         while(CC1101_GDO0);                 //等待发送完成  
    341.     }  
    342.     //发送余数包  
    343.     if(n!=0)  
    344.     {  
    345.         Delay_MS(1);  
    346.         CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    347.         CC1101_Command(CC1101_CMD_SFTX);    //清空发送缓冲区  
    348.         CC1101_CS_L();  
    349.         CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
    350.           
    351.         CC1101_ReadWriteByte(n);            //先写入包大小      
    352.         for(j = 0;j < n;j ++)  
    353.         {  
    354.             CC1101_ReadWriteByte(*pBuff++); //写入数据到发送缓冲区  
    355.         }  
    356.         CC1101_CS_H();  
    357.           
    358.         CC1101_Command(CC1101_CMD_STX);     //开始发送数据  
    359.         while(!CC1101_GDO0);  
    360.         while(CC1101_GDO0);                 //等待发送完成  
    361.     }  
    362.     CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    363. }  
    364.   
    365.   
    366.   
    367.   
    368.   
    369.   
    370.   
    371. //读取芯片状态  
    372. u8 CC1101_GetStatus(void)  
    373. {  
    374.     return CC1101_WriteReg(CC1101_REG_TEST2, 0x98);  
    375. }  


    CC1101.H

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /************************************************************************************************************* 
    2.  * 文件名: CC1101.c 
    3.  * 功能:  STM8 CC1101驱动函数 
    4.  * 作者:  cp1300@139.com 
    5. * 创建时间: 2013-12-06 14:35 
    6.  * 最后修改时间:2013-12-06 
    7.  * 详细:  433MHZ收发芯片驱动 
    8. *************************************************************************************************************/  
    9. #ifndef _CC1101_H_  
    10. #define _CC1101_H_  
    11. #include "system.h"  
    12.   
    13.   
    14. //CC1101 命令  
    15. //以写的方式单直接访问将触发响应的命令  
    16. typedef enum  
    17. {  
    18.     CC1101_CMD_SRES     =   0x30,   //重启  
    19.     CC1101_CMD_SFSTXON  =   0x31,   //开启和校准频率合成器(若MCSM0.FSAUTOCAL=1)  
    20.     CC1101_CMD_SXOFF    =   0x32,   //关闭晶体振荡器  
    21.     CC1101_CMD_SCAL     =   0x33,   //校准频率合成器并关断(开启快速启动)。在不设置手动校准模式(MCSM0.FS_AUTOCAL=0)的情况下,SCAL能从空闲模式滤波。  
    22.     CC1101_CMD_SRX      =   0x34,   //启用RX。若上一状态为空闲且MCSM0.FS_AUTOCAL=1则首先运行校准。  
    23.     CC1101_CMD_STX      =   0x35,   //空闲状态:启用TX。若MCSM0.FS_AUTOCAL=1首先运行校准。若在RX状态且CCA启用:若信道为空则进入TX  
    24.     CC1101_CMD_SIDLE    =   0x36,   //离开RX/TX,关断频率合成器并离开电磁波激活模式若可用  
    25.     CC1101_CMD_SAFC     =   0x37,   //运行22.1节列出的频率合成器的AFC调节  
    26.     CC1101_CMD_SWOR     =   0x38,   //运行27.5节描述的自动RX选举序列(电磁波激活)  
    27.     CC1101_CMD_SPWD     =   0x39,   //当CSn为高时进入功率降低模式。  
    28.     CC1101_CMD_SFRX     =   0x3a,   //冲洗RX FIFO缓冲  
    29.     CC1101_CMD_SFTX     =   0x3b,   //冲洗TX FIFO缓冲  
    30.     CC1101_CMD_SWORRST  =   0x3c,   //重新设置真实时间时钟  
    31.     CC1101_CMD_SNOP     =   0x3d,   //无操作。可能用来为更简单的软件将滤波命令变为2字节。  
    32. }CC1101_CMD_TYPE;  
    33.   
    34.   
    35.   
    36. //CC1101寄存器定义  
    37. typedef enum  
    38. {  
    39.     //可读写的寄存器  
    40.     CC1101_REG_IOCFG2       =   0x00,   //GDO2输出脚配置  
    41.     CC1101_REG_IOCFG1       =   0x01,   //GDO1输出脚配置  
    42.     CC1101_REG_IOCFG0       =   0x02,   //GDO0输出脚配置  
    43.     CC1101_REG_FIFOTHR      =   0x03,   //RX FIFO和TX FIFO门限  
    44.     CC1101_REG_SYNC1        =   0x04,   //同步词汇,高字节  
    45.     CC1101_REG_SYNC0        =   0x05,   //同步词汇,低字节  
    46.     CC1101_REG_PKTLEN       =   0x06,   //数据包长度  
    47.     CC1101_REG_PKTCTRL1     =   0x07,   //数据包自动控制  
    48.     CC1101_REG_PKTCTRL0     =   0x08,   //数据包自动控制  
    49.     CC1101_REG_ADDR         =   0x09,   //设备地址  
    50.     CC1101_REG_CHANNR       =   0x0a,   //信道数  
    51.     CC1101_REG_FSCTRL1      =   0x0b,   //频率合成器控制,高字节  
    52.     CC1101_REG_FSCTRL0      =   0x0c,   //频率合成器控制,低字节  
    53.     CC1101_REG_FREQ2        =   0x0d,   //频率控制词汇,高字节  
    54.     CC1101_REG_FREQ1        =   0x0e,   //频率控制词汇,中间字节  
    55.     CC1101_REG_FREQ0        =   0x0f,   //频率控制词汇,低字节  
    56.     CC1101_REG_MDMCFG4      =   0x10,   //调制器配置  
    57.     CC1101_REG_MDMCFG3      =   0x11,   //调制器配置  
    58.     CC1101_REG_MDMCFG2      =   0x12,   //调制器配置  
    59.     CC1101_REG_MDMCFG1      =   0x13,   //调制器配置  
    60.     CC1101_REG_MDMCFG0      =   0x14,   //调制器配置  
    61.     CC1101_REG_DEVIATN      =   0x15,   //调制器背离设置  
    62.     CC1101_REG_MCSM2        =   0x16,   //主通信控制状态机配置  
    63.     CC1101_REG_MCSM1        =   0x17,   //主通信控制状态机配置  
    64.     CC1101_REG_MCSM0        =   0x18,   //主通信控制状态机配置  
    65.     CC1101_REG_FOCCFG       =   0x19,   //频率偏移补偿配置  
    66.     CC1101_REG_BSCFG        =   0x1a,   //位同步配置  
    67.     CC1101_REG_AGCTRL2      =   0x1b,   //AGC控制  
    68.     CC1101_REG_AGCTRL1      =   0x1c,   //AGC控制  
    69.     CC1101_REG_AGCTRL0      =   0x1d,   //AGC控制  
    70.     CC1101_REG_WOREVT1      =   0x1e,   //高字节时间0暂停  
    71.     CC1101_REG_WOREVT0      =   0x1f,   //低字节时间0暂停  
    72.     CC1101_REG_WORCTRL      =   0x20,   //电磁波激活控制  
    73.     CC1101_REG_FREND1       =   0x21,   //前末端RX配置  
    74.     CC1101_REG_FREND0       =   0x22,   //前末端TX配置  
    75.     CC1101_REG_FSCAL3       =   0x23,   //频率合成器校准  
    76.     CC1101_REG_FSCAL2       =   0x24,   //频率合成器校准  
    77.     CC1101_REG_FSCAL1       =   0x25,   //频率合成器校准  
    78.     CC1101_REG_FSCAL0       =   0x26,   //频率合成器校准  
    79.     CC1101_REG_RCCTRL1      =   0x27,   //RC振荡器配置  
    80.     CC1101_REG_RCCTRL0      =   0x28,   //RC振荡器配置  
    81.     CC1101_REG_FSTEST       =   0x29,   //频率合成器校准控制  
    82.     CC1101_REG_PTEST        =   0x2a,   //产品测试  
    83.     CC1101_REG_AGCTEST      =   0x2b,   //AGC测试  
    84.     CC1101_REG_TEST2        =   0x2c,   //不同的测试设置  
    85.     CC1101_REG_TEST1        =   0x2d,   //不同的测试设置  
    86.     CC1101_REG_TEST0        =   0x2e,   //不同的测试设置  
    87.     //只读的状态寄存器,如果写入将导致命令滤波  
    88.     CC1101_REG_PARTNUM      =   0xf0,   //CC2550的组成部分数目  
    89.     CC1101_REG_VERSION      =   0xf1,   //当前版本数  
    90.     CC1101_REG_FREQEST      =   0xf2,   //频率偏移估计  
    91.     CC1101_REG_LQI          =   0xf3,   //连接质量的解调器估计  
    92.     CC1101_REG_RSSI         =   0xf4,   //接收信号强度指示  
    93.     CC1101_REG_MARCSTATE    =   0xf5,   //控制状态机状态  
    94.     CC1101_REG_WORTIME1     =   0xf6,   //WOR计时器高字节  
    95.     CC1101_REG_WORTIME0     =   0xf7,   //WOR计时器低字节  
    96.     CC1101_REG_PKTSTATUS    =   0xf8,   //当前GDOx状态和数据包状态  
    97.     CC1101_REG_VCOVCDAC     =   0xf9,   //PLL校准模块的当前设定  
    98.     CC1101_REG_TXBYTES      =   0xfA,   //TX FIFO中的下溢和比特数  
    99.     CC1101_REG_RXBYTES      =   0xfB,   //RX FIFO中的下溢和比特数  
    100.     //手册上面没有的  
    101.     CC1101_REG_STATUS1      =   0xfc,   //  
    102.     CC1101_REG_STATUS0      =   0xfd,   //  
    103.     //功率控制  
    104.     CC1101_REG_PATABLE0     =   0x40,  
    105.     CC1101_REG_PATABLE1     =   0x41,  
    106.     CC1101_REG_PATABLE2     =   0x42,  
    107.     CC1101_REG_PATABLE3     =   0x43,  
    108.     CC1101_REG_PATABLE4     =   0x44,  
    109.     CC1101_REG_PATABLE5     =   0x45,  
    110.     CC1101_REG_PATABLE6     =   0x46,  
    111.     CC1101_REG_PATABLE7     =   0x47,  
    112. }CC1101_REG_TYPE;  
    113.   
    114. //IO  
    115. #define CC1101_GDO0                 (GPIOC->IDR&BIT3)           //PC3  
    116. #define CC1101_GDO2                 (GPIOC->IDR&BIT4)           //PC4  
    117.   
    118. void CC1101_Init(u8 Addr);  //初始化CC1101  
    119. u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr); //读取CC1101通用寄存器  
    120. u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data);//写入CC1101通用寄存器  
    121. u8 CC1101_Command(CC1101_CMD_TYPE Cmd); //发送单字节命令  
    122.   
    123. u8 CC1101_GetStatus(void);//读取芯片状态  
    124.   
    125. void CC1101_RfDataSend(u8 *pBuff,u8 len);  
    126. void CC1101_ReadRxFIFO(u8 *pBuff,u8 len);  
    127.   
    128. //CC1101PackSize有效数据包大小,0-64,也就是CC1101单次发送数据大小-1  
    129. void CC1101_RfDataSendPack(u8 *pBuff, u16 len);  
    130.   
    131. #endif //CC1101  


    MAIN.C收发透传

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include "system.h"  
    2. #include "uart1.h"  
    3. #include "delay.h"  
    4. #include "main.h"  
    5. #include "LED.h"  
    6. #include "cc1101.h"  
    7.   
    8. //串口缓冲区  
    9. #define UART_BUFF_SIZE  256         //串口接收缓冲区大小  
    10. u8 UartBuff[2][UART_BUFF_SIZE];     //串口接收缓冲区  
    11. u16 UartLen1 = 0;                       //串口接收数据长度  
    12. u16 UartLen2 = 0;                       //串口接收数据长度  
    13.   
    14.   
    15. //CC1101缓冲区  
    16. #define RF_BUFF_SIZE    64          //CC1101缓冲区大小  
    17. u8 RfBuff[RF_BUFF_SIZE];            //CC1101缓冲区  
    18. u8 RfLen = 0;                       //CC1101接收缓冲区大小  
    19.   
    20.   
    21. //缓冲区选择  
    22. u8 UART_RxNum    = 0;               //串口缓冲区选择  
    23.    
    24.   
    25. //主函数  
    26. void main(void)  
    27. {  
    28.     u8 LastNum = 0;  
    29.     u32 delay = 0;  
    30.       
    31.     SYS_ClockInit();                                        //初始化系统时钟为内部晶振, 16MHZ  
    32.     //初始化LED  
    33.     LED_Init();  
    34.     //初始化串口  
    35.     UART1_Init(115200, ENABLE);                             //初始化UART1,开启接收中断  
    36.     UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);   //设置串口1接收缓冲区  
    37.     CC1101_Init(0Xaa);  
    38.     //CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);  
    39.   
    40.   
    41.     CC1101_WriteReg(CC1101_REG_PATABLE0,0x00);  
    42.     CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    43.     CC1101_Command(CC1101_CMD_SRX);     //进入接收模式      
    44.       
    45.   
    46.     SYS_EnableInterrupt();                      //开启系统中断  
    47.     while(1)  
    48.     {  
    49.       
    50.           
    51.         if(++delay == 120000)  
    52.         {  
    53.             delay = 0;  
    54.             UartLen1 = UART1_GetRxCnt();    //获取接收数据数量  
    55.             if(UartLen1>0)  
    56.             {  
    57.                 SYS_DisableInterrupt();                 //关闭中断  
    58.                 LED_ON();  
    59.                 LastNum = UART_RxNum;                   //记录上一次的缓冲区编号  
    60.                 UART_RxNum = (~UART_RxNum)&0x01;  
    61.                 UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);   //切换串口接收缓冲区  
    62.                 //UART1_ClearRxCnt();                       //清除接收计数器  
    63.                 SYS_EnableInterrupt();                  //开启系统中断  
    64.                   
    65.                 CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);//开启天线增益  
    66.                   
    67.                 CC1101_RfDataSendPack(UartBuff[LastNum], UartLen1);//CC1101发送数据包  
    68.                   
    69.                 CC1101_WriteReg(CC1101_REG_PATABLE0,0); //关闭天线增益  
    70.                 CC1101_Command(CC1101_CMD_SIDLE);       //退出当前模式  
    71.                 CC1101_Command(CC1101_CMD_SRX);         //进入接收模式  
    72.                 LED_OFF();  
    73.             }  
    74.         }  
    75.           
    76.         //CC1101接收到数据  
    77.         if(CC1101_GDO2)  
    78.         {  
    79.             LED_ON();  
    80.             RfLen = CC1101_ReadReg(CC1101_REG_RXBYTES);  
    81.             CC1101_ReadRxFIFO(RfBuff,RfLen);  
    82.             UART1_SendData(&RfBuff[1], RfBuff[0]);//第0B为数据长度,后面的为有效数据  
    83.             CC1101_Command(CC1101_CMD_SIDLE);   //退出当前模式  
    84.             CC1101_Command(CC1101_CMD_SFRX);    //清除接收缓冲区  
    85.             CC1101_Command(CC1101_CMD_SRX);     //进入接收模式  
    86.             LED_OFF();  
    87.         }  
    88.   
    89.     }  
    90. }  

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

    实物图

       

    南京沃辉通信科技有限公司
    邮箱:hong_gen@wohuitx.com
    电话:13611517245,18602550298
    传真:025-83492035
    地址:南京市鼓楼区广东路38号
  • 相关阅读:
    Python-函数
    Python-运数符
    Python-条件判断
    Python-变量
    移动端页面布局的那些事儿
    关于ie7下display:inline-block;不支持的解决方案
    SuperSlidev2.1 轮播图片和无缝滚动
    解决xmapp中Apache端口号占用问题
    npm 常用命令详解
    python函数总结
  • 原文地址:https://www.cnblogs.com/zym0805/p/4646646.html
Copyright © 2011-2022 走看看