433MHz模块stm8、cc1101

发布者:精品古钱斋最新更新时间:2016-06-13 来源: eefocus关键字:433MHz  stm8  cc1101 手机看文章 扫描二维码
随时随地手机看文章
前一段时间画了一个CC1101收发小板子,但是一直没有成功,最后发现把27nH的电感焊接成了27uH,最终导致失败.

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

433MHz模块stm8、cc1101
 

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

 

下面是STM8程序

CC1101.C433MHz模块stm8、cc1101

 
  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.H433MHz模块stm8、cc1101

 
  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. }  

实现透传,调试中发现问题就是接收的时候必须关闭发射增益,否则无法接收,应该是内部发送接收天线进行了切换.
关键字:433MHz  stm8  cc1101 引用地址:433MHz模块stm8、cc1101

上一篇:CC1101 433无线模块,STM8串口透传
下一篇:NRF24L01无线通讯模块驱动

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

IAR+STM8——ADC模数转换器
今天有空来继续写学习笔记。STM8片上集成了10位逐次比较型模数转换器,在开发板上有个电位器接到了AIN3,但没有可以显示数据的LED数码管或LCD液晶显示屏,怎么办呢?通过前面的学习,这个问题不难解决,在这里可以把AD采集数据通过UART发送到电脑上显示。 #i nclude iostm8s207sb.h void CLK_init(void) { CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M } void GPIO_init(void) { PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出 PD_CR1 = 0x08; // 设置PD3为推挽输出 PD_CR2 =
[单片机]
STM8定时器实现精准延时(阻塞)
定时器选择: stm8定时器与stm32定时器略有不同,stm32定时器是24位--16,777,216,按照72M时钟8分频计算,周期达到1.86s左右,而stm8定时器是16/8--位65535/255,自身时钟为16M,即使16分频周期也远小于1s。 当前选择TIM2定时器,1分频,最大周期65536/16 约等于 4096us。 初始化 void TIM_Delay_Init() { /* 自动重装载值范围TIM4为0~255,TIM2为0~65535*/ TIM2_TimeBaseInit(TIM2_PRESCALER_1,65535); //65535*(1/16)≈4095us TIM2_Cmd(
[单片机]
STM8单片机 PWM无波形输出解决方法
  调试STM8单片机PWM功能的时候,经常会遇到一种情况,就是PWM初始化设置完成之后,程序下载到单片机中,确没有任何波形的输出。有时候代码是下载别的调试好的,但是在自己芯片上就是没有波形输出。这时要么骂双穿代码的人忽悠人,上传的代码是错的,要么怀疑自己的单片机坏了。   现在就来分析一下,命名代码正确,但是确没有波形输出这种情况要如何分析判断。   首先来看一下PWM的初始化代码 void TIM1_Init( void ) { TIM1_CCMR2 = 0x60; //TIM1 CH2 输出模式 PWM1 TIM1_CCER1 |= 0x10; //CC2为输出 TIM1_PSCRH
[单片机]
<font color='red'>STM8</font>单片机 PWM无波形输出解决方法
STM8单片机对LCD模块的驱动
STM8L152XX系列带有片上段式LCD驱动程序,这为低成本应用和高密度系统设计提供了保证,利用片上LCD驱动模块,可以有效的控制系统整体功耗,简化系统结构,从整体来说可靠性得到提高。 此处不介绍LCD驱动模块的原理以及驱动时序,请参考STM8原版英文说明文档,已描述的很详细,以下介绍其寄存器的配置方法以及编程方法。 时钟,系统时钟同样用来产生LCD驱动时钟,通过时钟模块配置: CLK_PCKENR2|=S3; //LCD 使能LCD模块时钟 CLK_CRTCR=S7|S6|S5|S1; //RTC&LCD-》FCLK/128 注意RTC和LCD是共同一路时钟 以上配置根据实际时钟进行调整,我在此处采用FCLK=HSI=
[单片机]
<font color='red'>STM8</font>单片机对LCD模块的驱动
关于IAREWSTM8 HEX文件
研究了一下BIN与HEX的关系,发现由BIN转到HEX比较简单,但是由BIN转到HEX就觉得多了一行东西。 上图看一下: 用别人写的代码也是一样多出来。 上网找了一下发现也有人跟我遇到相同的问题: http://bbs.21ic.com/icview-187817-1-1.html 并且给出了答案 以 :0400000508004ABDE8 为例子。 其中的地址是0x08004ABD,当下载代码到芯片里后(不勾选 run to main),程序恰好停在 0x08004ABD,对应于标号: __iar_program_start 维基百科是这么说: http://en.wikipedia.org/wik
[单片机]
关于IAREWSTM8 HEX文件
vfd with stm8
之前写了pt6311的驱动,要做时钟考虑使用stm8做主控,于是乎将之前的驱动移植到stm8上。 顺带熟悉了stm8的操作2333. 上源码: 1 #ifndef PT6311_H 2 #define PT6311_H 3 4 #include stm8s.h 5 #include delay.h 6 #include iostm8s103f3.h //inc the .h to use bit control 7 8 9 extern u8 dspbuf ,dspseg ; 10 extern const u8 ADDR ; //addr 11 extern const u16 font
[单片机]
STM8串口UART2_SendData8函数连续发送数据丢失
1、STM8用UART2_SendData8(uint8_t Data)函数发送数据时,数据会丢失,因为库函数没有判读是否发送完成; 2、寄存器修改如下: void UART2_SendData8(uint8_t Data) { /* Transmit Data */ unsigned int max_delay =0; UART2- DR = Data; while(1) { if((UART2- SR &0X40) != 0)break; max_delay++; if(max_delay 10000)break; } } 2、库函数修改如下
[单片机]
<font color='red'>STM8</font>串口UART2_SendData8函数连续发送数据丢失
STM8S学习笔记之四(STM8 time1)
这几天一直纠结于使用STM8库还是用底层寄存器写程序,用了用IAR和库的搭配,方便时肯定的,但是呢,鉴于我现在工作使用的就是STM32的单片机+STM32库,考虑再三,我还是用底层吧,这样两个就可以互补了,既不会太依赖于库,又对寄存器的操作有更深的了解。。只是都是相通的,是的,相通的。。 以下是从技术手册上粘贴的: TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。 本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。 高级控制定时器适用于许多不同的用途: ●基本的定时 ●测量输入信号的脉冲宽度(输入捕获) ●产生输出波形(输出比较
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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