857381578e9303fb7da354917782a330ce5e2256.svn-base 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #include "nrf24l01.h"
  2. const u8 TX_ADDRESS [TX_ADR_WIDTH]={0x60,0x20,0x30,0x40,0x50}; //发送地址
  3. const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x10,0x20,0x30,0x40,0x50}; //接收地址
  4. const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x20,0x20,0x30,0x40,0x50}; //接收地址
  5. const u8 RX_ADDRESS2[1 ]={0x30}; //接收地址
  6. const u8 RX_ADDRESS3[1 ]={0x40}; //接收地址
  7. const u8 RX_ADDRESS4[1 ]={0x50}; //接收地址
  8. const u8 RX_ADDRESS5[1 ]={0x60}; //接收地址
  9. /*************************************************
  10. * 函数名称:InitNrf24L01
  11. * 功能描述:初始NRF24L01,包括对IRQ引脚的初始化
  12. * 输入参数:无
  13. * 输出参数:无
  14. * 返回值: 返回0成功,返回1失败
  15. **************************************************/
  16. u8 InitNrf24L01(void)
  17. {
  18. #if 0
  19. GPIO_InitTypeDef GPIO_InitStructure;
  20. //使能GPIO 的时钟
  21. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);
  22. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  24. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25. GPIO_Init(GPIOB, &GPIO_InitStructure);
  26. //
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
  28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  29. GPIO_Init(GPIOA, &GPIO_InitStructure);
  30. #endif
  31. //芯片失能
  32. NRF_CE_H;
  33. //没有中断
  34. IRQ_H;
  35. //SPI失能
  36. CSN_H;
  37. //MUC对nrf的中断配置
  38. NrfIsrCfg();
  39. return Nrf24L01Check();
  40. }
  41. /*************************************************
  42. * 函数名称:SpiReadWriteByte
  43. * 功能描述:主、从机交换8位数据
  44. * 输入参数:- TxData:主机发送的数据
  45. * 输出参数:无
  46. * 返回值: 从机发送的数据
  47. **************************************************/
  48. #if 0
  49. u8 SpiReadWriteByte(u8 TxData)
  50. {
  51. u8 i;
  52. NRF_SCK_L;//拉低时钟
  53. for(i=0;i<8;i++)
  54. {
  55. if(TxData & 0x80)
  56. MOSI_H;
  57. else
  58. MOSI_L;
  59. //移空最低位,丢弃最高位
  60. TxData = (TxData << 1);
  61. //写从设备
  62. NRF_SCK_H;
  63. //读从设备
  64. if(READ_MISO)
  65. //保存读取的数据
  66. TxData |= 0x01;
  67. //拉低时钟线.完成一次数据交换(SR和BUF)
  68. NRF_SCK_L;
  69. }
  70. return(TxData);
  71. }
  72. #else
  73. unsigned char SpiReadWriteByte ( unsigned char byte )
  74. {
  75. unsigned char i;
  76. SPDR = byte; //写寄存器
  77. for ( i = 0; i < 255; i++ )
  78. {
  79. if ( SPSR & SET_BIT7 )
  80. {
  81. break; //等待传输
  82. }
  83. }
  84. SPSR &= ~SET_BIT7;
  85. byte = SPDR; //读寄存器
  86. return byte;
  87. }
  88. #endif
  89. /*************************************************
  90. * 函数名称:Nrf24l01ReadWriteBus
  91. * 功能描述:主、从机交换多个字节数据
  92. * 输入参数:- cmd:指令;
  93. - data:主机发送的数据
  94. * 输出参数:- data:从机发送的数据
  95. * 返回值: 无
  96. **************************************************/
  97. void Nrf24l01ReadWriteBus(u8 cmd,u8 Data[],u8 cnt)
  98. {
  99. //1、使能SPI传输
  100. //2、发送指令
  101. //3、发送、接收数据
  102. //4、失能SPI传输
  103. u8 i;
  104. CSN_L;
  105. SpiReadWriteByte(cmd);
  106. for(i = 0; i < cnt; i++)
  107. {
  108. Data[i] = SpiReadWriteByte(Data[i]);
  109. }
  110. CSN_H;
  111. }
  112. /*************************************************
  113. * 函数名称:Nrf24L01Check
  114. * 功能描述:检测NRF24L01是否存在
  115. * 输入参数:无
  116. * 输出参数:无
  117. * 返回值: 返回0存在,返回1不存在
  118. **************************************************/
  119. u8 Nrf24L01Check(void)
  120. {
  121. u8 a[5]={0XA0,0XA1,0XA2,0XA3,0XA4};
  122. u8 b[5];
  123. u8 i;
  124. for(i=0;i<5;i++)b[i]=a[i];
  125. //写入5个字节.
  126. Nrf24l01ReadWriteBus(SPI_WRITE_REG+TX_ADDR,a,5);
  127. //读出写入的5个字节
  128. Nrf24l01ReadWriteBus(SPI_READ_REG+TX_ADDR,a,5);
  129. for(i=0;i<5;i++)
  130. {
  131. if(a[i]!=b[i]) break;
  132. }
  133. if(i!=5) return 1; //NRF24L01不在位
  134. return 0; //NRF24L01在位
  135. }
  136. /*************************************************
  137. * 函数名称:Nrf24L01SendPacket
  138. * 功能描述:启动NRF24L01发送一次数据
  139. * 输入参数:- tx_buf:要发送的数据
  140. * 输出参数:无
  141. * 返回值: 无
  142. **************************************************/
  143. void Nrf24L01SendPacket(u8 *tx_buf)
  144. {
  145. u8 result,Data[TX_PLOAD_WIDTH];
  146. //失能芯片,进入配置模式
  147. NRF_CE_L;
  148. //数据复制,不希望原数据被更改
  149. for(result=0;result<TX_PLOAD_WIDTH;result++)
  150. Data[result]=tx_buf[result];
  151. //写数据到发送缓冲区TX BUF 32个字节
  152. Nrf24l01ReadWriteBus(WR_TX_PLOAD,Data,TX_PLOAD_WIDTH);
  153. //使能芯片,启动发送
  154. NRF_CE_H;
  155. }
  156. /*************************************************
  157. * 函数名称:Nrf24l01GetPacketHandler
  158. * 功能描述:NRF24L01接收数据中断处理函数
  159. * 输入参数:- rx_buf:接收数据的数组
  160. * 输出参数:- rx_buf: 接收到的数据
  161. * 返回值: 接收的通道号
  162. **************************************************/
  163. u8 Nrf24l01GetPacketHandler(u8 *rx_buf)
  164. {
  165. u8 result,channel;
  166. //读取状态寄存器的值
  167. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&result,1);
  168. //得到接收的通道号
  169. channel=((result&(7<<1))>>1);
  170. //读取数据
  171. Nrf24l01ReadWriteBus(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
  172. //清除中断标志位
  173. Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&result,1);
  174. //清空接收FIFO,读取之后自动清空,若不读取,必须清空, 否则nrf24l01无法正常工作:不能产生中断信号
  175. //Nrf24l01ReadWriteBus(FLUSH_RX,&result,1);
  176. //返回接收的通道号
  177. return channel;
  178. }
  179. /*************************************************
  180. * 函数名称:Nrf24l01SendSuccessHandler
  181. * 功能描述:发送数据成功中断处理函数
  182. * 输入参数:无
  183. * 输出参数:无
  184. * 返回值: 无
  185. **************************************************/
  186. void Nrf24l01SendSuccessHandler(void)
  187. {
  188. u8 Data;
  189. //读取状态寄存器
  190. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  191. //清除所有中断标志位
  192. Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&Data,1);
  193. //清除TX FIFO寄存器,发送成功,自动清除
  194. // Nrf24l01ReadWriteBus(FLUSH_TX,&data,1);
  195. }
  196. /*************************************************
  197. * 函数名称:Nrf24l01SendFailHandler
  198. * 功能描述:发送数据失败中断处理函数
  199. * 输入参数:无
  200. * 输出参数:无
  201. * 返回值: 无
  202. **************************************************/
  203. void Nrf24l01SendFailHandler(void)
  204. {
  205. u8 Data;
  206. //读取状态寄存器
  207. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  208. //清除所有中断标志位
  209. Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&Data,1);
  210. //清除TX FIFO寄存器,发送失败,必须手动清除,否则nrf24l01不能正常工作
  211. Nrf24l01ReadWriteBus(FLUSH_TX,&Data,1);
  212. }
  213. /*************************************************
  214. * 函数名称:Nrf24l01GetMode
  215. * 功能描述:配置NRF24L01到接收模式
  216. * 输入参数:无
  217. * 输出参数:无
  218. * 返回值: 无
  219. **************************************************/
  220. void Nrf24l01GetMode(void)
  221. {
  222. u8 Data[RX_ADR_WIDTH],i;
  223. //芯片失能,模块进入配置模式
  224. NRF_CE_L;
  225. //写RX节点地址,注意,是先写低位地址的,通道0可以拥有独立的40位地址。通道1-5的最低位字节地址不一样,其他必须一样
  226. for(i=0;i<RX_ADR_WIDTH;i++)
  227. Data[i]=RX_ADDRESS0[i];
  228. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P0,Data,RX_ADR_WIDTH);
  229. for(i=0;i<RX_ADR_WIDTH;i++)
  230. Data[i]=RX_ADDRESS1[i];
  231. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P1,Data,RX_ADR_WIDTH);
  232. Data[0]=RX_ADDRESS2[0];
  233. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P2,Data,1);
  234. Data[0]=RX_ADDRESS3[0];
  235. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P3,Data,1);
  236. Data[0]=RX_ADDRESS4[0];
  237. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P4,Data,1);
  238. Data[0]=RX_ADDRESS5[0];
  239. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P5,Data,1);
  240. //使能通道0-5的自动应答,根据手册默认都是是开启的,实际测试发现并没有,可能是其他因素所致
  241. Data[0] = 0x3f;
  242. Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_AA,Data,1);
  243. //使能通道0-5的接收地址,通道0,1默认的开启的
  244. Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  245. Data[0] = 0x3f;
  246. Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  247. //选择通道0的有效数据宽度
  248. Data[0] = RX_PLOAD_WIDTH;
  249. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P0,Data,1);
  250. //选择通道1的有效数据宽度
  251. Data[0] = RX_PLOAD_WIDTH;
  252. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P1,Data,1);
  253. //选择通道2的有效数据宽度
  254. Data[0] = RX_PLOAD_WIDTH;
  255. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P2,Data,1);
  256. //选择通道3的有效数据宽度
  257. Data[0] = RX_PLOAD_WIDTH;
  258. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P3,Data,1);
  259. //选择通道4的有效数据宽度
  260. Data[0] = RX_PLOAD_WIDTH;
  261. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P4,Data,1);
  262. //选择通道5的有效数据宽度
  263. Data[0] = RX_PLOAD_WIDTH;
  264. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P5,Data,1);
  265. //射频通道0-6位
  266. Data[0] = 0x4f;
  267. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_CH,Data,1);
  268. //0db增益,2Mbps,低噪声增益开启
  269. Data[0]=0;
  270. //bit3:产生速率,1->2Mbps 0->1Mbps
  271. Data[0]|=1<<3;
  272. //bit2-bit1:发射功率,
  273. //00:-18dBm 01:-12dBm 10:-6dBm 11:0dBm
  274. Data[0]|=0<<1;
  275. //bit0:低噪声放大器增益,1开启0关闭
  276. Data[0]|=0<<0;
  277. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_SETUP,Data,1);
  278. Data[0]=0;
  279. //bit6:接收中断,1屏蔽,0不屏蔽
  280. Data[0]|=0<<6;
  281. //bit5:发送中断,1屏蔽,0不屏蔽
  282. Data[0]|=0<<5;
  283. //bit4:达到最大重发中断,1屏蔽,0不屏蔽
  284. Data[0]|=0<<4;
  285. //bit3:CRC使能,1使能,0不使能
  286. Data[0]|=1<<3;
  287. //bit2:CRC模式,1->16位CRC校验,0->8位CRC校验
  288. Data[0]|=1<<2;
  289. //bit1:1上电0掉电
  290. Data[0]|=1<<1;
  291. //bit0:1接收模式0发送模式
  292. Data[0]|=1<<0;
  293. Nrf24l01ReadWriteBus(SPI_WRITE_REG+CONFIG, Data,1);
  294. //必须先清空接收FIFO否则nrf不能产生中断信号
  295. //如果此时mcu使用接收中断的方式处理,就无法进
  296. //入中断,IRQ一直保持低电平或高电平,若清除了
  297. //标志位,就一直保持高电平,否则一直保持低电
  298. //平。若使用查询方式,那么不必执行清空接收
  299. //FIFO但有可能第一次接收到错误的数据
  300. Nrf24l01ReadWriteBus(FLUSH_RX,Data,1);
  301. //读取状态寄存器的值
  302. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,Data,1);
  303. //清除所有的标志位,否则进入工作模式后IRQ一直为低
  304. Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,Data,1);
  305. //芯片使能,进入接收模式
  306. NRF_CE_H;
  307. }
  308. /*************************************************
  309. * 函数名称:Nrf24l01SendMode
  310. * 功能描述:配置NRF24L01到发送模式
  311. * 输入参数:无
  312. * 输出参数:无
  313. * 返回值: 无
  314. **************************************************/
  315. void Nrf24l01SendMode(void)
  316. {//
  317. u8 Data[TX_ADR_WIDTH],i;
  318. //地址复制,不希望原数据被更改
  319. for(i=0;i<TX_ADR_WIDTH;i++)
  320. Data[i]=TX_ADDRESS[i];
  321. //失能芯片,进入配置模式
  322. NRF_CE_L;
  323. //写TX节点地址
  324. Nrf24l01ReadWriteBus(SPI_WRITE_REG+TX_ADDR,Data,TX_ADR_WIDTH);
  325. //设置RX节点地址,一定是使用通道0的,在发送端,规定使用通道0发送数据和接收应答信号,
  326. //收发地址是一样的才能正确应答
  327. for(i=0;i<TX_ADR_WIDTH;i++)
  328. Data[i]=TX_ADDRESS[i];
  329. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P0,Data,TX_ADR_WIDTH);
  330. //使能通道0的自动应答
  331. Data[0]=1;
  332. Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_AA,Data,1);
  333. //使能通道0的接收地址
  334. Data[0]=1;
  335. Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  336. //设置自动重发间隔时间,最大自动重发次数
  337. Data[0]=0x0;
  338. //bit7-bit4:自动重发延时,250*x+86us
  339. Data[0]|=(0<<4);
  340. //bit3-bit0:自动重发次数
  341. Data[0]|=(15<<0);
  342. Nrf24l01ReadWriteBus(SPI_WRITE_REG+SETUP_RETR,Data,1);
  343. //设置RF通道bit0-bit6 实际通信频率=RF_CH+2400 (MHz)
  344. Data[0]=0x4f;
  345. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_CH,Data,1);
  346. //0db增益,2Mbps,低噪声增益开启
  347. Data[0]=0;
  348. //bit3:产生速率,1->2Mbps 0->1Mbps
  349. Data[0]|=1<<3;
  350. //bit2-bit1:发射功率,
  351. //00:-18dBm 01:-12dBm 10:-6dBm 11:0dBm
  352. Data[0]|=0<<1;
  353. //bit0:低噪声放大器增益,1开启0关闭
  354. Data[0]|=0<<0;
  355. Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_SETUP,Data,1);
  356. Data[0]=0;
  357. //bit6:接收中断,1屏蔽,0不屏蔽
  358. Data[0]|=0<<6;
  359. //bit5:发送中断,1屏蔽,0不屏蔽
  360. Data[0]|=0<<5;
  361. //bit4:达到最大重发中断,1屏蔽,0不屏蔽
  362. Data[0]|=0<<4;
  363. //bit3:CRC使能,1使能,0不使能
  364. Data[0]|=1<<3;
  365. //bit2:CRC模式,1->16位CRC校验,0->8位CRC校验
  366. Data[0]|=1<<2;
  367. //bit1:1上电0掉电
  368. Data[0]|=1<<1;
  369. //bit0:1接收模式0发送模式
  370. Data[0]|=0<<0;
  371. Nrf24l01ReadWriteBus(SPI_WRITE_REG+CONFIG,Data,1);
  372. //清空发送FIFO
  373. Nrf24l01ReadWriteBus(FLUSH_TX,Data,1);
  374. //读取状态寄存器
  375. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,Data,1);
  376. //清除所有中断标志位
  377. Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,Data,1);
  378. //芯片使能,进入发送模式
  379. NRF_CE_H;
  380. }
  381. /*************************************************
  382. * 函数名称:NrfIsrCfg
  383. * 功能描述:配置NRF24L01 IRQ引脚中断io
  384. * 输入参数:无
  385. * 输出参数:无
  386. * 返回值: 无
  387. **************************************************/
  388. void NrfIsrCfg(void)
  389. {
  390. #if 0
  391. //1、时钟使能。
  392. //2、muc外部中断引脚的配置
  393. //3、中断优先级的配置
  394. GPIO_InitTypeDef GPIO_InitStructure;
  395. EXTI_InitTypeDef EXTI_InitStruct;
  396. NVIC_InitTypeDef NVIC_InitStruct;
  397. //清除中断标志位
  398. EXTI_ClearITPendingBit(0x1f<<5);
  399. //开启复用功能时钟和io时钟
  400. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
  401. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  402. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  403. GPIO_Init(GPIOA,&GPIO_InitStructure);
  404. //配置中断源
  405. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);
  406. //外部中断线配置
  407. EXTI_InitStruct.EXTI_Line=EXTI_Line6;
  408. EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  409. EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  410. EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
  411. EXTI_Init( &EXTI_InitStruct);
  412. //优先级配置
  413. NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;
  414. NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  415. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x3;
  416. NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x3;
  417. NVIC_Init(&NVIC_InitStruct);
  418. #else
  419. /*
  420. NRF24L01_Interrupt_P03
  421. PIPEN 中断使能
  422. PINEN 正反向特性
  423. PICON 触发方式(电平或边沿检测)
  424. PIF 中断标志
  425. */
  426. //P0M1|=SET_BIT3;P0M2&=~SET_BIT3; //input
  427. PICON &= ~ ( SET_BIT0 | SET_BIT1 );
  428. PICON |= ( 0x00 ); //[1:0]=0.端口0
  429. PICON |= SET_BIT5; //通道3=1.边沿触发
  430. PINEN |= SET_BIT3; // 1 = 低电平/ 下降沿触发中断
  431. PIPEN &= ~SET_BIT3; //0 = 关闭中断(高电平/ 上升沿触发中断)
  432. EIE |= SET_BIT1; //管脚中断,最多8个,中断号7
  433. EA = 1; // 总中断
  434. #endif
  435. }
  436. static u8 rx_data[33];
  437. static u8 channel;
  438. #if 0
  439. void EXTI9_5_IRQHandler()
  440. {
  441. u8 Data;
  442. //判断中断源
  443. if(RESET != EXTI_GetITStatus(EXTI_Line6))
  444. {
  445. //读取nrf24l01的状态寄存器
  446. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&data,1);
  447. if(Data&(1<<4))
  448. {
  449. Nrf24l01SendFailHandler();
  450. printf("达到最大重发数中断\r\n");
  451. }
  452. if(Data&(1<<5))
  453. {
  454. printf("数据发送完成中断\r\n");
  455. Nrf24l01SendSuccessHandler();
  456. }
  457. if(Data&(1<<6))
  458. {
  459. channel = Nrf24l01GetPacketHandler(rx_data);
  460. printf("接收数据中断 接收的数据威:%s 接收通道为%d\r\n",rx_data,channel);
  461. }
  462. }
  463. //清除EXTI中断标志位
  464. EXTI_ClearITPendingBit(EXTI_Line6);
  465. }
  466. #else
  467. //NRF24L01中断处理:当状态寄存器中 TX_DS、 RX_DR 或 MAX_RT 为高时触发中断。
  468. #ifdef N76E003_IAR
  469. #pragma vector=0x3B
  470. __interrupt void NRF24L01_Handler ( void )
  471. #else
  472. void NRF24L01_Handler ( void ) interrupt 7 //interrupt address is 0x001B
  473. #endif
  474. {
  475. u8 Data;
  476. clr_EPI; //关闭管脚中断7
  477. //判断中断源
  478. if(PIF&SET_BIT3)
  479. {
  480. //读取nrf24l01的状态寄存器
  481. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  482. if(Data&(1<<4))
  483. {
  484. Nrf24l01SendFailHandler();
  485. //printf("达到最大重发数中断\r\n");
  486. }
  487. if(Data&(1<<5))
  488. {
  489. Nrf24l01SendSuccessHandler();
  490. //printf("数据发送完成中断\r\n");
  491. }
  492. if(Data&(1<<6))
  493. {
  494. channel = Nrf24l01GetPacketHandler(rx_data);
  495. //printf("接收数据中断 接收的数据威:%s 接收通道为%d\r\n",rx_data,channel);
  496. }
  497. }
  498. PIF = 0x00; //清除全部标志
  499. set_EPI; //开启管脚中断7
  500. }
  501. #endif