OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9888|回复: 7

nrf24l01中断方式接收

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-6-5
在线时间
2 小时
发表于 2016-6-5 22:07:58 | 显示全部楼层 |阅读模式
基本思路:前段时间在毕业设计,用到了nrf24l01(刚开始也为中断接收与发送而烦恼)。(其中需要两个模块(stm32f103c8t6和stc12c5a60s2)与一个主模块(stm32f103zet6)的相互通信)。为了分享一下想法。下面以原子的实验33 无线通信实验为基础修改的。我尽可能的减小修改量。本人没有这个开发板,所以没有实际测试。
贴一部分程序,具体的见附件。
附件说明:
附件1:实验33 无线通信实验(中断接收方式) ——发送时,屏蔽中断。接收时,不屏蔽中断
附件2:附件1:实验33 无线通信实验(中断方式)——中断处理接收与发送两种情况。
//初始化24L01的IO口
void NRF24L01_Init(void)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE);         //使能PB,G端口时钟
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                 //PB12上拉 防止W25X的干扰
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);        //初始化指定IO
        GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉                                
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8;        //PG8 7 推挽           
        GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PG6 输入  
        GPIO_Init(GPIOG, &GPIO_InitStructure);

        GPIO_ResetBits(GPIOG,GPIO_Pin_7|GPIO_Pin_8);//PG7,8下拉        
        //nRF24L01 NVIC配置
        NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
        //将GPIO管脚与外部中断线连接
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource6);
        //nRF24L01 EXIT配置
        EXTI_InitStructure.EXTI_Line=EXTI_Line6;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        EXTI_ClearITPendingBit(EXTI_Line6);
                 
  SPI2_Init();                    //初始化SPI         

        SPI_Cmd(SPI2, DISABLE); // SPI外设不使能

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //SPI主机
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //时钟悬空低
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //数据捕获于第1个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由软件控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;                //定义波特率预分频的值:波特率预分频值为16
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设
                        
        NRF24L01_CE=0;                         //使能24L01
        NRF24L01_CSN=1;                        //SPI片选取消  
                                   
}


中断部分:
//nRF24L01中断服务程序
void EXTI9_5_IRQHandler(void)
{
        u8 istatus;
        //判断是否是线路6引起的中断
        if (EXTI_GetITStatus(EXTI_Line6)!=RESET)
        {
                if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_6)==0)
                        {
                   istatus=NRF24L01_Read_Reg(STATUS);            // 读取状态寄存其来判断数据接收状况
                        nrf_flag=istatus;
                if(istatus&0x40)//bit6:数据接收中断
                        {
                        NRF24L01_Read_Buf(RD_RX_PLOAD,tmp_buf,RX_PLOAD_WIDTH);//读取数据
                        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
                        }
                else if((istatus&0x10)>0)////达到最大发送次数中断
                        {
                        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
                                //NRF24L01_RX_Mode();                        //发送结束,转为接收状态。
                                //(可以在中断中转为接收状态,也可在NRF24L01_TxPacket之后转为接收状态)。如果不处理达到最大发送次数的情况下。中断中转换更好一点。
                        }
                else if((istatus&0x20)>0)//TX发送完成中断
                        {
                        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
                                //NRF24L01_RX_Mode();                        //发送结束,转为接收状态。
                        }
                        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,istatus);//清除状态寄存器
                }
                EXTI_ClearITPendingBit(EXTI_Line6); //清除标志
}
}

实验33 无线通信实验(中断方式).zip

3.82 MB, 下载次数: 4028

实验33 无线通信实验(中断接收方式).zip

3.82 MB, 下载次数: 13761

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
915
金钱
915
注册时间
2012-2-27
在线时间
391 小时
发表于 2016-6-7 18:21:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

465

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2126
金钱
2126
注册时间
2013-1-11
在线时间
501 小时
发表于 2017-3-7 15:37:41 | 显示全部楼层
试了!!谢谢了
知识是你最好的财富
回复 支持 反对

使用道具 举报

9

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-2-14
在线时间
90 小时
发表于 2017-3-22 12:52:31 | 显示全部楼层
感谢,最近正在调试这个部分,中断方面很有用~
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2016-5-31
在线时间
105 小时
发表于 2017-4-20 08:35:06 | 显示全部楼层
谢谢学习
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-9-13
在线时间
15 小时
发表于 2018-6-20 10:08:53 | 显示全部楼层
其实在实用性方面,我建议设置屏蔽nrf24l01模块的发送中断,因为你屏蔽掉stm32的中断,他的标志位一样会存在,打开中断后会引起中断。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-6-20
在线时间
3 小时
发表于 2019-6-20 10:09:44 | 显示全部楼层
vilsen 发表于 2018-6-20 10:08
**** 作者被禁止或删除 内容自动屏蔽 ****

不好意思,你说的打开中断后会引起中断时什么意思呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-6-20
在线时间
0 小时
发表于 2019-6-20 22:01:58 | 显示全部楼层
请问 有msp430的硬件spi驱动nrf24l01+吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 13:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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