41add2e7eecf5918f2e74005ac31a2cf64a1888b.svn-base 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 1
  2. C51 COMPILER V9.53.0.0, COMPILATION OF MODULE NRF24L01_INTE
  3. OBJECT MODULE PLACED IN .\Output\NRF24L01_inte.obj
  4. COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\NRF24L01_inte.c LARGE OPTIMIZE(0,SPEED) BROWSE IN
  5. -CDIR(../../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJEC
  6. -TEXTEND PRINT(.\Output\LST\NRF24L01_inte.lst) TABS(2) OBJECT(.\Output\NRF24L01_inte.obj)
  7. line level source
  8. 1 #include "NRF24L01_inte.H"
  9. 2 #include <string.h>
  10. 3
  11. 4 #define RF_CH_DEF 40
  12. 5 #define RF_C_NUM_DEF 0 //0通道无法发送
  13. 6 unsigned char RF_CH = RF_CH_DEF; //RF频道
  14. 7 unsigned char RF_C_NUM = RF_C_NUM_DEF; //RF通道
  15. 8 unsigned char NRF24L01_FLAG = 0; //NRF24L01当前状态标志
  16. 9 //DB7; 1接收模式 0发射模式
  17. 10 //DB6; 1有任务 0空闲
  18. 11 //DB5; 1发送成功 0发送失败(配合DB6检测是否发送成功)
  19. 12 //DB4; 1NRF正常连接 0 检测不到连接
  20. 13 //DB3; 1接收到数据包 0 缓冲区无数据
  21. 14 //DB2; 1 ACK模式 0 NOACK模式
  22. 15 //DB1; 1发送完自动进入接收模式 0关闭自动切换模式
  23. 16 unsigned char DYNPD_LEN = 0; //用于存放动态数据包长度
  24. 17 //接收地址-- 接收有6个通道
  25. 18 const unsigned char RX_ADD[NRF24L01_CH_NUM_MAX + 1][NRF24L01_ADR_LEN] =
  26. 19 {
  27. 20 {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //通道0
  28. 21 {0x01, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //通道1
  29. 22 {0x02, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //通道2
  30. 23 {0x03, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //通道3
  31. 24 {0x04, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //通道4
  32. 25 {0x05, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4} //通道5
  33. 26 };
  34. 27 //本地地址-- 发送只有1个通道
  35. 28 const unsigned char TX_ADD[NRF24L01_CH_NUM_MAX + 1][NRF24L01_ADR_LEN] =
  36. 29 {
  37. 30 {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //对应通道0
  38. 31 {0x01, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //对应通道1
  39. 32 {0x02, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //对应通道2
  40. 33 {0x03, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //对应通道3
  41. 34 {0x04, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}, //对应通道4
  42. 35 {0x05, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4} //对应通道5
  43. 36 };
  44. 37
  45. 38
  46. 39 struct init_reg_data
  47. 40 {
  48. 41 unsigned char reg;
  49. 42 unsigned char data1;
  50. 43 unsigned char *data2;
  51. 44 unsigned char len2;
  52. 45 };
  53. 46
  54. 47 const struct init_reg_data init_first[] =
  55. 48 {
  56. 49 #if 1
  57. 50 //RX全部通道配置
  58. 51 {NRF24L01_RX_ADDR_P0, 0, RX_ADD[0], NRF24L01_ADR_LEN}, //P0接收地址
  59. 52 {NRF24L01_RX_ADDR_P1, 0, RX_ADD[1], NRF24L01_ADR_LEN}, //P1接收地址
  60. 53 {NRF24L01_RX_ADDR_P2, 0, RX_ADD[2], 1}, //P2接收地址
  61. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 2
  62. 54 {NRF24L01_RX_ADDR_P3, 0, RX_ADD[3], 1}, //P3接收地址
  63. 55 {NRF24L01_RX_ADDR_P4, 0, RX_ADD[4], 1}, //P4接收地址
  64. 56 {NRF24L01_RX_ADDR_P5, 0, RX_ADD[5], 1}, //P5接收地址
  65. 57 {NRF24L01_RX_PW_P0, NRF24L01_ADR_LEN, NULL, 0}, //P0接受通道有效宽度
  66. 58 {NRF24L01_RX_PW_P1, NRF24L01_ADR_LEN, NULL, 0}, //P1接受通道有效宽度
  67. 59 {NRF24L01_RX_PW_P2, NRF24L01_ADR_LEN, NULL, 0}, //P2接受通道有效宽度
  68. 60 {NRF24L01_RX_PW_P3, NRF24L01_ADR_LEN, NULL, 0}, //P3接受通道有效宽度
  69. 61 {NRF24L01_RX_PW_P4, NRF24L01_ADR_LEN, NULL, 0}, //P4接受通道有效宽度
  70. 62 {NRF24L01_RX_PW_P5, NRF24L01_ADR_LEN, NULL, 0}, //P5接受通道有效宽度
  71. 63 //其他配置
  72. 64 {NRF24L01_SETUP_AW, NRF24L01_ADR_LEN - 2, NULL, 0}, //设置地址长度为 NRF24L01_ADR_LEN
  73. 65 {NRF24L01_RF_SETUP, 0x0f, NULL, 0}, //设置TX发射参数,7db增益,2Mbps,低噪声增益开启
  74. 66 //RX模式配置
  75. 67 {NRF24L01_FEATURE, 0x06, NULL, 0}, //使能动态数据包长度,AUTO_ACK模式
  76. 68 //TX模式配置
  77. 69 {NRF24L01_SETUP_RETR, 0x1a, NULL, 0}, //设置自动重发间隔时间:500us + 86us;重发次数:10次
  78. 70
  79. 71 //通道/频段/TX地址配置
  80. 72 {NRF24L01_RF_CH, RF_CH_DEF, NULL, 0}, //设置RF频道为RFCH [6:0]
  81. 73 {NRF24L01_EN_AA, 1 << RF_C_NUM_DEF, NULL, 0}, //通道自动应答 : 0~5通道
  82. 74 {NRF24L01_EN_RXADDR, 1 << RF_C_NUM_DEF, NULL, 0}, //接收通道使能 : 0~5通道
  83. 75 {NRF24L01_TX_ADDR, 0, TX_ADD[RF_C_NUM_DEF], NRF24L01_ADR_LEN}, //写TX节点地址
  84. 76 {NRF24L01_DYNPD, 1 << RF_C_NUM_DEF, NULL, 0}, //选择通道0动态数据包长度
  85. 77 #else
  86. {NRF24L01_RX_PW_P0, NRF24L01_ADR_LEN, NULL, 0}, //设置接收数据长度,本次设置为32字节
  87. //{NRF24L01_FLUSE_RX, 0xff, NULL, 0}, //清除RX FIFO寄存器
  88. {NRF24L01_TX_ADDR, 0, TX_ADD[0], NRF24L01_ADR_LEN}, //写TX节点地址
  89. {NRF24L01_RX_ADDR_P0, 0, RX_ADD[0], NRF24L01_ADR_LEN}, //设置RX节点地址,主要为了使能ACK
  90. {NRF24L01_EN_AA, 0x01, NULL, 0}, //使能通道0的自动应答
  91. {NRF24L01_EN_RXADDR, 0x01, NULL, 0}, //使能通道0的接收地址
  92. {NRF24L01_SETUP_RETR, 0x1a, NULL, 0}, //设置自动重发间隔时间:500us + 86us;最大自动重发次数:10(a)
  93. -次
  94. {NRF24L01_RF_CH, 40, NULL, 0}, //设置RF通道为40 收发必须一致,0为2.4GHz + 40
  95. {NRF24L01_RF_SETUP, 0x0f, NULL, 0}, //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
  96. {NRF24L01_CONFIG, 0x0f, NULL, 0}, //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开�
  97. -羲�兄卸�
  98. #endif
  99. 92 };
  100. 93
  101. 94 const struct init_reg_data init_recv_mod[] =
  102. 95 {
  103. 96 {NRF24L01_CONFIG, 0x0f, NULL, 0}, //bit0接收模式
  104. 97 {NRF24L01_STATUS, 0x70, NULL, 0}, //清中断
  105. 98 {NRF24L01_FLUSE_RX, NRF24L01_NOP, NULL, 0}, //清理接收FIFO
  106. 99 };
  107. 100
  108. 101 const struct init_reg_data init_send_mod[] =
  109. 102 {
  110. 103 {NRF24L01_CONFIG, 0x0e, NULL, 0}, //bit0发送模式
  111. 104 {NRF24L01_STATUS, 0x70, NULL, 0}, //清中断
  112. 105 {NRF24L01_FLUSE_TX, NRF24L01_NOP, NULL, 0}, //清理发送FIFO
  113. 106 };
  114. 107
  115. 108 void NRF24L01_Init_reg ( struct init_reg_data *addr, unsigned char len )
  116. 109 {
  117. 110 1 unsigned char i;
  118. 111 1
  119. 112 1 for ( i = 0; i < len; i++ )
  120. 113 1 {
  121. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 3
  122. 114 2 if ( addr[i].data2 == NULL )
  123. 115 2 {
  124. 116 3 NRF24L01_Write_Reg ( addr[i].reg, addr[i].data1 );
  125. 117 3 }
  126. 118 2 else
  127. 119 2 {
  128. 120 3 NRF24L01_Write_Buf ( addr[i].reg, addr[i].data2, addr[i].len2 );
  129. 121 3 }
  130. 122 2 }
  131. 123 1 }
  132. 124
  133. 125 unsigned char NRF24L01_check_reg ( struct init_reg_data *addr, unsigned char len )
  134. 126 {
  135. 127 1 unsigned char buff[5];
  136. 128 1 unsigned char i, j;
  137. 129 1
  138. 130 1 for ( i = 0; i < len; i++ )
  139. 131 1 {
  140. 132 2 if ( addr[i].data2 == NULL )
  141. 133 2 {
  142. 134 3 buff[0] = NRF24L01_Read_Reg ( addr[i].reg );
  143. 135 3
  144. 136 3 if ( buff[0] != addr[i].data1 )
  145. 137 3 {
  146. 138 4 return 0;
  147. 139 4 }
  148. 140 3 }
  149. 141 2 else
  150. 142 2 {
  151. 143 3 NRF24L01_Read_Buf ( addr[i].reg, buff, addr[i].len2 );
  152. 144 3
  153. 145 3 for ( j = 0; j < 5; j++ )
  154. 146 3 {
  155. 147 4 if ( buff[j] != addr[i].data2[j] )
  156. 148 4 {
  157. 149 5 return 0;
  158. 150 5 }
  159. 151 4 }
  160. 152 3 }
  161. 153 2 }
  162. 154 1
  163. 155 1 return 1;
  164. 156 1 }
  165. 157
  166. 158 //向从机发送一个字节数据并返回接收数据
  167. 159 /**************************************************/
  168. 160 #if 0
  169. unsigned char SPI_WriteRead ( unsigned char byte )
  170. {
  171. unsigned char bit_ctr;
  172. for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ ) // 输出8位
  173. {
  174. NRF_MOSI = ( byte & 0x80 ); // MSB TO MOSI
  175. byte = ( byte << 1 ); // shift next bit to MSB
  176. NRF_SCK = 1;
  177. byte |= NRF_MISO; // capture current MISO bit
  178. NRF_SCK = 0;
  179. }
  180. return byte;
  181. }
  182. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 4
  183. #else
  184. 177 unsigned char SPI_WriteRead ( unsigned char byte )
  185. 178 {
  186. 179 1 unsigned char i;
  187. 180 1 SPDR = byte; //写寄存器
  188. 181 1
  189. 182 1 for ( i = 0; i < 255; i++ )
  190. 183 1 {
  191. 184 2 if ( SPSR & SET_BIT7 )
  192. 185 2 {
  193. 186 3 break; //等待传输
  194. 187 3 }
  195. 188 2 }
  196. 189 1
  197. 190 1 SPSR &= ~SET_BIT7;
  198. 191 1 byte = SPDR; //读寄存器
  199. 192 1 return byte;
  200. 193 1 }
  201. 194
  202. 195 #endif
  203. 196
  204. 197 //写NRF24L01寄存器,返回状态值
  205. 198 unsigned char NRF24L01_Write_Reg ( unsigned char reg, unsigned char value )
  206. 199 {
  207. 200 1 unsigned char BackDate;
  208. 201 1 NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  209. 202 1 NRF_CSN = 0;
  210. 203 1 if( reg <= 0x1F ){ //0~0x1f
  211. 204 2 reg = NRF24L01_WRITE_REG | reg;
  212. 205 2 }
  213. 206 1 SPI_WriteRead ( reg );
  214. 207 1 BackDate = SPI_WriteRead ( value );
  215. 208 1 NRF_CSN = 1;
  216. 209 1 NRF_CE = 1; //恢复正常模式
  217. 210 1 return ( BackDate );
  218. 211 1 }
  219. 212 //读NRF24L01寄存器,返回寄存器值
  220. 213 unsigned char NRF24L01_Read_Reg ( unsigned char reg )
  221. 214 {
  222. 215 1 unsigned char BackDate;
  223. 216 1 NRF_CSN = 0;
  224. 217 1 if( reg <= 0x1F ){ //0~0x1f
  225. 218 2 reg = NRF24L01_READ_REG | reg;
  226. 219 2 }
  227. 220 1 SPI_WriteRead ( reg );
  228. 221 1 BackDate = SPI_WriteRead ( NRF24L01_NOP ); //NOP,无效值,用于读取
  229. 222 1 NRF_CSN = 1;
  230. 223 1 return ( BackDate );
  231. 224 1 }
  232. 225
  233. 226 //向缓冲区写入数据
  234. 227 unsigned char NRF24L01_Write_Buf ( unsigned char reg, unsigned char *pBuf, unsigned char bytes )
  235. 228 {
  236. 229 1 unsigned char status, byte_ctr;
  237. 230 1
  238. 231 1 NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  239. 232 1 NRF_CSN = 0;
  240. 233 1
  241. 234 1 if( reg <= 0x1F ){ //0~0x1f
  242. 235 2 reg = NRF24L01_WRITE_REG | reg;
  243. 236 2 }
  244. 237 1 status = SPI_WriteRead ( reg );
  245. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 5
  246. 238 1
  247. 239 1 for ( byte_ctr = 0; byte_ctr < bytes; byte_ctr++ )
  248. 240 1 {
  249. 241 2 SPI_WriteRead ( *pBuf++ );
  250. 242 2 }
  251. 243 1
  252. 244 1 NRF_CSN = 1;
  253. 245 1 NRF_CE = 1; //恢复正常模式
  254. 246 1 return ( status );
  255. 247 1 }
  256. 248
  257. 249 //读取缓冲区数据
  258. 250 void NRF24L01_Read_Buf ( unsigned char reg, unsigned char *pBuf, unsigned char bytes )
  259. 251 {
  260. 252 1 unsigned char byte_ctr;
  261. 253 1 NRF_CSN = 0;
  262. 254 1 if( reg <= 0x1F ){ //0~0x1f
  263. 255 2 reg = NRF24L01_READ_REG | reg;
  264. 256 2 }
  265. 257 1 SPI_WriteRead ( reg );
  266. 258 1
  267. 259 1 for ( byte_ctr = 0; byte_ctr < bytes; byte_ctr++ )
  268. 260 1 {
  269. 261 2 pBuf[byte_ctr] = SPI_WriteRead ( NRF24L01_NOP ); //NOP,无效值,用于读取
  270. 262 2 }
  271. 263 1
  272. 264 1 NRF_CSN = 1;
  273. 265 1 }
  274. 266
  275. 267
  276. 268 /*
  277. 269 PIPEN 中断使能
  278. 270 PINEN 正反向特性
  279. 271 PICON 触发方式(电平或边沿检测)
  280. 272 PIF 中断标志
  281. 273 */
  282. 274 void NRF24L01_Interrupt_P03 ( void )
  283. 275 {
  284. 276 1 //P0M1|=SET_BIT3;P0M2&=~SET_BIT3; //input
  285. 277 1 PICON &= ~ ( SET_BIT0 | SET_BIT1 );
  286. 278 1 PICON |= ( 0x00 ); //[1:0]=0.端口0
  287. 279 1 PICON |= SET_BIT5; //通道3=1.边沿触发
  288. 280 1 PINEN |= SET_BIT3; // 1 = 低电平/ 下降沿触发中断
  289. 281 1 PIPEN &= ~SET_BIT3; //0 = 关闭中断(高电平/ 上升沿触发中断)
  290. 282 1 EIE |= SET_BIT1; //管脚中断,最多8个,中断号7
  291. 283 1 EA = 1; // 总中断
  292. 284 1 }
  293. 285
  294. 286
  295. 287
  296. 288
  297. 289 uint8 NRF24L01_Wait_Param ( void );
  298. 290 //NRF24L01初始化函数
  299. 291 void NRF24L01_Init ( void )
  300. 292 {
  301. 293 1 //uint8 i;
  302. 294 1 #if BK2423
  303. //NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  304. NRF24L01_Write_Reg ( ACTIVATE_CMD, 0x73 );
  305. //NRF_CE = 1;
  306. #endif
  307. 299 1
  308. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 6
  309. 300 1 NRF_CSN = 1; // Spi disable
  310. 301 1 NRF_SCK = 0; // Spi clock line init high
  311. 302 1
  312. 303 1 //NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  313. 304 1 //配置寄存器
  314. 305 1 NRF24L01_FLAG |= NRF24L01_AUTO_ACK; //是否开启应答模式
  315. 306 1 NRF24L01_FLAG |= NRF24L01_AUTO_RX; //发送完是否自动进入接收模式
  316. 307 1
  317. 308 1 #if 0
  318. //0-5通道接收地址,长度配置
  319. for ( i = 0; i <= NRF24L01_CH_NUM_MAX; i++ )
  320. {
  321. NRF24L01_Write_Buf ( NRF24L01_RX_ADDR_P0 + i, RX_ADD[i], NRF24L01_ADR_LEN ); //设置接收地址
  322. NRF24L01_Write_Reg ( NRF24L01_RX_PW_P0 + i, NRF24L01_ADR_LEN ); //接受通道有效宽度
  323. }
  324. NRF24L01_Write_Reg ( NRF24L01_SETUP_AW, NRF24L01_ADR_LEN - 2 ); //设置地址长度为 NRF24L01_ADR_LEN
  325. NRF24L01_Write_Reg ( NRF24L01_RF_CH, RF_CH ); //设置RF通道为RFCH [6:0]
  326. NRF24L01_Write_Reg ( NRF24L01_RF_SETUP, 0x07 ); //设置TX发射参数,7db增益,1Mbps,低噪声增益开
  327. -启
  328. NRF24L01_Write_Reg ( NRF24L01_EN_AA, 0x01 ); //使能通道0的自动应答
  329. NRF24L01_Write_Reg ( NRF24L01_EN_RXADDR, 0x01 ); //使能通道0的接收地址
  330. //RX模式配置
  331. //NRF24L01_Write_Buf ( NRF24L01_RX_ADDR_P0, RX_ADD[0], NRF24L01_ADR_LEN ); //写RX节点地址
  332. NRF24L01_Write_Reg ( NRF24L01_FEATURE, 0x05 ); //使能动态数据包长度,AUTO_ACK模式
  333. NRF24L01_Write_Reg ( NRF24L01_DYNPD, 0X01 ); //选择通道0动态数据包长度
  334. NRF24L01_Write_Reg ( NRF24L01_FLUSE_RX, NRF24L01_NOP ); //清除RX FIFO寄存器,写1清除
  335. //TX模式配置
  336. NRF24L01_Write_Buf ( NRF24L01_TX_ADDR , TX_ADD[RF_C_NUM], NRF24L01_ADR_LEN ); //写TX节点地址
  337. NRF24L01_Write_Reg ( NRF24L01_SETUP_RETR, 0x1f ); //设置自动重发间隔时间:500us + 86us;最大自动�
  338. -胤⒋问�:15次
  339. NRF24L01_Write_Reg ( NRF24L01_FLUSE_TX, NRF24L01_NOP ); //清除TX FIFO寄存器,写1清除
  340. NRF24L01_RxMode(); //默认进入接收模式
  341. //NRF_CE = 1;
  342. NRF24L01_Change_Working_Frequency ( 0x64 );
  343. NRF24L01_Change_Data_Channel ( 2 );
  344. #else
  345. 336 1 NRF24L01_Init_reg ( init_first, sizeof ( init_first ) / sizeof ( init_first[0] ) );
  346. 337 1 #endif
  347. 338 1
  348. 339 1 NRF24L01_RxMode();
  349. 340 1 NRF24L01_Interrupt_P03();
  350. 341 1
  351. 342 1 NRF24L01_Wait_Param();
  352. 343 1 }
  353. 344
  354. 345 //NRF24L01进入发送模式
  355. 346 void NRF24L01_TxMode ( void )
  356. 347 {
  357. 348 1 //NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  358. 349 1 #if 0
  359. NRF24L01_Write_Reg ( NRF24L01_CONFIG, 0x0e );
  360. NRF24L01_Write_Reg ( NRF24L01_STATUS, 0x70 ); //清除中断标志
  361. NRF24L01_Write_Reg ( NRF24L01_FLUSE_TX, NRF24L01_NOP ); //清除TX FIFO寄存器,写1清除
  362. #else
  363. 354 1 NRF24L01_Init_reg ( init_send_mod, sizeof ( init_send_mod ) / sizeof ( init_send_mod[0] ) );
  364. 355 1 #endif
  365. 356 1 //NRF_CE = 1;
  366. 357 1 NRF24L01_FLAG &= ~NRF24L01_MODE_RX; //修改状态标识为发射模式
  367. 358 1 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
  368. 359 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
  369. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 7
  370. 360 1 Timer3_Delay10us ( 1 );
  371. 361 1 }
  372. 362 //NRF24L01进入接收模式
  373. 363 void NRF24L01_RxMode ( void )
  374. 364 {
  375. 365 1 //NRF_CE = 0; //在写寄存器之前一定要进入待机模式或掉电模式。
  376. 366 1 #if 0
  377. NRF24L01_Write_Reg ( NRF24L01_CONFIG, 0x0f ); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模
  378. -式
  379. NRF24L01_Write_Reg ( NRF24L01_STATUS, 0x70 ); //清除中断标志
  380. NRF24L01_Write_Reg ( NRF24L01_FLUSE_RX, NRF24L01_NOP ); //清除RX FIFO寄存器,写1清除
  381. #else
  382. 371 1 NRF24L01_Init_reg ( init_recv_mod, sizeof ( init_recv_mod ) / sizeof ( init_recv_mod[0] ) );
  383. 372 1 #endif
  384. 373 1 //NRF_CE = 1;
  385. 374 1 NRF24L01_FLAG |= NRF24L01_MODE_RX; //修改状态标识为接收模式
  386. 375 1 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
  387. 376 1 DYNPD_LEN = 0; //清0动态数据包长度
  388. 377 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
  389. 378 1 Timer3_Delay10us ( 13 );
  390. 379 1 }
  391. 380
  392. 381
  393. 382 uint8 NRF24L01_Wait_Param ( void )
  394. 383 {
  395. 384 1 uint8 res = 1;
  396. 385 1 #if 1
  397. 386 1 uint8 i;
  398. 387 1 uint8 TX_Buff[5]={0}, RX_Buff[5]={0}, FRE, CH;
  399. 388 1 NRF24L01_Read_Buf ( NRF24L01_TX_ADDR, TX_Buff, NRF24L01_ADR_LEN );
  400. 389 1 NRF24L01_Read_Buf ( NRF24L01_RX_ADDR_P0 + RF_C_NUM, RX_Buff, NRF24L01_ADR_LEN );
  401. 390 1 CH = NRF24L01_Read_Reg ( NRF24L01_EN_RXADDR );
  402. 391 1 FRE = NRF24L01_Read_Reg ( NRF24L01_RF_CH );
  403. 392 1
  404. 393 1 //接收/发送地址检查
  405. 394 1 for ( i = 0; i < ( RF_C_NUM < 2 ? 5 : 1 ); i++ )
  406. 395 1 {
  407. 396 2 if ( TX_Buff[i] != TX_ADD[RF_C_NUM][i] || RX_Buff[i] != RX_ADD[RF_C_NUM][i] )
  408. 397 2 {
  409. 398 3 res = 0;
  410. 399 3 break;
  411. 400 3 }
  412. 401 2 }
  413. 402 1
  414. 403 1 //通道使能检查
  415. 404 1 if ( ! ( CH & ( 1 << RF_C_NUM ) ) )
  416. 405 1 {
  417. 406 2 res = 0;
  418. 407 2 }
  419. 408 1
  420. 409 1 //频道检查
  421. 410 1 if ( FRE != RF_CH )
  422. 411 1 {
  423. 412 2 res = 0;
  424. 413 2 }
  425. 414 1
  426. 415 1 DBG ( "TX=%x %x %x %x %x\n"
  427. 416 1 "RX=%x %x %x %x %x\n"
  428. 417 1 "CH=%d\n"
  429. 418 1 "FRE=%d\n",
  430. 419 1 TX_Buff[0], TX_Buff[1], TX_Buff[2], TX_Buff[3], TX_Buff[4],
  431. 420 1 RX_Buff[0], RX_Buff[1], RX_Buff[2], RX_Buff[3], RX_Buff[4],
  432. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 8
  433. 421 1 CH,
  434. 422 1 FRE);
  435. 423 1 #else
  436. res = NRF24L01_check_reg ( init_first, sizeof ( init_first ) / sizeof ( init_first[0] ) );
  437. #endif
  438. 426 1
  439. 427 1 res ? ( NRF24L01_FLAG |= NRF24L01_CHECK ) : ( NRF24L01_FLAG &= ~NRF24L01_CHECK );
  440. 428 1 return res;
  441. 429 1 }
  442. 430
  443. 431
  444. 432 //NRF24L01发送数据
  445. 433 void NRF24L01_SendFrame ( unsigned char *temp, unsigned char len )
  446. 434 {
  447. 435 1 if ( NRF24L01_FLAG & NRF24L01_MODE_RX )
  448. 436 1 {
  449. 437 2 NRF24L01_TxMode();
  450. 438 2 }
  451. 439 1
  452. 440 1 NRF24L01_FLAG |= NRF24L01_BUSY; //BUSY标志置1
  453. 441 1 NRF24L01_FLAG &= ~NRF24L01_TX_ACCESS;//清除发送成功标志
  454. 442 1 //NRF_CE = 0;
  455. 443 1
  456. 444 1 if ( NRF24L01_FLAG & NRF24L01_AUTO_ACK )
  457. 445 1 {
  458. 446 2 NRF24L01_Write_Buf ( NRF24L01_WR_TX_PLOAD, temp, len ); //写待发数据包,需要回应
  459. 447 2 }
  460. 448 1 else
  461. 449 1 {
  462. 450 2 NRF24L01_Write_Buf ( W_TX_PAYLOAD_NOACK_CMD, temp, len ); //写待发数据包,无须回应
  463. 451 2 }
  464. 452 1
  465. 453 1 //NRF_CE = 1;
  466. 454 1 }
  467. 455
  468. 456 //NRF24L01接收数据
  469. 457 void NRF24L01_RecvFrame ( unsigned char *temp )
  470. 458 {
  471. 459 1 DYNPD_LEN = NRF24L01_Read_Reg ( R_RX_PL_WID_CMD );
  472. 460 1
  473. 461 1 if ( DYNPD_LEN > 32 )
  474. 462 1 {
  475. 463 2 NRF24L01_RxMode(); //重新初始化接收模式
  476. 464 2 }
  477. 465 1 else
  478. 466 1 {
  479. 467 2 NRF24L01_Read_Buf ( NRF24L01_RD_RX_PLOAD, temp, DYNPD_LEN ); //读取缓冲区数据
  480. 468 2 }
  481. 469 1
  482. 470 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
  483. 471 1 }
  484. 472 //更改工作频率0~7f
  485. 473 void NRF24L01_Change_Working_Frequency ( unsigned char ch ) //0~7f
  486. 474 {
  487. 475 1 if ( ch > 0x7f )
  488. 476 1 {
  489. 477 2 return;
  490. 478 2 }
  491. 479 1
  492. 480 1 //NRF_CE = 0;
  493. 481 1 NRF24L01_Write_Reg ( NRF24L01_RF_CH, ch & 0x7F ); //设置RF频道
  494. 482 1 //NRF_CE = 1;
  495. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 9
  496. 483 1 RF_CH = ch & 0x7F; //同步设置到系统参数
  497. 484 1 }
  498. 485
  499. 486 //更改通道0~3f
  500. 487 void NRF24L01_Change_Data_Channel ( unsigned char ch ) //0~5
  501. 488 {
  502. 489 1 if ( ch > NRF24L01_CH_NUM_MAX )
  503. 490 1 {
  504. 491 2 return;
  505. 492 2 }
  506. 493 1
  507. 494 1 RF_C_NUM = ch;
  508. 495 1
  509. 496 1 NRF24L01_Write_Reg ( NRF24L01_EN_AA, 1 << RF_C_NUM ); //通道自动应答
  510. 497 1 NRF24L01_Write_Reg ( NRF24L01_EN_RXADDR, 1 << RF_C_NUM ); //接收通道使能
  511. 498 1
  512. 499 1 NRF24L01_Write_Buf ( NRF24L01_TX_ADDR , TX_ADD[RF_C_NUM], NRF24L01_ADR_LEN ); //写TX节点地址
  513. 500 1 NRF24L01_Write_Reg ( NRF24L01_DYNPD, 1 << RF_C_NUM ); //通道TX自动长度
  514. 501 1 }
  515. 502
  516. 503 //NRF24L01中断处理:当状态寄存器中 TX_DS、 RX_DR 或 MAX_RT 为高时触发中断。
  517. 504 #ifdef N76E003_IAR
  518. #pragma vector=0x3B
  519. __interrupt void NRF24L01_Handler ( void )
  520. #else
  521. 508 void NRF24L01_Handler ( void ) interrupt 7 //interrupt address is 0x001B
  522. 509 #endif
  523. 510 {
  524. 511 1 unsigned char state, fifo_state, flag;
  525. 512 1 clr_EPI; //关闭管脚中断7
  526. 513 1 flag = PIF;
  527. 514 1 PIF = 0x00; //清除全部标志
  528. 515 1 state = NRF24L01_Read_Reg ( NRF24L01_STATUS ); //读NRF24L01状态寄存器
  529. 516 1 fifo_state = NRF24L01_Read_Reg ( NRF24L01_FIFO_STATUS ); //读NRF24L01FIFO状态寄存器
  530. 517 1 NRF24L01_Write_Reg ( NRF24L01_STATUS, state ); //清除中断,写1清除
  531. 518 1
  532. 519 1 //发送成功中断
  533. 520 1 if ( state & NRF24L01_STATUS_TX_DS )
  534. 521 1 {
  535. 522 2 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
  536. 523 2 NRF24L01_FLAG |= NRF24L01_TX_ACCESS;//发送成功标志置1
  537. 524 2
  538. 525 2 if ( NRF24L01_FLAG & NRF24L01_AUTO_RX )
  539. 526 2 {
  540. 527 3 NRF24L01_RxMode(); //重新初始化接收模式
  541. 528 3 }
  542. 529 2 }
  543. 530 1
  544. 531 1 //达到最大重发次数中断
  545. 532 1 if ( state & NRF24L01_STATUS_MAX_RT )
  546. 533 1 {
  547. 534 2 NRF24L01_Write_Reg ( NRF24L01_FLUSE_TX, NRF24L01_NOP ); //清除TX FIFO寄存器,写1清除
  548. 535 2 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
  549. 536 2 NRF24L01_FLAG &= ~NRF24L01_TX_ACCESS;//发送成功标志置0
  550. 537 2 }
  551. 538 1
  552. 539 1 //接收到数据中断
  553. 540 1 if ( state & NRF24L01_STATUS_RX_DR )
  554. 541 1 {
  555. 542 2 NRF24L01_FLAG |= NRF24L01_RECIVE; //接收到数据标志位置1
  556. 543 2 }
  557. 544 1
  558. C51 COMPILER V9.53.0.0 NRF24L01_INTE 09/28/2018 15:19:33 PAGE 10
  559. 545 1 //TX_FIFO满中断
  560. 546 1 if ( state & NRF24L01_STATUS_TX_FULL )
  561. 547 1 {
  562. 548 2 NRF24L01_TxMode(); //重新初始化发射模式
  563. 549 2 }
  564. 550 1
  565. 551 1 //RX_FIFO满
  566. 552 1 if ( fifo_state & NRF24L01_STATUS_RX_FULL )
  567. 553 1 {
  568. 554 2 NRF24L01_RxMode(); //重新初始化接收模式
  569. 555 2 }
  570. 556 1
  571. 557 1 state = NRF24L01_Read_Reg ( NRF24L01_CONFIG ); //读NRF24L01状态寄存器
  572. 558 1 set_EPI; //开启管脚中断7
  573. 559 1 }
  574. MODULE INFORMATION: STATIC OVERLAYABLE
  575. CODE SIZE = 2533 ----
  576. CONSTANT SIZE = 60 ----
  577. XDATA SIZE = 288 ----
  578. PDATA SIZE = ---- ----
  579. DATA SIZE = ---- ----
  580. IDATA SIZE = ---- ----
  581. BIT SIZE = ---- ----
  582. END OF MODULE INFORMATION.
  583. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)