1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基本思路:前段时间在毕业设计,用到了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 ) 实验33 无线通信实验(中断接收方式).zip (3.82 MB ) |
|
相关推荐
5个回答
|
|
好东西
|
|
|
|
试了!!谢谢了
|
|
|
|
感谢,最近正在调试这个部分,中断方面很有用~
|
|
|
|
谢谢学习
|
|
|
|
其实在实用性方面,我建议设置屏蔽nrf24l01模块的发送中断,因为你屏蔽掉stm32的中断,他的标志位一样会存在,打开中断后会引起中断。
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2569 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2365 浏览 5 评论
3210 浏览 3 评论
2837 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2789 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
668浏览 1评论
905浏览 0评论
1026浏览 0评论
671浏览 0评论
499浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 07:58 , Processed in 1.213034 second(s), Total 83, Slave 67 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号