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

发布者:技术旅人最新更新时间:2016-06-13 来源: eefocus关键字:CC1101  无线模块  STM8  串口透传 手机看文章 扫描二维码
随时随地手机看文章

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

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

 

下面是STM8程序

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

 
  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_SINGLERegAddr);  //发送读命令以及寄存器索引  
  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_SINGLERegAddr);    //发送写命令以及寄存器索引  
  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

 

 
  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收发透传

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

 
  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 == 120)  
  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串口透传

 

关键字:CC1101  无线模块  STM8  串口透传 引用地址:CC1101 433无线模块,STM8串口透传

上一篇:单片机spi驱动SD卡
下一篇:433MHz模块stm8、cc1101

推荐阅读最新更新时间:2024-03-16 14:56

STM8 主时钟源
下面4种时钟源可用做主时钟: 1-24MHz高速外部晶体振荡器(HSE) 最大24MHz高速外部时钟信号(HSE user-ext) 16MHz高速内部RC振荡器(HSI) 128KHz低速内部RC(LSI) 各个时钟源可单独打开或关闭,从而优化功耗。 (一)HSE 高速外部时钟信号可由下面两个时钟源产生: HSE外部晶体/陶瓷谐振器 HSE用户外部有源时钟 (图14:STM8 HSE时钟源) 为了最大限度减小输出失真和减小启动的稳定时间,谐振器和负载电容应尽可能得靠近振荡器引脚。负载电容值应根据所选的振荡器进行调整。 外部晶体/陶瓷谐振器(HSE晶体) 外部1至24MHz的振荡器其优点在于能
[单片机]
<font color='red'>STM8</font> 主时钟源
STM8做BUS OFF快慢恢复策略
前言: CAN总线上出现错误会导致CAN控制器进入BUS OFF状态,具体的可以参考CAN的规范。 CAN控制器提供自动恢复和手动恢复功能。 1.自动恢复 自动恢复比较简单,初始化的时候打开自动恢复功能。要求不高的话建议打开,否则CAN BUS OFF一直无法恢复通信。 CAN- MCR |= CAN_MasterCtrl_AutoBusOffManagement;/*atuo bus off recovery */ 2.手动恢复 一般车厂要求ECU不能自动恢复,而是先快恢复后慢恢复。 常用的就是:先100ms恢复5次,然后是1000ms恢复一次。 具体的就是: (1)发生BUS OFF后,立即
[单片机]
STM8工具之IAR--调试
调试是看数据变化 补充 IAR中的 Options — c/c++ compiler— Optimization — Level 选项: Level的缺省值为Low,当我把Level选为None之后,即不执行任何优化时,全局变量、静态局部变量、局部变量的值都可以看到,如下图所示。 当我把优化等级选为Midium或者High之后,全局变量、静态局部变量、局部变量的值都不可见了。 结论:要想观察局部变量的值,调试的时候可以把优化等级设为None.
[单片机]
<font color='red'>STM8</font>工具之IAR--调试
STM8学习笔记1:CPU简介
写在前面   最近项目中涉及到一些实时性要求很高的底层驱动设计,在IAR下用C语言写完后总是感觉响应不是足够快,平时在网上会看到很多嵌入式大牛直接通过汇编来写,效果超级明显。之前在学校里接触过51的汇编,感觉又low又难懂。随着时间的推移,越来越有一种潜意识,觉得高级程序虽然有着开发效率高的特点,但有一些地方的局限还是很多大的,如果想要继续深入地了解和运用一些单片机底层的资源,能且只能通过汇编来实现。现在工作中接触的MCU主要是STM8系列,所以就从他开始吧! STM8 简介   意法半导体的这款8位单片机一直知名度不高,在上学时,一般耳熟能详的八位机都有PIC、51、AIR之类,STM系列也只听说过STM32,工作后接触到S
[单片机]
<font color='red'>STM8</font>学习笔记1:CPU简介
STM8学习笔记---如何在程序中确定寄存器名称
在刚开始写程序的时候,在程序中需要设置寄存器的时候,往往不知道寄存器名称怎么写才是对的,这时候可以通过头文件来查看寄存器是如何调用的。在打开一个IAR工程文件,打开main.c文件,然后再引用的头文件上单击鼠标右键,选择Open iostm8s003F3.h 打开所引用的头文件。 假如我们要设置PB5口输出0,首先在STM8中文参考手册中找到GPIO输出寄存器 我们要设置的是PB_ODR寄存器,这时在打开的iostm8s003F3.h文件中按下Ctrl+F按钮,然后输入PB_ODR,点Find Next 这时候就会定位到PB_ODR寄存器宏定义位置处 #define PB_ODR_ODR0 PB_ODR_bit.ODR
[单片机]
<font color='red'>STM8</font>学习笔记---如何在程序中确定寄存器名称
stvd使用中的一些问题
1.stm8_interrupt_vector.c 会莫名其妙的自动出现,而且都是在项目目录下。进行如下操作 2.stvd编译时遇到no default placement for segment .FLASH_CODE 进行如下操作settings- linker- category- Input,然后Code,constants那一区域添加.FLASH_CODE,注意要大写!
[单片机]
stvd使用中的一些问题
IAR for stm8 go to define 不能跳转的解决办法
我使用IAR for stm8 go to define 时,不能跳转,而且编译器也没有任何提示,百度找了好多办法都没有用,最后发现要编译一次才能有用 注意:不是直接编译,而是要先把代码稍微改动一下再编译,保证所有文件都过了一遍,再有用 没有用的情况如下 一般都是编译过后,再编译就会这样,如果 go to define没有用,那么编译100次也没用 改动代码后的编译情况如下 看出区别了吗,这样一般就能使用go to define了,亲测可用 第一次的情况相当于没编译 改动代码随便改一点然后再删除,然文件上有一个*,就说明有改动,编译才有效
[单片机]
IAR for <font color='red'>stm8</font> go to define 不能跳转的解决办法
STM8 电源管理
默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外设提供时钟,MCU功耗最大。 在运行模式下,为了保持CPU继续运行并执行代码,有下列几种途径可降低功率消耗: ● 降低系统时钟 ● 关闭未使用外设的时钟 ● 关闭所有未使用的模拟功能块 但是,如果CPU不需要保持运行,可使用下列三种低功耗模式: ● 等待(Wait) ● 活跃停机(Active Halt)( 可配置为慢速或快速唤醒) ● 停机(Halt) (可配置为慢速或快速唤醒) 用户可选择以上三种模式中的一种,并合理配置,以在最低功耗、最快唤醒速度和可使
[单片机]
<font color='red'>STM8</font> 电源管理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved