野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11343|回复: 3

关于nRF24l01中断接收问题

[复制链接]
发表于 2016-2-3 15:29:48 | 显示全部楼层 |阅读模式
例程没有使用中断接收,稍微改了一下,改成中断后读取数据,但是如果仅加入下降沿中断,在中断里加一个LED反转,其他跟例程一样使用while(NRF_Read_IRQ()!=0);查询到中断后读取;可以发现LED接收到后闪烁。

如果不使用while(NRF_Read_IRQ()!=0);,中断后直接在中断函数中读取,就无法进入中断,这是什么问题造成的呢?
初始化:
  1. void SPI_NRF_Init(void)
  2. {
  3.   SPI_InitTypeDef  SPI_InitStructure;
  4.   GPIO_InitTypeDef GPIO_InitStructure;
  5.         EXTI_InitTypeDef EXTI_InitStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;

  7. /*开启相应IO端口的时钟*/
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
  9.                          |RCC_APB2Periph_GPIOB
  10.                                                                                                  |RCC_APB2Periph_AFIO
  11.                                                                                                  ,ENABLE);

  12.         /*使能SPI1时钟*/
  13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  14.         /*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */
  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  16.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能
  18.   GPIO_Init(GPIOA, &GPIO_InitStructure);  
  19.   /*配置SPI_NRF_SPI的CE引脚,和SPI_NRF_SPI的 CSN 引脚*/
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  21.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  22.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  23.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  24.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  26.         /*配置SPI_NRF_SPI的IRQ引脚*/
  27.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  28.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  29.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入
  30.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  31.         /*中断配置*/
  32.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  33.   /* 配置中断源 */
  34.   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  35.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  36.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
  37.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  38.   NVIC_Init(&NVIC_InitStructure);
  39.        
  40.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  41.   EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  42.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  43.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //下降沿中断
  44.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  45.   EXTI_Init(&EXTI_InitStructure);

  46.         EXTI_ClearITPendingBit(EXTI_Line0);
  47.   /* 拉高csn引脚,NRF进入空闲状态 */
  48.   NRF_CSN_HIGH();
  49.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        //双线全双工
  50.   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                                                                //主模式
  51.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                                //数据大小8位
  52.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                                                                                        //时钟极性,空闲时为低
  53.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                                //第1个边沿有效,上升沿为采样时刻
  54.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                                //NSS信号由软件产生
  55.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  //4分频,6MHz
  56.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                                        //高位在前
  57.   SPI_InitStructure.SPI_CRCPolynomial = 7;
  58.   SPI_Init(SPI1, &SPI_InitStructure);
  59.   SPI_Cmd(SPI1, ENABLE);
  60. }
复制代码
接收:
  1. u8 NRF_Rx_Dat(u8 *rxbuf)
  2. {
  3.         u8 state;
  4.         u8 err;

  5.         state=SPI_NRF_ReadReg(STATUS);
  6.         if(state&RX_DR)
  7.         {
  8.                 NRF_CE_LOW();
  9.                 SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);
  10.                 SPI_NRF_WriteReg(FLUSH_RX,NOP);
  11.                 err=RX_DR;
  12.         }
  13.         else
  14.                 err= ERROR;
  15.         SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);
  16.        
  17.         return err;
  18. }
复制代码
中断:
  1. void EXTI0_IRQHandler(void)
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //确保是否产生了EXTI Line中断
  4.         {
  5.                 NRF_Rx_Dat(RX_BUF);
  6.                 PBout(2)=!PBout(2);
  7.                 EXTI_ClearITPendingBit(EXTI_Line0);     //清除中断标志位
  8.         }  
  9. }
复制代码


回复

使用道具 举报

发表于 2016-2-3 17:43:55 | 显示全部楼层
帮顶                  
回复 支持 反对

使用道具 举报

发表于 2016-5-7 15:11:31 | 显示全部楼层
IRQ这个引脚初始化NRF24L01时,对应的寄存器要设置的
回复 支持 反对

使用道具 举报

发表于 2016-5-8 16:20:38 | 显示全部楼层
RFINCHINA 发表于 2016-5-7 15:11
IRQ这个引脚初始化NRF24L01时,对应的寄存器要设置的

怎么设置???????????
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 02:50 , Processed in 0.044855 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表