logo资料库

基于STM32驱动A7139无线模块通信C语言程序.docx

第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
资料共27页,剩余部分请下载后查看
A7139 拥有电磁波唤醒以及 10mW 的发射功率,非常容易实现长距离通信,目前测试有障碍物可以轻松达到 300m 以上. 通过几天的调试,目前可以发送任意大小的数据包,大小为 1-16KB,全部使用中断收发,效率极高。 基于 STM32 驱动 A7139 无线模块通信 C 语言程序 增加波特率设置 2Kbps-100Kbps 任意设置 增加通信信道设置 0-255 增加发送功率设置 0-7 底层代码 [cpp] view plain copy 1. 2. 3. 4. 5. 6. 7. 8. 9. /************************************************************************************************************* * 文件名: A7139.c * 功能: STM32 A7139 驱动 * 作者: cp1300@139.com * 创建时间: 2015-07-19 * 最后修改时间:2015-12-30 * 详细: A7139 驱动 *************************************************************************************************************/ #include "SYSTEM.H" 10. #include "GPIO_INIT.H" 11. #include "a7139.H" 12. #include "LED.H" 13. 14. 15. 16. //晶振寄存器,用于设置晶振以及 PAGE 地址 17. //用于缓存寄存器 7 的值 18. static u16 A7139_CRYSTAL_REG = 0x18; 19. 20. //单包数据发送超时时间 21. #define A7139_SEND_TIME_OUT 5 //单位 10ms 22. 23. //基础频率,设置频率范围为 420.500MHZ~452.375MHZ ,频道差为 125KHZ 24. #define A7139_BASE_FRE 420.5f 25. 26. //调试开关 27. #define A7193_DBUG 1 28. #if A7193_DBUG 29. 30. #include "system.h" #define A7193_debug(format,...) uart_printf(format,##__VA_ARGS__) 31. #else 32. #define A7193_debug(format,...) /\ 33. / 34. #endif //A7193_DBUG 35. 36. vu8 IntCnt = 0; 37. 38. //寄存器配置
39. typedef struct 40. { 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. u16 SCLOCK; //系统时钟寄存器 u16 PLL1; u16 PLL2; u16 PLL3; u16 PLL4; u16 PLL5; u16 PLL6; //PLL1 //PLL2 //PLL3 //PLL4 //PLL5 //PLL6 u16 CRYSTAL; //晶振设置 u16 PREG8S; //寄存器组,由 CRYSTAL 控制切换 u16 PREG9S; //寄存器组,由 CRYSTAL 控制切换 u16 RX1; u16 RX2; u16 ADC; u16 PIN; //接收设置 1 //接收设置 2 //ADC //PIN u16 CALIB; //Calibration u16 MODE; //模式控制 57. } A7139_CONFIG_YPTE; 58. 59. 60. 61. const u16 A7139Config[]= 62. { 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 0x0021, //SYSTEM CLOCK register, 0x0A21, //PLL1 register, 0xDA05, //PLL2 register, 433.301MHz 0x0000, //PLL3 register, 0x0A20, //PLL4 register, 0x0024, //PLL5 register, 0x0000, //PLL6 register, 0x0001, //CRYSTAL register, 0x0000, //PAGEA, 0x0000, //PAGEB, 0x18D4, //RX1 register, IFBW=100KHz, ETH=1 0x7009, //RX2 register, by preamble 0x4400, //ADC register, 0x0800, //PIN CONTROL register, Use Strobe CMD 0x4845, //CALIBRATION register, 0x20C0 //MODE CONTROL register, Use FIFO mode 79. }; 80. 81. const u16 A7139Config_PageA[]= 82. { 83. 84. 85. 0xF706, //TX1 register, Fdev = 37.5kHz 0x0000, //WOR1 register, 0xF800, //WOR2 register,
0x1107, //RFI register, Enable Tx Ramp up/down 0x0170, //PM register, 0x0201, //RTH register, 0x400F, //AGC1 register, 0x2AC0, //AGC2 register, 0x0041, //GIO register GIO1->WTR GIO2->WTR 0xD281, //CKO register 0x0004, //VCB register, 0x0A21, //CHG1 register, 430MHz 0x0022, //CHG2 register, 435MHz 0x003F, //FIFO register, FEP=63+1=64bytes 0x1507, //CODE register, Preamble=4bytes, ID=4bytes 0x0000 //WCAL register, 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. }; 100. 101. const u16 A7139Config_PageB[]= 0x0337, //TX2 register, 0x8400, //IF1 register, Enable Auto-IF, IF=200KHz 0x0000, //IF2 register, 频率偏移为 0 0x0000, //ACK register, 0x0000 //ART register, 102. { 103. 104. 105. 106. 107. 108. }; 109. 110. 111. //GPIO1 功能设置 112. #define A7139_SetGIO_WTR() A7139_WritePageA(A7139_REG8_GPIO, 0x0041) //WTR 模式,单包收发提示 113. #define A7139_SetGIO_FPF() A7139_WritePageA(A7139_REG8_GPIO, 0x0035) //FPF 模式,多包收发状态提示 114. #define A7139_SetGIO_NULL() A7139_WritePageA(A7139_REG8_GPIO, 0x0000) //关闭 GPIO1 指示 115. 116. //发送数据结构 117. typedef struct 118. { 119. 120. 121. 122. 123. u8 *pSendData; //发送数据缓冲区指针 u16 SendLen; //需要发送数据长度 u16 TranLen; //已经发送数据长度 bool isSendOK; //发送完成 bool isSendError;//发送失败 124. }A7139_SEND_TYPE; 125. volatile A7139_SEND_TYPE SendConfig; //发送数据的信息 126. 127. 128. //接收数据结构 129. typedef struct 130. { 131. 132. u8 *pRevData; //接收数据缓冲区指针 u16 RevLen; //需要接收数据长度
133. 134. 135. 136. u16 TranLen; //已经接收数据长度 u16 RevBuffSize;//接收缓冲区大小 bool isRevOK; //接收完成 bool isRevError;//接收失败 137. }A7139_REV_TYPE; 138. volatile A7139_REV_TYPE RevConfig; //发送数据的信息 139. 140. 141. //收发模式记录,用于中断处理发送或接收模式 142. static bool isSendMode = FALSE; //默认为接收模式 143. #define A7139_SendMode(x) (isSendMode=x) BIT3-BIT0 Address 144. 145. /*命令选择 146. 地址格式 147. BIT7 BIT6-BIT4 148. R/W Command 149. 0:写 000 读写控制寄存器 150. 1:读 010 读写 ID 100 读写 FIFO 110 复位 FIFO 111 RF 复位 151. 152. 153. 154. 155. */ 156. 157. void A7139_SetBaseFreq(float RfFreq); //基础频率设置 158. bool A7139_Cali(void); //频率校准 159. 160. 161. /************************************************************************************************************************* 162. * 函数 163. * 功能 164. * 参数 : : : void A7139_SetTrafficRate(u8 Rate) A7139 设置通信速率,单位 Kbps Rate:通信速率,单位 Kbps 165. * 返回 : 无 166. * 依赖 : 底层宏定义 167. * 作者 168. * 时间 : : cp1300@139.com 2016-01-02 169. * 最后修改 : 2016-01-02 170. * 说明 : 用于设置通信速率 171. 172. 173. 范围 2-100Kbps 设置系统时钟 2 分频,设置为 12.8MHZ 后如果 IFBW 设置过小会导致初始化时自动校准失败 如果设置为 50 会出现校准失败 174. *************************************************************************************************************************/ 175. void A7139_SetTrafficRate(u8 Rate) 176. { 177. 178. 179. u16 SDR; if(Rate < 2) Rate = 2;
if(Rate > 100) Rate = 100; //IFBW 设置 DMOS=1 64 分频 ETH=1 CSC=0 FCSCK=12.8MHZ if(Rate <= 50) //IFBW=100KHZ { } A7139_WriteReg(A7139_RX1, 0x18D0 | (1<<2)); else //IFBW=100KHZ { } A7139_WriteReg(A7139_RX1, 0x18D0 | (1<<2)); SDR = 100/Rate; SDR -= 1; //计算波特率分频值 A7139_WriteReg(A7139_SCLOCK,0x0021|(SDR<<9)); //CSC=1 GRC=1 SDR 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. } 195. 196. /************************************************************************************************************************* 197. * 函数 : void A7139_SetTxPowerSupply(u8 PowerSupply) 198. * 功能 : 设置 A7139 发射功率 199. * 参数 : PowerSupply:功率等级 0-7 200. * 返回 : 无 201. * 依赖 : 底层宏定义 202. * 作者 203. * 时间 : : cp1300@139.com 2016-01-02 204. * 最后修改 : 2016-01-02 205. * 说明 : 用于设置发射功率 206. 207. 由于不同频率下 TX 驱动电流与 PA 驱动电流并不相同,因此按照文档设置 目前只支持 433 频段设置,其它频段请按照文档进行设置。 208. *************************************************************************************************************************/ 209. void A7139_SetTxPowerSupply(u8 PowerSupply) if(PowerSupply>6)PowerSupply=6; //最大功率为 6 if(PowerSupply == 0) { } A7139_WritePageB(A7139_REG9_TX2, 0x0300); //功率最小-34dBm,PAC=0,TDC=0,TBG=增益 else { } A7139_WritePageB(A7139_REG9_TX2, 0x0300|(1<<5)|(1<<3)|PowerSupply); //PAC=1,TDC=1,TBG=增益 210. { 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. } 221. 222. 223. 224. /************************************************************************************************************************* 225. * 函数 226. * 功能 : : bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate) A7139 初始化
227. * 参数 228. * 返回 : : Channel:通信信道 0-80,RfID:RF ID,PowerSupply:发射功率 0-7;Rate:通信波特率 2-100Kbps TRUE:成功;FALSE:失败 229. * 依赖 : 底层宏定义 230. * 作者 231. * 时间 232. * 最后修改 : 233. * 说明 234. : : : cp1300@139.com 2015-07-19 2016-01-02 RF_ID:用于区分网络 2-100Kbps 频率间隔至少为 100KHZ,150~200KHZ 频道间隔必须大于 200KHZ 235. *************************************************************************************************************************/ 236. bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate) 237. { 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. u32 ID; u32 temp; if(Rate < 2) Rate = 2; if(Rate > 100) Rate = 100; A7139_DisableInt(); //关闭中断 A7139_DisableNVIC(); //关闭总中断 A7139_IO_INIT(); //初始化 IO A7139_CS_H(); A7139_CLK_L(); A7139_DIO_H(); ID = RfID; ID <<= 16; ID |= RfID; A7193_debug("[RF]频率:%dKHz, 通信速率:%dKbps, RFID:%X!\r\n",(u32)(A7139_BASE_FRE*1000+Channel*0.125*1000),Rate, ID); A7139_CRYSTAL_REG = 0x0001; A7139_SoftReset(); //软复位 if(A7139_ReadID() != 0) { } A7139_SoftReset(); //软复位 A7139_DelayMS(1); A7139_Config(); //初始化寄存器 A7139_SetBaseFreq(A7139_BASE_FRE); //设置基础频率 A7139_SetChannel(Channel); //设置信道 A7139_SetTrafficRate(Rate); //设置通信速率 A7139_WriteID(ID); //写入 ID temp = A7139_ReadID(); //读取用户 ID if(temp != ID) { A7193_debug("A7139 初始化失败,芯片检测错误!\r\n");
return FALSE; } A7193_debug("A7139 用户 ID:%X\t 硬件 ID:%X\r\n",ID, A7139_ReadDeverID()); A7139_DelayMS(5); if(A7139_Cali()==FALSE) //校准 { } A7193_debug("A7139 初始化失败,校准失败!\r\n"); return FALSE; A7193_debug("A7139 初始化成功!\r\n"); A7139_SetTxPowerSupply(PowerSupply); //设置发射功率 A7139_EnableInt(); //开启上升沿触发中断 return TRUE; 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. } 293. 294. /************************************************************************************************************************* 295. * 函数 296. * 功能 297. * 参数 : : : void A7139_SetSendDataLen(u16 DataLen) A7139 设置发送数据长度(只针对 FIFO 外延模式有效) DataLen:数据长度,最大 16KB 298. * 返回 : 无 299. * 依赖 : 底层宏定义 300. * 作者 301. * 时间 : : cp1300@139.com 2015-12-29 302. * 最后修改 : 2015-12-29 303. * 说明 : 用于 FIFO 外延模式下设置发送数据长度 304. *************************************************************************************************************************/ 305. void A7139_SetSendDataLen(u16 DataLen) if(DataLen > 16*1024) DataLen = 16*1024; //限制最大长度为 16KB //将要发送的数据长度写入到 FEP[13:0]寄存器中 A7139_WritePageA(A7139_REG8_VCO, (DataLen&0x3F00) | 0x04); //FEP【13:8】 A7139_WritePageA(A7139_REG8_FIFO, (3<<14) | (DataLen&0xFF)); //FPM=3;PSA=0,FEP【7:0】 306. { 307. 308. 309. 310. 311. 312. } 313. 314. 315. 316. /************************************************************************************************************************* 317. * 函数 318. * 功能 319. * 参数 : : : u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen) FIFO 外延模式发送首包数据 pData:数据缓冲区;SnedDataLen:需要发送的数据总长度(不是当前包长度) 320. * 返回 : 发送的数据长度
321. * 依赖 : 底层宏定义 322. * 作者 323. * 时间 : : cp1300@139.com 2015-12-30 324. * 最后修改 : 2015-12-30 325. * 说明 : 用于 FIFO 外延模式发送第一包,前面 2 个字节为总包长度,后面 62B 为数据包有效大小 326. 327. 如果数据包小于 62B 后面补充无效数据 0x00 FIFO 外延模式,64B...48B...48B... 328. *************************************************************************************************************************/ 329. u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen) 330. { u16 i; u8 temp; A7139_CS_L(); A7139_OutMode(); A7139_WriteByte(A7139_WFIFO_CMD); //循环写入 FIFO A7139_WriteByte(0xA5); A7139_WriteByte(0xB6); //数据包起始字节 1 //数据包起始字节 2 A7139_WriteByte(SnedDataLen>>8); //数据包总长度,高位 A7139_WriteByte(SnedDataLen); //数据包总长度,低位 if(SnedDataLen < 60) //不足一包,需要填充 { } for(i = 0;i < SnedDataLen;i ++) //发送数据包 { } A7139_WriteByte(pData[i]); for(i = 0;i < (60-SnedDataLen);i ++) //填充不足的字节数 { } A7139_WriteByte(0x00); //填充 else //超出一包数据 { } for(i = 0;i < 60;i ++) //发送数据包 { } A7139_WriteByte(pData[i]); SnedDataLen = 60; //返回发送的数据长度 A7139_CS_H(); return SnedDataLen; //返回发送的数据长度 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. } 365. 366. 367.
分享到:
收藏