NRF24L01_inte.c 17 KB

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