e1dcd2e4abaefc84a6a0543c4d1d16eb5f76ee16.svn-base 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 1
  2. C51 COMPILER V9.53.0.0, COMPILATION OF MODULE NRF24L01_API
  3. OBJECT MODULE PLACED IN .\Output\nRF24L01_API.obj
  4. COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\nRF24L01_API.c LARGE OPTIMIZE(0,SPEED) BROWSE INC
  5. -DIR(../../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECT
  6. -EXTEND PRINT(.\Output\LST\nRF24L01_API.lst) TABS(2) OBJECT(.\Output\nRF24L01_API.obj)
  7. line level source
  8. 1 #include "nRF24L01_API.h"
  9. 2
  10. 3 static uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //发送地址
  11. 4 static uchar RX_ADDRESS[RX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //接收地址
  12. 5
  13. 6 /*
  14. 7 00 配置寄存器
  15. 8 [7]
  16. 9 [6]可屏蔽中断 RX_RD
  17. 10 [5]可屏蔽中断 TX_DS
  18. 11 [4]可屏蔽中断 MAX_RT
  19. 12 [3]CRC 使能
  20. 13 [2]CRC 模式
  21. 14 [1]1:上电0:掉电
  22. 15 [0]1:接收模式0:发射模式
  23. 16 01 使能“自动应答”功能
  24. 17 [7:6]
  25. 18 [5:0]数据通道 5 ~0自动应答允许
  26. 19 02 接收地址允许
  27. 20 [7:6]
  28. 21 [5:0]接收数据通道 5 ~0允许
  29. 22 03 设置地址宽度(所有数据通道)
  30. 23 [7:2]
  31. 24 [1:0]0.无效 1.3byte 2.4byte 3.5byte 宽度
  32. 25 04 建立自动重发
  33. 26 [7:4]自动重发延时:'0000'-等待 250+86us '1111'-等待 4000+86us
  34. 27 [3:0]自动重发计数:'0000'-禁止自动重发 '1111'-自动重发 15 次
  35. 28 05 射频通道
  36. 29 [7]
  37. 30 [6:0]设置 nRF24L01 工作通道频率
  38. 31 06 射频寄存器
  39. 32
  40. 33 .....
  41. 34 .....
  42. 35
  43. 36
  44. 37 */
  45. 38
  46. 39
  47. 40 #if 1
  48. 41 void delay_us ( uchar num )
  49. 42 {
  50. 43 1 uchar i;
  51. 44 1
  52. 45 1 for ( i = 0; i < num; i++ )
  53. 46 1 {
  54. 47 2 #ifdef N76E003_IAR
  55. asm ( "nop" );
  56. #else
  57. 50 2 nop;
  58. 51 2 #endif
  59. 52 2 }
  60. 53 1 }
  61. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 2
  62. 54 #else
  63. #define delay_us(us) Timer3_Delay10us(us/10+1)
  64. #endif
  65. 57 /***************************************************************/
  66. 58
  67. 59 /*******************************************************************/
  68. 60 //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
  69. 61 #if 0
  70. uchar SPI_RW ( uchar byte )
  71. {
  72. uchar bit_ctr;
  73. for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ ) // 输出8位
  74. {
  75. NRF_MOSI = ( byte & 0x80 ); // MSB TO MOSI
  76. byte = ( byte << 1 ); // shift next bit to MSB
  77. NRF_SCK = 1;
  78. byte |= NRF_MISO; // capture current MISO bit
  79. NRF_SCK = 0;
  80. }
  81. return byte;
  82. }
  83. #else
  84. 78 uchar SPI_RW ( uchar byte )
  85. 79 {
  86. 80 1 uchar i;
  87. 81 1 SPDR = byte; //写寄存器
  88. 82 1
  89. 83 1 for ( i = 0; i < 255; i++ )
  90. 84 1 {
  91. 85 2 if ( SPSR & SET_BIT7 )
  92. 86 2 {
  93. 87 3 break; //等待传输
  94. 88 3 }
  95. 89 2 }
  96. 90 1
  97. 91 1 SPSR &= ~SET_BIT7;
  98. 92 1 byte = SPDR; //读寄存器
  99. 93 1 return byte;
  100. 94 1 }
  101. 95
  102. 96 #endif
  103. 97 /*********************************************/
  104. 98 /* 函数功能:给24L01的寄存器写值(一个字节) */
  105. 99 /* 入口参数:reg 要写的寄存器地址 */
  106. 100 /* value 给寄存器写的值 */
  107. 101 /* 出口参数:status 状态值 */
  108. 102 /*********************************************/
  109. 103 uchar NRF24L01_Write_Reg ( uchar reg, uchar value )
  110. 104 {
  111. 105 1 uchar status;
  112. 106 1 NRF_CSN = 0; //CSN=0;
  113. 107 1 status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
  114. 108 1 SPI_RW ( value );
  115. 109 1 NRF_CSN = 1; //CSN=1;
  116. 110 1
  117. 111 1 return status;
  118. 112 1 }
  119. 113 /*************************************************/
  120. 114 /* 函数功能:读24L01的寄存器值 (一个字节) */
  121. 115 /* 入口参数:reg 要读的寄存器地址 */
  122. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 3
  123. 116 /* 出口参数:value 读出寄存器的值 */
  124. 117 /*************************************************/
  125. 118 uchar NRF24L01_Read_Reg ( uchar reg )
  126. 119 {
  127. 120 1 uchar value;
  128. 121 1
  129. 122 1 NRF_CSN = 0; //CSN=0;
  130. 123 1 SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
  131. 124 1 value = SPI_RW ( NOP );
  132. 125 1 NRF_CSN = 1; //CSN=1;
  133. 126 1
  134. 127 1 return value;
  135. 128 1 }
  136. 129 /*********************************************/
  137. 130 /* 函数功能:读24L01的寄存器值(多个字节) */
  138. 131 /* 入口参数:reg 寄存器地址 */
  139. 132 /* *pBuf 读出寄存器值的存放数组 */
  140. 133 /* len 数组字节长度 */
  141. 134 /* 出口参数:status 状态值 */
  142. 135 /*********************************************/
  143. 136 uchar NRF24L01_Read_Buf ( uchar reg, uchar *pBuf, uchar len )
  144. 137 {
  145. 138 1 uchar status, u8_ctr;
  146. 139 1 NRF_CSN = 0; //CSN=0
  147. 140 1 status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
  148. 141 1
  149. 142 1 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
  150. 143 1 {
  151. 144 2 pBuf[u8_ctr] = SPI_RW ( 0XFF ); //读出数据
  152. 145 2 }
  153. 146 1
  154. 147 1 NRF_CSN = 1; //CSN=1
  155. 148 1 return status; //返回读到的状态值
  156. 149 1 }
  157. 150 /**********************************************/
  158. 151 /* 函数功能:给24L01的寄存器写值(多个字节) */
  159. 152 /* 入口参数:reg 要写的寄存器地址 */
  160. 153 /* *pBuf 值的存放数组 */
  161. 154 /* len 数组字节长度 */
  162. 155 /**********************************************/
  163. 156 uchar NRF24L01_Write_Buf ( uchar reg, uchar *pBuf, uchar len )
  164. 157 {
  165. 158 1 uchar status, u8_ctr;
  166. 159 1 NRF_CSN = 0;
  167. 160 1 status = SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
  168. 161 1
  169. 162 1 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
  170. 163 1 {
  171. 164 2 SPI_RW ( *pBuf++ ); //写入数据
  172. 165 2 }
  173. 166 1
  174. 167 1 NRF_CSN = 1;
  175. 168 1 return status; //返回读到的状态值
  176. 169 1 }
  177. 170
  178. 171 /*********************************************/
  179. 172 /* 函数功能:24L01接收数据 */
  180. 173 /* 入口参数:rxbuf 接收数据数组 */
  181. 174 /* 返回值: 0 成功收到数据 */
  182. 175 /* 1 没有收到数据 */
  183. 176 /*********************************************/
  184. 177 uchar NRF24L01_RxPacket ( uchar *rxbuf, uchar rxlen )
  185. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 4
  186. 178 {
  187. 179 1 uchar state;
  188. 180 1 uchar res = 0;
  189. 181 1
  190. 182 1 state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
  191. 183 1
  192. 184 1 if ( state & RX_DR ) //接收到数据
  193. 185 1 {
  194. 186 2 state &= ~RX_DR;
  195. 187 2 NRF_CE = 0; //配置前
  196. 188 2 rxlen = ( rxlen < RX_PLOAD_WIDTH ) ? ( rxlen ) : ( RX_PLOAD_WIDTH );
  197. 189 2 NRF24L01_Read_Buf ( RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH ); //读取数据
  198. 190 2 NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
  199. 191 2 NRF_CE = 1; //配置完,使能收发
  200. 192 2 delay_us ( 150 );
  201. 193 2 res = 1;
  202. 194 2 }
  203. 195 1
  204. 196 1 NRF24L01_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
  205. 197 1 return res;//没收到任何数据
  206. 198 1 }
  207. 199 /**********************************************/
  208. 200 /* 函数功能:设置24L01为发送模式 */
  209. 201 /* 入口参数:txbuf 发送数据数组 */
  210. 202 /* 返回值; 0x10 达到最大重发次数,发送失败*/
  211. 203 /* 0x20 成功发送完成 */
  212. 204 /* 0xff 发送失败 */
  213. 205 /**********************************************/
  214. 206 uchar NRF24L01_TxPacket ( uchar *txbuf, uchar txlen )
  215. 207 {
  216. 208 1 uchar res = 1;
  217. 209 1 uchar state;
  218. 210 1 uint16 i;
  219. 211 1
  220. 212 1 NRF_CE = 0; //CE拉低,使能24L01配置
  221. 213 1 txlen = ( txlen < TX_PLOAD_WIDTH ) ? ( txlen ) : ( TX_PLOAD_WIDTH );
  222. 214 1 NRF24L01_Write_Buf ( WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH ); //写数据到TX BUF 32个字节
  223. 215 1 NRF_CE = 1; //CE置高,使能发送
  224. 216 1
  225. 217 1 for ( i = 0; i < 65535; i++ )
  226. 218 1 {
  227. 219 2 if ( NRF_IRQ == 1 )
  228. 220 2 {
  229. 221 3 break; //等待发送完成
  230. 222 3 }
  231. 223 2 }
  232. 224 1
  233. 225 1 state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
  234. 226 1
  235. 227 1 if ( state & MAX_RT ) //达到最大重发次数
  236. 228 1 {
  237. 229 2 NRF24L01_Write_Reg ( FLUSH_TX, 0xff ); //清除TX FIFO寄存器
  238. 230 2 state &= ~MAX_RT;
  239. 231 2 res = 0;
  240. 232 2 }
  241. 233 1
  242. 234 1 if ( state & TX_DS ) //发送完成
  243. 235 1 {
  244. 236 2 state &= ~TX_DS;
  245. 237 2 res = 0;
  246. 238 2 }
  247. 239 1
  248. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 5
  249. 240 1 NRF24L01_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
  250. 241 1 return res; //发送失败
  251. 242 1 }
  252. 243
  253. 244 /********************************************/
  254. 245 /* 函数功能:检测24L01是否存在 */
  255. 246 /* 返回值; 1 存在 */
  256. 247 /* 0 不存在 */
  257. 248 /********************************************/
  258. 249 uchar NRF24L01_Check ( void )
  259. 250 {
  260. 251 1 uchar res = 0;
  261. 252 1 uchar check_in_buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
  262. 253 1 uchar check_out_buf[5] = {0x00};
  263. 254 1
  264. 255 1 NRF_SCK = 0;
  265. 256 1 NRF_CSN = 1;
  266. 257 1 NRF_CE = 0;
  267. 258 1
  268. 259 1 NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, check_in_buf, 5 );
  269. 260 1
  270. 261 1 NRF24L01_Read_Buf ( READ_REG + TX_ADDR, check_out_buf, 5 );
  271. 262 1
  272. 263 1 if ( ( check_out_buf[0] == 0x11 ) && \
  273. 264 1 ( check_out_buf[1] == 0x22 ) && \
  274. 265 1 ( check_out_buf[2] == 0x33 ) && \
  275. 266 1 ( check_out_buf[3] == 0x44 ) && \
  276. 267 1 ( check_out_buf[4] == 0x55 ) )
  277. 268 1 {
  278. 269 2 res = 1;
  279. 270 2 }
  280. 271 1
  281. 272 1 return res;
  282. 273 1 }
  283. 274
  284. 275 uint16 NRF24L01_Wait_Check ( void )
  285. 276 {
  286. 277 1 uint16 i;
  287. 278 1
  288. 279 1 for ( i = 0; i < 50; i++ )
  289. 280 1 {
  290. 281 2 if ( NRF24L01_Check() )
  291. 282 2 {
  292. 283 3 break; //等待发送完成
  293. 284 3 }
  294. 285 2
  295. 286 2 Timer3_Delay10us ( 10 );
  296. 287 2 }
  297. 288 1
  298. 289 1 return i;
  299. 290 1 }
  300. 291 /**********************************************/
  301. 292 /* 函数功能:24L01初始化 */
  302. 293 /* 入口参数:PLOAD_WIDTH 有效数据宽度 */
  303. 294 /* TX_ADR 发送地址 */
  304. 295 /* TX_ADDR_WIDTH 发送地址宽度 */
  305. 296 /* RX_ADR 接收发送地址 */
  306. 297 /* RX_ADDR_WIDTH 接收地址宽度 */
  307. 298 /* RATE 有效数据宽度 */
  308. 299 /* 返回值 ;无 */
  309. 300 /**********************************************/
  310. 301 void NRF24L01_RT_Init ( void )
  311. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 6
  312. 302 {
  313. 303 1 NRF_CE = 0;
  314. 304 1 NRF24L01_Write_Reg ( WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH ); //设置接收数据长度,本次设置为32字节
  315. 305 1 NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
  316. 306 1 NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH ); //写TX节点地址
  317. 307 1 NRF24L01_Write_Buf ( WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH ); //设置RX节点地址,主要为了使能
  318. -ACK
  319. 308 1
  320. 309 1 NRF24L01_Write_Reg ( WRITE_REG + EN_AA, 0x05 ); //使能通道0的自动应答
  321. 310 1 NRF24L01_Write_Reg ( WRITE_REG + EN_RXADDR, 0x01 ); //使能通道0的接收地址
  322. 311 1
  323. 312 1 NRF24L01_Write_Reg ( WRITE_REG + FEATURE, 0x00 ); //使能动态数据包长度,AUTO_ACK模式
  324. 313 1 NRF24L01_Write_Reg ( WRITE_REG + DYNPD, 0x01 ); //选择通道0动态数据包长度
  325. 314 1
  326. 315 1 NRF24L01_Write_Reg ( WRITE_REG + SETUP_RETR, 0x1a ); //设置自动重发间隔时间:500us + 86us;最大自动重发
  327. -次数:10(a)次
  328. 316 1 NRF24L01_Write_Reg ( WRITE_REG + RF_CH, 40 ); //设置RF通道为40 收发必须一致,0为2.4GHz + 40
  329. 317 1 NRF24L01_Write_Reg ( WRITE_REG + RF_SETUP, 0x0f ); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
  330. 318 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接
  331. -收模式,开启所有中断
  332. 319 1 NRF_CE = 1; //CE置高,使能发送
  333. 320 1 }
  334. 321 /**********************************************/
  335. 322 /* 函数功能:发射函数 */
  336. 323 /* 入口参数:buf 发送寄存器 */
  337. 324 /* 返回值 ;无 */
  338. 325 /**********************************************/
  339. 326 /*
  340. 327 nRF24L01 可以设置为以下几种主要的模式,
  341. 328 模式 PWR_UP PRIM_RX CE FIFO 寄存器状态
  342. 329 接收模式 1 1 1 -
  343. 330 发送模式 1 0 1 数据在 TX FIFO 寄存器中
  344. 331 发送模式 1 0 1→0 停留在发送模式,直至数据发送完
  345. 332 待机模式II 1 0 1 TX FIFO 为空
  346. 333 待机模式I 1 - 0 无数据传输
  347. 334 掉电模式 0 - - -
  348. 335 CONFIG[0] PRIM_RX: 1:接收模式 0:发射模式
  349. 336 CONFIG[1] PWR_UP: 1:上电 0:掉电
  350. 337 */
  351. 338 uchar SEND_BUF ( uchar *buf, uchar len )
  352. 339 {
  353. 340 1 uchar state;
  354. 341 1 NRF_CE = 0;
  355. 342 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0e ); //CONFIG[0] PRIM_RX=0.发射
  356. 343 1 NRF_CE = 1;
  357. 344 1 delay_us ( 15 );
  358. 345 1 state = NRF24L01_TxPacket ( buf, len );
  359. 346 1 NRF_CE = 0;
  360. 347 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); //CONFIG[0] PRIM_RX=0.发射
  361. 348 1 NRF_CE = 1;
  362. 349 1 return state;
  363. 350 1 }
  364. 351
  365. MODULE INFORMATION: STATIC OVERLAYABLE
  366. CODE SIZE = 1130 ----
  367. CONSTANT SIZE = 10 ----
  368. XDATA SIZE = 65 ----
  369. PDATA SIZE = ---- ----
  370. DATA SIZE = ---- ----
  371. IDATA SIZE = ---- ----
  372. C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 7
  373. BIT SIZE = ---- ----
  374. END OF MODULE INFORMATION.
  375. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)