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

下面是STM8程序

CC1101.C

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

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

MAIN.C收发透传

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

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

实物图

   

南京沃辉通信科技有限公司
邮箱:hong_gen@wohuitx.com
电话:13611517245,18602550298
传真:025-83492035
地址:南京市鼓楼区广东路38号

CC1101 433无线模块,STM8串口透传的更多相关文章

  1. ESP8266局域网智能家居 路由器下作服务器模式串口透传 无线通信控制 arduino uno示例 模板参考

    准备工作 下载一个Arduino IDE, 下载8266的库文件 ESP8266服务器模式串口透传编译 功能说明 1.直接使用路由器中转数据 2.手机放热点模式直接传输数据 两者有访问IP地址的差别, ...

  2. tcp与串口透传(select)

    介绍 tcp作为服务端,监听端口8888,实现串口透传,这里是使用select监听tcp的receive和串口的read,单工通信 -p 指定tcp端口 -s 指定串口 -b 指定波特率 支持4800 ...

  3. ESP8266局域网 路由器下作服务器模式串口透传 arduino uno示例 模板参考2

    ESP8266服务器模式串口透传编译需要下载8266的库文件后才可以正常 准备工作 下载一个Arduino IDE,下载8266的库文件ESP8266服务器模式串口透传编译 功能说明 1.直接使用路由 ...

  4. 16-ESP8266 SDK开发基础入门篇--TCP 服务器 非RTOS运行版,串口透传(串口回调函数处理版)

    https://www.cnblogs.com/yangfengwu/p/11105466.html 其实官方给的RTOS的版本就是在原先非RTOS版本上增加的 https://www.cnblogs ...

  5. 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP透传模式传输数据流步骤

    测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...

  6. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

    https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮  F1 4C为CRC高位和低位 ...

  7. wifi实现串口透传

    环境: 串口服务器Ip:172.16.1.11 串口客户机ip:172.16.1.12 一.网络连接示意图 二.串口服务器的配置 参考:ser2net的编译及测试 三.串口客户端的配置 实际上这是一个 ...

  8. python 串口 透传

    python正常情况通过串口 serial  传输数据的时候,都是以字符串的形式发送的 str = ‘abcd’ ser.write(str.encode())#直接发送str报错,需要发送byte类 ...

  9. 蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现

           蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现        尽管蓝牙4.0 BLE芯片CC2540 是单芯片(即用户能够对它进行芯片级代码编写), 是80 ...

随机推荐

  1. uv计算

    lightmap shadowmap heightmap 它们有一个自己的camera 对应cameraMatrix float3 TransfromToTextureCoord(float4 Pos ...

  2. 探讨android更新UI的几种方法(转)

    作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...

  3. linux grep的选项

    grep  -i          关闭大写和小写敏感性 grep      -v    打印全部不包括. . 的行(屏蔽某些条目) grep     -l     打印包括模式的文件名称 grep  ...

  4. Android跟踪NDK崩溃信息

    1.NDK编译jni时增加调试信息: $NDK_ROOT/ndk-build -B NDK_DEBUG=1 2.发生崩溃时,logcat中收集日志: - ::): Added shared lib / ...

  5. idea autoscroll from source

  6. winlogon.exe应用程序错误怎么办

    winlogon.exe应用程序错误 求解决办法,重装,还原一定能解决就不要说了,我要其他办法 最佳答案 winlogon.exe 是控制你的系统登陆的程序,是系统绝对核心进程,用来管理系统用户登陆! ...

  7. iOS设备定位服务开启判定

    应用CLLocationManager 的两个方法 [CLLocationManagerlocationServicesEnabled] 判断设备是否开启定位功能 [CLLocationManager ...

  8. Linux下好用的命令

    split -l 10000 articles.json  将文件按行分成多个文件

  9. Python—— 性能分析入门指南

    虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...

  10. windows下at命令使用详解

    T命令是Windows XP中内置的命令,它也可以媲美Windows中的“计划任务”,而且在计划的安排.任务的管理.工作事务的处理方面,AT命令具有更强大更神通的功能.AT命令可在指定时间和日期.在指 ...