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

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

下面是STM8程序

CC1101.C

  1. /*************************************************************************************************************
  2. * 文件名: CC1101.c
  3. * 功能:  STM8 CC1101驱动函数
  4. * 作者:  [email protected]
  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. * 作者    :   [email protected]
  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. * 作者    :   [email protected]
  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. * 作者    :   [email protected]
  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. * 作者    :   [email protected]
  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. * 作者    :   [email protected]
  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. * 作者:  [email protected]
  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. }

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

实物图

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

南京沃辉通信科技有限公司
电话:13611517245,18602550298
传真:025-83492035
地址:南京市鼓楼区广东路38号
05-11 21:54