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

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

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

下面是STM8程序

CC1101.C

[cpp] view plaincopy

  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

[cpp] view plaincopy

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

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

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

实物图

   

时间: 2024-10-31 19:37:06

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

「ZigBee模块」协议栈-串口透传,打造无线串口模块

前面写比较仔细,后面一个么因为和前面重复了,不多说了,还有个原因...我懒...O(∩_∩)O哈哈~ 串口透传,打造无线串口模块 一.实验目的 两台PC机各使用串口连接一个zigbee模块,连接正确后打开串口调试助手发送信息.利用zigbee将从串口接收到的数据无线传送给另一个zigbee模块,另一个zigbee模块通过串口将数据传给PC端并在屏幕上显示. 二.实验平台 硬件:两个zigbee模块,两台PC机(其实一台也许,连接不同串口即可),编译器,方口转USB数据线两根 软件:基于Z-sta

ZigBee模块的功能是什么 和433无线模块区别在哪里

ZigBee 是一种基于标准的远程监控.控制和传感器网络应用技术.为满足人们对支持低数据速率.低功耗.安全性和可靠性,而且经济高效的标准型无线网络解决方案的需求,ZigBee 标准应运而生.核心市场是消费类电子产品.能源管理和效率.医疗保健.家庭自动化.电信服务.楼宇自动化以及工业自动化. 什么是ZigBee模块: 围绕ZigBee芯片技术推出的外围电路,称之为"ZigBee模块",常见的ZigBee模块都是遵循IEEE802.15.4的国际标准,并且运行在2.4GHZ的频段上,另外,

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

测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&id=520305709648 USB-TTL调试工具:CP2102 https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-175517240.14.8HGQU4&id=39481188174 连接方法: (这里是用TTL直接调试ESP8266

loRa模块USR-LG220集中器透传版本固件连接透传云通信

1. 硬件连接 2. 说明资料下载地址 WH-L101-L-C模块: 说明书:http://www.mokuai.cn/download/112.html 硬件设计手册:http://www.mokuai.cn/download/manual/137.html 参考设计+封装库:http://www.mokuai.cn/download/manual/135.html 3.软件下载地址及平台地址 有人网络调试助手:http://www.usr.cn/Download/27.html 透传云平台登

wifi实现串口透传

环境: 串口服务器Ip:172.16.1.11 串口客户机ip:172.16.1.12 一.网络连接示意图 二.串口服务器的配置 参考:ser2net的编译及测试 三.串口客户端的配置 实际上这是一个小技巧,只要客户端用串口登陆到终端,输入如下指令,就可以接受服务端发过来的数据,也可以发送数据到服务器. 但有个问题,发送数据到服务器必须要回车才能把数据发出去,而且数据会在本地回显. telnet 172.16.1.11 2001

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

虽然蓝牙4.0 BLE芯片CC2540 是单芯片(即用户可以对它进行芯片级代码编写), 是8051增强型主控, 带蓝牙4.0功能, 但很多时候很多客户都只需要他的透传功能, 现在随着Android4.3 和IOS 的兴起, 支持蓝牙4.0BLE的手机越来越多,所以如何实现手机控制CC2540的透传是一个非常实用的功能,有了这个功能, 我们可以用手机来连接CC2540通过串口来连接的设备,纵观淘宝上有销售的几种模块, 小部分研发实力不足的,都只是提供裸模块,有两家提供了串口透传的模块的, 售价比裸

ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)

前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定时访问升级 这节将告诉大家如何移植到其它型号的单片机. 这一节以 STM32F103RET6 (512KB Flash 64KB RAM) 为例 我使用我的这块板子 大家测试的时候可以按照下面的方式接到自己的GPRS模块(Air202 / SIM800) 单片机串口1 接到GPRS的AT指令配置串口

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级(含有数据校验)

前言 这一节实现的功能是使用MQTT通信控制模块去升级 其实和这一节实现的功能一样  https://www.cnblogs.com/yangfengwu/p/11854595.html 这一节还是着重讲解一下如何移植升级升级程序到自己的项目 我做的单片机远程升级封装文件的目的是希望大家直接移植到自己的项目使用! 准备一个已经实现了TCP的工程,拷贝升级处理文件 1.准备的工程 2.把BootLoader需要用到的文件拷贝到自己的工程 拷贝到自己的项目里面 整理下工程 1.自行添加到工程,还有设

Arduino 与无线模块 CC1101

总结一下无线模块调试的体会.Arduino上已经有人做了这个模块的库了,但是自己根据手册写的也有一定的参考意义. 无线模块是我认为比较难调试的模块之一,因为是双方互动的一种模块,通信失败有两方面的原因,不能从单一代码中找.代码写好了,也将各种信息写进去了,但就是收不到或者接收不到数据.首先想到的是检查设备的连线.因为是SPI通信,所以使用的是mega2560自带的SPI通道口,查看上篇文章介绍. 除此之外CC1101有个GDO0 我连接在了板子上的48引脚. 确认连线. 其次就是测试SPI是否正