新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 433MHz模块stm8、cc1101

433MHz模块stm8、cc1101

作者: 时间:2016-11-19 来源:网络 收藏
前一段时间画了一个CC1101收发小板子,但是一直没有成功,最后发现把27nH的电感焊接成了27uH,最终导致失败.

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

本文引用地址:https://www.eepw.com.cn/article/201611/318107.htm


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

下面是STM8程序

CC1101.C

  1. /*
  2. *文件名:CC1101.c
  3. *功能:STM8CC1101驱动函数
  4. *作者:cp1300@139.com
  5. *创建时间:2013-12-0614:35
  6. *最后修改时间:2013-12-06
  7. *详细:433MHZ收发芯片驱动
  8. */
  9. #include"system.h"
  10. #include"delay.h"
  11. #include"CC1101.h"
  12. //CC1101命令掩码
  13. #defineWRITE_BURST0x40//连续写入
  14. #defineREAD_SINGLE0x80//读
  15. #defineWRITE_SINGLE0x00//写
  16. #defineREAD_BURST0xC0
  17. //连续读
  18. #defineBURST_READ_FIFO0xff//突发读取RXFIFO
  19. #defineBYTE_READ_FIFO0xBF//单字节读取RXFIFO
  20. #defineBURST_WRITE_FIFO0x7f//突发写TXFIFO
  21. #defineBYTE_WRITE_FIFO0x3f//单字节写TXFIFO
  22. #defineCC1101_DATA_LEN64
  23. //SPI接口
  24. //底层接口宏定义
  25. #defineCC1101_CS_H()(GPIOA->ODR|=BIT3)//PA3=1
  26. #defineCC1101_CS_L()(GPIOA->ODR&=~BIT3)//PA3=0
  27. #defineCC1101_MOSI_H()(GPIOC->ODR|=BIT6)//PC6
  28. #defineCC1101_MOSI_L()(GPIOC->ODR&=~BIT6)//PC6
  29. #defineCC1101_SCLK_H()(GPIOC->ODR|=BIT5)//PC5
  30. #defineCC1101_SCLK_L()(GPIOC->ODR&=~BIT5)//PC5
  31. #defineCC1101_GetMISO()(GPIOC->IDR&BIT7)//PC7
  32. //CC1101SPI读写一字节
  33. //不带片选
  34. u8CC1101_ReadWriteByte(u8data)
  35. {
  36. u8i;
  37. u8temp=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. returntemp;
  55. }
  56. /*
  57. *函数:u8CC1101_Command(CC1101_CMD_TYPECmd)
  58. *功能:发送单字节命令
  59. *参数:Cmd;命令,见CC1101_CMD_TYPE
  60. *返回:寄存器的值
  61. *依赖:底层宏定义
  62. *作者:cp1300@139.com
  63. *时间:2013-12-06
  64. *最后修改时间:2013-12-06
  65. *说明:以写的方式单直接访问将触发响应的命令
  66. */
  67. u8CC1101_Command(CC1101_CMD_TYPECmd)
  68. {
  69. u8status;
  70. CC1101_CS_L();//片选有效
  71. while(CC1101_GetMISO());
  72. status=CC1101_ReadWriteByte((u8)Cmd);//发送命令
  73. while(CC1101_GetMISO());
  74. CC1101_CS_H();//片选关闭
  75. returnstatus;
  76. }
  77. /*
  78. *函数:u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
  79. *功能:读取CC1101通用寄存器
  80. *参数:RegAddr:寄存器地址,见:CC1101_REG_TYPE
  81. *返回:寄存器的值
  82. *依赖:底层宏定义
  83. *作者:cp1300@139.com
  84. *时间:2013-12-06
  85. *最后修改时间:2013-12-06
  86. *说明:一次读取一个寄存器
  87. */
  88. u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
  89. {
  90. u8data;
  91. CC1101_CS_L();//片选有效
  92. CC1101_ReadWriteByte((u8)READ_SINGLE|RegAddr);//发送读命令以及寄存器索引
  93. data=CC1101_ReadWriteByte(0xff);//读取
  94. CC1101_CS_H();//片选关闭
  95. returndata;
  96. }
  97. /*
  98. *函数:u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
  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. u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
  110. {
  111. u8status;
  112. if(RegAddr>0x80)return0;//防止误操作,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. returnstatus;
  119. }
  120. #include"LED.h"
  121. voidCC1101_Init(u8Addr)
  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);//RXFIFO和TXFIFO门限
  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. *函数:voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
  205. *功能:写入数据到发送缓冲区
  206. *参数:pBuff:需要写入的数据缓冲区指针,len:需要写入的数据长度
  207. *返回:无
  208. *依赖:底层宏定义
  209. *作者:cp1300@139.com
  210. *时间:2014-01-01
  211. *最后修改时间:2014-01-01
  212. *说明:写入数据到发送FIFO
  213. */
  214. voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
  215. {
  216. u16i;
  217. CC1101_CS_L();
  218. CC1101_ReadWriteByte(BURST_WRITE_FIFO);
  219. for(i=0;i
  220. {
  221. CC1101_ReadWriteByte(pBuff[i]);
  222. }
  223. CC1101_CS_H();
  224. }
  225. /*
  226. *函数:voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
  227. *功能:读取接收缓冲区
  228. *参数:pBuff:需要读取的数据缓冲区指针,len:需要读取的数据长度
  229. *返回:无
  230. *依赖:底层宏定义
  231. *作者:cp1300@139.com
  232. *时间:2014-01-01
  233. *最后修改时间:2014-01-01
  234. *说明:从接收FIFO读取数据
  235. */
  236. voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
  237. {
  238. u16i;
  239. CC1101_CS_L();
  240. CC1101_ReadWriteByte(BURST_READ_FIFO);
  241. for(i=0;i
  242. {
  243. pBuff[i]=CC1101_ReadWriteByte(0xff);
  244. }
  245. CC1101_CS_H();
  246. }
  247. //发送数据,将缓冲区数据全部发送出去
  248. //一次最多64B,因为受到FIFO限制
  249. voidCC1101_RfDataSend(u8*pBuff,u8len)
  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. voidCC1101_RfDataSendPack(u8*pBuff,u16len)
  264. {
  265. u16i,m,n,j;
  266. m=len/(CC1101_DATA_LEN-1);//整数数据帧数量
  267. n=len%(CC1101_DATA_LEN-1);//余数
  268. //发送整数包
  269. for(i=0;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
  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. u8CC1101_GetStatus(void)
  308. {
  309. returnCC1101_WriteReg(CC1101_REG_TEST2,0x98);
  310. }

CC1101.H

  1. /*
  2. *文件名:CC1101.c
  3. *功能:STM8CC1101驱动函数
  4. *作者:cp1300@139.com
  5. *创建时间:2013-12-0614:35
  6. *最后修改时间:2013-12-06
  7. *详细:433MHZ收发芯片驱动
  8. */
  9. #ifndef_CC1101_H_
  10. #define_CC1101_H_
  11. #include"system.h"
  12. //CC1101命令
  13. //以写的方式单直接访问将触发响应的命令
  14. typedefenum
  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,//冲洗RXFIFO缓冲
  27. CC1101_CMD_SFTX=0x3b,//冲洗TXFIFO缓冲
  28. CC1101_CMD_SWORRST=0x3c,//重新设置真实时间时钟
  29. CC1101_CMD_SNOP=0x3d,//无操作。可能用来为更简单的软件将滤波命令变为2字节。
  30. }CC1101_CMD_TYPE;
  31. //CC1101寄存器定义
  32. typedefenum
  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,//RXFIFO和TXFIFO门限
  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,//TXFIFO中的下溢和比特数
  94. CC1101_REG_RXBYTES=0xfB,//RXFIFO中的下溢和比特数
  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. #defineCC1101_GDO0(GPIOC->IDR&BIT3)//PC3
  110. #defineCC1101_GDO2(GPIOC->IDR&BIT4)//PC4
  111. voidCC1101_Init(u8Addr);//初始化CC1101
  112. u8CC1101_ReadReg(CC1101_REG_TYPERegAddr);//读取CC1101通用寄存器
  113. u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data);//写入CC1101通用寄存器
  114. u8CC1101_Command(CC1101_CMD_TYPECmd);//发送单字节命令
  115. u8CC1101_GetStatus(void);//读取芯片状态
  116. voidCC1101_RfDataSend(u8*pBuff,u8len);
  117. voidCC1101_ReadRxFIFO(u8*pBuff,u8len);
  118. //CC1101PackSize有效数据包大小,0-64,也就是CC1101单次发送数据大小-1
  119. voidCC1101_RfDataSendPack(u8*pBuff,u16len);
  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. #defineUART_BUFF_SIZE256//串口接收缓冲区大小
  9. u8UartBuff[2][UART_BUFF_SIZE];//串口接收缓冲区
  10. u16UartLen1=0;//串口接收数据长度
  11. u16UartLen2=0;//串口接收数据长度
  12. //CC1101缓冲区
  13. #defineRF_BUFF_SIZE64//CC1101缓冲区大小
  14. u8RfBuff[RF_BUFF_SIZE];//CC1101缓冲区
  15. u8RfLen=0;//CC1101接收缓冲区大小
  16. //缓冲区选择
  17. u8UART_RxNum=0;//串口缓冲区选择
  18. //主函数
  19. voidmain(void)
  20. {
  21. u8LastNum=0;
  22. u32delay=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. }

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


关键词: 433MHzstm8cc110

评论


技术专区

关闭