码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-14 22:21:09      阅读:461      评论:0      收藏:0      [点我收藏+]

标签:

 

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

 

技术分享

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

 

下面是STM8程序

CC1101.C

 

[cpp] view plaincopy技术分享技术分享
 
  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技术分享技术分享
 
  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技术分享技术分享
 
  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. }  

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

 

 

实物图

技术分享   技术分享

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

标签:

原文地址:http://www.cnblogs.com/zym0805/p/4646646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!