完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
NRF24L01+的模块所有问题在这个帖子讨论吧。我为你们解答。
毕竟玩了有段时间了。 我重新修改了 C 文件和 H 文件,你们下载后,稍微移植下,就可以用了。不会有什么大的问题。 //这次加入了半双工模式 //24L01操作线 #define NRF24L01_GND 0 //24L01电源0v #define NRF24L01_VCC 3.3 //24L01电源3.3v #define NRF24L01_CE CE //24L01天线使能(高电平有效) #define NRF24L01_CSN CSN //spi传输使能(低电平有效) #define NRF24L01_SCK SCK //spi时钟(上升沿有效) #define NRF24L01_MOSI MOSI//spi输入脚(上位机MO输出,下位机SI输入) #define NRF24L01_MISO MISO//spi输出脚(上位机MI输入,下位机SO输出) #define NRF24L01_IRQ IRQ //中断脚输出(拉低电平) ////////////////////////////////////////////////////////////////////////////////// // 写一个字节,同时读出一个字节 u8 SPI_ReadWriteByte(u8 byte)//[D7:D0][D15:D8] { u8 i,data;//循环8次 // SCK=0;//时钟准备 // CSN=0;//使能spi传输 data=byte;//数据准备 for(i=0;i<8;i++)// output 8-bit { if(data & 0x80)MOSI = 1;// 输出高位逻辑值 else MOSI = 0; delay_us(1);//nrf24l01要>40ns; data = (data<<1); // 丢弃高位,低位补0 SCK = 1; // SCK 上升沿有效 delay_us(1); if((MISO&0x01)==0x01)data|=0x01; SCK = 0; // ..then set SCK low again } return(data); // 输出读取的8位 } //////////////////////////////////////////////////////////////////////#include "STM32f4xx.h" #include "stm32f4xx_conf.h" #include "delay.h" #include "spi.h" #include "nrf24l01plus.h"//nrf24L01+无线模块 void HardFault_Handler() { }//硬件故障 int main(void) { static u8 rxbuf[32]={0};//接收包 static u8 txbuf[32]={0};//发送包 static u8 P,i=0x0f;//P通道地址 static u8 temp;//0x07寄存器的值 // SystemInit();//时钟初始化 delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 //////////////////////////////////////////////////////////// //A.tx-B.p1 B.tx-A.p1 NRF24L01_bilateral_A_Init();//初始化NRF24L01为上位机A, // NRF24L01_bilateral_B_Init();//初始化NRF24L01 为下位机B ////////////////////////////////////////////////// for(i=0;i<32;i++) txbuf=0x41+i; //字母A开始//写数据包 i=0; while(1)//循环发送 { ///////////////////////// //写数据包 txbuf[0]=0x41+(i++);//写数据包//A.B.C.D.... if(txbuf[0]>0x41+26-1){txbuf[0]=0x41;i=0;}//Z->A // txbuf[0]=0x00;//没有数据要发送 //////////////////////////// //数据 发送成功一次就跳出一次 while(1)//发送成功一次跳出 { temp=NRF24L01_bilateral_Pack(rxbuf,txbuf);//接收包优先,后TX数据包 if(temp&1<<6 )//收到数据 { P=temp>>1; P=P&0x07;//取出接收通道的编号; switch(P)//通道 { case 0: break;//通道P0 case 1: break;//通道P1 case 2: break;//通道P2 case 3: break;//通道P3 case 4: break;//通道P4 case 5: break;//通道P5 default: break;//无效 } } if(temp&1<<5)break;//发送成功才跳出; } } } temp.zip (2.66 MB ) 51的2401双通讯.zip (132.73 KB ) |
|
相关推荐
26个回答
|
|
有需要帮助的留言。注意看下函数
NRF24L01_bilateral_A_Init();//初始化NRF24L01为上位机A, // NRF24L01_bilateral_B_Init();//初始化NRF24L01 为下位机B 写数据包函数是 j=NRF24L01_bilateral_Pack(rxbuf,txbuf);//接收包优先,后TX数据包 |
|
|
|
|
|
|
|
刚刚完成nrf24l01的焊接。
请教一下, 这个芯片是否具备查询当前空中所有在线设备的功能? 这个芯片能够进行空中的全双工通讯(类似于全双工也可以)? 这个芯片是通过什么样的机制找到目标并建立通讯的呢,通道?频率?还是其他东西? |
|
|
|
1无法准确查询所有设备,但可以扫描所有频率范围。通过载波检测大概知道当前有多少个设备。
2不能全双工,但可以半双工。A和B可以A发B收也可以B发A收 3通讯默认是使用前设置好帧的。地址频率速度等设置一样才可通讯。 |
|
|
|
感谢回复,你的简单陈述给我了极其重要的一些信息。
那么请允许我继续问。 两个nRF24L01+必须要频率设置相同才可以通讯。(应该是这样吧) 那么同一个频率有三个设备会怎么样,芯片有相关的自动仲裁吗? 据说它的通讯在每个频点上还有若干个通道,这若干的通道可以相互独立使用吗,可以同时使用吗? 它的空中通讯是广播式的还是点对点通讯的?(它支持单播、多播、广播中的哪几种?) |
|
|
|
影响的条件有1频率(2400~2525MHz)2速度(250kps,1M,2M)3地址4应答方式5地址长度(这个在协议帧里,还可以修改其他)6CRC校验方式7距离。有1个不同会导致接收不到。所以有重复干扰情况几乎不存在。就拿第7条距离来讲,一般45米,带PA的1000米,在1000米内别人的模块还必须知道你的地址,40个bit你看看有多少种可能性?0x0000000000到0xFFFFFFFFFF这得多少个模块啊!还有CRC。2字节。再说发送模式下,发送一个帧时间可能500us吧,其他时间都是静止的。可以忽略同模块干扰问题。比如别人想分析你的数据也非常困难,最多能找到你使用的频率,除非使用nordic的u***加密狗来分析。如果你传输的数据加密的话,可以说没发分析。真要这么简单,明天就把美国的卫星遥下来。
|
|
|
|
当然,如果你想把模块组成比较奇葩的配置也是可以的。1发送2接收转发给3或者1发送n多个模块接收。还可以1模块发送,2模块接收再修改内容,添加或减少数据,再转发给模块3.总之只有你想不到,没有做不到的。甚至玩跳频。模块的通讯是双向的,既可以接收也可以发送。只是同一时间只能选一种模式。你可以错开时间来实现双向通讯,要不等我改下函数,等我写好了再上传给你们。
|
|
|
|
//////////////////////////////////////////////////////////
//中断中函数 u8 NRF24L01_bilateral_Pack(u8 *rxbuf,u8 *txbuf)//双向一个包的数据 { u8 temp=0;//状态值 // u8 look; //////////////////////////////////////////////////////////////// //状态;;;;;;;;;;;;;;;;;;;;;;;;;;;;; temp=NRF24L01_Read_Reg(STATUS); //0x52, 0x42,0x02 ////////////////////////////////// //RX数据优先 if((temp&0x0e)!= 0x0e)//接收到数据 { // NRF24L01_Write_Reg(STATUS,temp); //清除中断 0x07应该0x0e NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//0x61 读取数据 return temp; //接收完成 } /////////////////////////////////////// //TX模式//第一次发送3时接收机显示1(缓存了3组内容)或者发“A”发3次后,接收机显示A if(*txbuf!=0x00)//数据非空 { NRF24L01_Write_Reg(STATUS,temp); //清除中断 // 0x00寄存器配置参数 NRF24L01_Write_Reg(CONFIG, 0<<6 | //IRQ中断脚使用 0开,1关 0<<5 | //发送完成中断 0开,1关 0<<4 | //重发超限中断 0开,1关 1<<3 | //CRC开关 0关,1开 1<<2 | //CRC字节 0八,1十六 1<<1 | //上电模式 0关,1开 0<<0 ); //广播模式 0发送 1接收 NRF24L01_CE=0; //关闭24L01天线 NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//0xa0写数据到TX BUF max32个字节 NRF24L01_CE=1;//启动发送 /////////////////////////////// //等中断 while((NRF24L01_IRQ&0x01)!=0);//等待中断脚输出 temp=NRF24L01_Read_Reg(STATUS); //0x02下TX后 0x22 NRF24L01_Write_Reg(STATUS,temp); //清除TX_DS或MAX_RT中断标志 if(temp&1<<6)//发送过程中收到数据 { NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//0x61 读取数据 return temp;//接收优先 } ////////////////////////////// if(temp&1<<4)//达到最大重发次数(发送失败0x1e) { //清除缓存 NRF24L01_Write_Reg(FLUSH_TX,0xff);//0xE1 清除TX FIFO寄存器 } /////////////////////////////////////// //RX模式 //0x00寄存器配置参数 NRF24L01_Write_Reg(CONFIG, 0<<6 | //IRQ中断脚使用 0开,1关 0<<5 | //发送完成中断 0开,1关 0<<4 | //重发超限中断 0开,1关 1<<3 | //CRC开关 0关,1开 1<<2 | //CRC字节 0八,1十六 1<<1 | //上电模式 0关,1开 1<<0 ); //广播模式 0发送 1接收 //////////////////// //准备接收 delay_us(250);//越小反而不好。 return temp;//0x07寄存器值 } } |
|
|
|
垃圾,一直重复上传图片不了
|
|
|
|
垃圾,一直重复上传图片不了
|
|
|
|
有没有F407的资料
|
|
|
|
谢谢分享!!!!
|
|
|
|
大佬 ,有没有STMS003F3P6的相关例程 。。搞不通啊
|
|
|
|
谢谢分享
|
|
|
|
谢谢分享!!
|
|
|
|
请问传输大量数据时,如何通过接收端将数据保存到数组。为什么我保存的时候不能将接收的数据赋值给自定义的数组。
|
|
|
|
仿真看过没?手动赋值看看,如果没问题看看是不是中断的原因,收到数据取出给数组,可能还没取完又中断了。
|
|
|
|
没有用中断吧
|
|
|
|
全是0x00吗?还是乱码?
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2543 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2328 浏览 5 评论
3148 浏览 3 评论
2799 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2759 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
603浏览 1评论
852浏览 0评论
963浏览 0评论
618浏览 0评论
444浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 19:30 , Processed in 1.371704 second(s), Total 113, Slave 97 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号