关于NRF24L01通信的问题

作者&投稿:虿将 (若有异议请与网页底部的电邮联系)
关于NRF24l01通讯距离的问题?~

带PA的无线模块较普通模块发射概率大很多,可以获得更远的通讯距离与稳定性。

因室内环境通常较复杂,应用时建议进行实际测试。
如对通讯稳定性要求较高,或预算充足的话,推荐直接使用带PA的无线模块。
否则可以先使用普通模块进行通讯测试,如不能满足使用要求时再更换PA模块。

入门级交换机

入门级交换机的应用主要集中于8到16个端口的小型工作组,它适合低价格、很少需要扩展和管理的场合。它们往往被用来代替集线器,可以提供比集线器更高的带宽和提供更可靠的连接。人们一般不会单独购买入门级交换机,而是经常和其他级别交换机一起购买,以组成一个完整的存储解决方案。入门级交换机提供有限级别的端口级联能力。如果用户单独使用这类低端设备时,可能会遇到一些可管理性问题。

工作组级光纤交换机

光纤交换机提供将许多交换机级联成一个大规模的Fabric的能力。通过连接两台交换机的一个或多个端口,连接到交换机上的所有端口都可以看到网络的唯一的映像,在这个Fabric上的任何节点都可以和其他节点进行通信。

从本质上讲,通过级联交换机,能够建立一个大型的、虚拟的、具有分布式优点的交换机,并且它可以跨越的距离非常大。由多个交换机建立起来的Fabric,看起来就像是一个由单独的交换机组成的Fabric,所有交换机上的端口可以像访问本地交换机一样查看和访问Fabric上的所有其他端口。统一的名字服务器和管理服务允许通过单独的接口查看和修改全部Fabric的信息。

创建分布式Fabric的一个重要因素,是获得交换机之间连接的带宽。任何两个端口之间的有效速率受到交换机之间连接的有效带宽的影响,可能需要使用多条交换机之间的连接来维护必要的带宽。工作组光纤通道交换机数量众多并且更加通用。

用户可以将工作组交换机用于多种途径,但应用的最多的领域是小型SAN。这类交换机可以通过交换机间的互联线路连接在一起提供更多的端口数量。交换机间的互联线路可以在光纤通道交换机上的任意端口上创建。不过,如果计划使用多家厂商的产品的话,一定要确保设备可互操作。

核心级光纤交换机

核心级交换机(又叫导向器)一般位于大型SAN的中心,使若干边缘交换机相互连接,形成一个具有上百个端口的SAN网络。核心交换机也可以用作单独的交换机或者边缘交换机,但是它增强的功能和内部结构使它在核心存储环境下工作的更好。核心交换机的其他功能还包括:支持光纤以外的协议(像InfiniBand)、支持2Gbps光纤通道、高级光纤服务(例如:安全性、中继线和帧过滤等)。



核心级光纤交换机通常提供很多端口,从64口到128个端口到更多。它使用非常宽的内部连接,以最大的带宽路由数据帧。使用这些交换机的目的是为了建立覆盖范围更大的网络和提供更大的带宽,它们被设计成为在多端口间以尽可能快的速度用最短的延迟路由帧信号。

另外,核心光纤交换机往往采用基于“刀片式”的热插拔电路板:只要在机柜内插入交换机插板就可以添加需要的新功能,也可以作在线检修,还可以做到在线的分阶段按需扩展。许多核心级交换机不支持仲裁环或者其他的直连环路设备,它们只关心核心交换的能力。

由于在整个环境里面可用性是最重要的,人们都愿意花更多的钱购买冗余性,高冗余交换机的所有部件都是冗余的,完全去除了单点故障,而且保证了非常长久的正常运行时间。这些在冗余上支出的费用一般花费在高可用性背板、电源、冗余电路和维护可用性的软件上。这种类型的交换机内置很多逻辑电路,用来处理交换机内部的硬件故障。

除了冗余之外,核心级光纤交换机支持不中断服务式的软件升级,这样就消除了升级时对系统维护的需要。交替通路是网络上的一种冗余级别,它可以配置一个有弹性的双重Fabric,这种网络完全排除了单点故障,可以避免由于软件或硬件错误、火灾、自然灾害或者操作错误给网络带来的严重后果。

核心级交换机提供最高的可靠性和端口密度。在拥有大量光纤通道基础设施的数据中心中,这类产品就是几乎刀枪不入的、集中式的存储交换机。所以,对于大多数的高可用性网络,则应该选择由核心光纤交换机构建的双通道网络。

你这样说没有说明白,我这里附一份调试过的代码,用ST的stm32芯片实现,上面的说明应该是很清楚了,你照猫画虎基本上能成功的,试试吧。

额,好吧,后面的内容超出字数要求了,加不上去,你可以用其他方法问我要剩余的代码,而且这里有部分注释因为字数的原因也被删除了。

--------------------------------------------------------
**文 件 名: nrf24l01.c
**创 建 人: pylon_zlq
**版 本 : v0.1
**最后修改日期: 2011年10月29日
**描 述: 1. 2.4G无线模块驱动程序
** 2. 24L01的指令分类规律读写寄存器为一大类,其他操作为一大类,如下:
** a. 读写寄存器是高三位来区分, 0b000X XXXX (read), 0b001X XXXX(write),其中 X XXXX(低5位)是
** 寄存器地址
** b. 读接收缓存指令: 0x61(用高三位来区别其他指令, 0b011)
** c. 写发送缓存指令: 0xA0(同上)
** d. 清TX FIFO: 0xE1(同上)
** e. 清RX FIFO: 0xE2(同上)
** f. 重使用上包数据: 0xE3(同上)
** g. NOP,空操作: 0xFF(同上)
** 3. 由于收发FIFO最多有32字节,因此本模块仅使用32字节长度的数据收发
** 4. 由于通讯地址最多有5字节,因此本模块仅使用5字节的通道地址(收发方一致)
** 5. 从实际使用情况来看,读写接口分为这么几种:读写单字节的寄存器,读写多字节的通讯地址(也是寄存器的一种),
** 读写通讯缓存,总共6类读写接口

#include "includes.h"

#define NRF24L01_CE_0() {GPIO_SetBit_0(GPIOA, E_PIN_3);}
#define NRF24L01_CE_1() {GPIO_SetBit_1(GPIOA, E_PIN_3);}

#define NRF24L01_SCK_0() {GPIO_SetBit_0(GPIOA, E_PIN_5);}
#define NRF24L01_SCK_1() {GPIO_SetBit_1(GPIOA, E_PIN_5);}

#define NRF24L01_MOSI_0() {GPIO_SetBit_0(GPIOA, E_PIN_7);}
#define NRF24L01_MOSI_1() {GPIO_SetBit_1(GPIOA, E_PIN_7);}

#define NRF24L01_CS_0() {GPIO_SetBit_0(GPIOB, E_PIN_4);}
#define NRF24L01_CS_1() {GPIO_SetBit_1(GPIOB, E_PIN_4);}

#define NRF24L01_MISO_STT() (GPIO_GetLevel(GPIOA, E_PIN_6))

#define NRF24_RX_TX_LEN 32 //本模块仅使用32字节长度的通讯
#define NRF24_ADDR_LEN 5 //本模块仅使用5字节长度的通讯地址(收发方一致)

#define NFR24_RX_CH_1 0 //RX 1通道
#define NFR24_RX_CH_2 1 //RX 2通道
#define NFR24_RX_CH_3 2 //RX 3通道
#define NFR24_RX_CH_4 3 //RX 4通道
#define NFR24_RX_CH_5 4 //RX 5通道
#define NFR24_RX_CH_6 5 //RX 6通道
#define NFR24_TX_CH 6 //TX 通道

//NRF24L01寄存器操作命令
#define NRF24_READ_REG_CMD 0x00 //读配置寄存器,低5位为寄存器地址
#define NRF24_WRITE_REG_CMD 0x20 //写配置寄存器,低5位为寄存器地址
#define NRF24_RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节
#define NRF24_WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节
#define NRF24_FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define NRF24_FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define NRF24_REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.
#define NRF24_NOP 0xFF //空操作,可以用来读状态寄存器
//SPI(NRF24L01)寄存器地址
#define NRF24_CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define NRF24_EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5
#define NRF24_EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5
#define NRF24_SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
#define NRF24_SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define NRF24_RF_CH 0x05 //RF通道,bit6:0,工作通道频率;
#define NRF24_RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define NRF24_STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
//bit5:数据发送完成中断;bit6:接收数据中断;
#define NRF24_MAX_TX 0x10 //达到最大发送次数中断
#define NRF24_TX_OK 0x20 //TX发送完成中断
#define NRF24_RX_OK 0x40 //接收到数据中断

#define NRF24_OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define NRF24_CD 0x09 //载波检测寄存器,bit0,载波检测;
#define NRF24_RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前
#define NRF24_RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前
#define NRF24_RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24_RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24_RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24_RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24_TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define NRF24_RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define NRF24_RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define NRF24_RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define NRF24_RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define NRF24_RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define NRF24_RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define NRF24_FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;

static const uchar gCuc_TXAddr[NRF24_ADDR_LEN]={0x34,0x43,0x10,0x10,0x01}; //发送地址
static const uchar gCuc_RXAddr[NRF24_ADDR_LEN]={0x34,0x43,0x10,0x10,0x01}; //发送地址

uchar guc_TXRX_Stt;

/*********************************************************************************************************
**函数名称: void NRF24L01Initial(void)
**输入: none
**输出: none
**说明: PA3---WIRELESS_CE, PA5---SCK, PA6---MISO, PB4---WIRELESS_CS, PA7---MOSI, PA2---WIRELESS_INT
**/
void NRF24L01Initial(void)
{
//1.配置io口线时钟
RCC_APB2ENR |= IOPAEN+IOPBEN; //port a, port b,
RCC_APB2RSTR &= ~(IOPAEN+IOPBEN); //port a, port b,

//2.配置io口,SCK,MOSI,MISO三根线交由spi外设自动控制,其初始化也交由spi驱动程序完成
//WIRELESS_CE, output
SetOutput(GPIOA, E_PIN_3, E_OUT_PP, E_OUT_SPD_50M);
//WIRELESS_INT, pull up input
SetInput(GPIOA, E_PIN_2, INPUT_TYPE_FLOAT, E_IN_PULL_UP);
//WIRELESS_CS, push-pull output
SetOutput(GPIOB, E_PIN_4, E_OUT_PP, E_OUT_SPD_50M);

//这个是防止flash片在cs变低可能造成的MISO线电平冲突的问题
SetOutput(GPIOB, E_PIN_6, E_OUT_PP, E_OUT_SPD_50M);
GPIO_SetBit_1(GPIOB, E_PIN_6);

//3. enable rnf24l01, unselect rnf24l01
NRF24L01_CE_0();
NRF24L01_CS_1();

guc_TXRX_Stt = 0;
}

我也遇到你一样的问题,请问大佬你解决了吗


nrf24l01和nrf24l01+区别是啥?
nRF24L01:功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。 nrf24l01++(nRF24L01P):极低的电流消耗,当工作在发射模式下发射功率为0dBm时电流消耗为11.3mA,接收模式时为13.5mA,掉电模式和...

无线发射模块NRF24L01的寄存器问题
哥们,,我这个问题解决了,在status=SPI_Read(0x07);这句之前加上 SPI_RW_Reg(WRITE_REG+STATUS,0XFF); \/\/清状态寄存器 有这个句子就能好好显示了,前清除寄存器就好了,我也不知道为什么,不过经过我的实验,我加上之后就对了,你试试吧,希望对你有用 ...

nRF24L01接收地址怎么修改?
我用接收通道0,地址我随便改的5个数据,一样能照常接收,只要发送和接收地址匹配就行。原理图 电路原理 nRF24L01原理图 引脚定义 nRF24L01引脚定义 接线图 nRF24L01与5V单片机的连接(只适用于高阻口)兼容性 nRF24L01 可以兼容nRF2401A、nRF24L01+、nRF24LE1、nRF24LU1等无线模块。nRF24L01+ nRF24L01+(或称...

关于NRF24L01的天线接口,如何接的问题?
专业解答:1:X宝买一个2.4G定向天线,然后把天线馈线端外皮去掉,露出内芯,把内芯接在24L01的天线输出脚,外皮焊在天线输出脚旁边的地即可。2:电感 的计算,参照24L01的数据手册里面demo即可。

nrf24l01进行六发一收,现在0通道和1通道调通了,但是2~5通道接收模块收...
nRF24L01无线模块实现6个通道接收数据有几点需要注意:(1)EN_AA和EN_RXADDR寄存器的设置,要让所有通道接收数据允许和自动应答,都设置为0x3f;(2)RX_PW_PX(X表示第几通道)寄存器,设置接收数据的数据长度,最大是32字节,默认好像是0;(3)写接收通道地址,P0和P1通道是40位的地址,但是P2到...

求基于51单片机无线模块nrf24l01程序
刚好正在研究,网上找的,稍改了一下,2015.8.17晚试验 接收方应该没问题,但发送方上电一次只能发2 个数据,想再发,单片机复位也不行 必须重新给NRF24L01上电 有的网友则只能发一次 单片机用STC12C5A32S2,但硬件SPI不成功,用的是普通IO模拟SPI include <reg52.h> \/\/#include "STC12C5A.H...

nrf24l01接收如何使用
写 SSPBUF 等同于同时写SSPBUF和SSPSR。寄存器 10-3: SSPSTAT:MSSP 状态(I2C 模式)寄存器(地址为 94h) R\/W-0 R\/W-0 R-0 R-0 R-0 R-0 R-0 R-0SMP CKE D\/A PSR\/W UA BFbit 7 bit 0bit 7 SMP: 转换率控制位主、从模式下: 1 = 关闭转换率控制,标准速度方式(100 kHz 和 1 MHz)0 ...

关于NRF24L01通信的问题
#define NRF24L01_CE_0() {GPIO_SetBit_0(GPIOA, E_PIN_3);}#define NRF24L01_CE_1() {GPIO_SetBit_1(GPIOA, E_PIN_3);}#define NRF24L01_SCK_0() {GPIO_SetBit_0(GPIOA, E_PIN_5);}#define NRF24L01_SCK_1() {GPIO_SetBit_1(GPIOA, E_PIN_5);}...

nrf24l01传输距离好短,怎么回事?求解答
推荐于2017-12-15 14:53:21 最佳答案 NRF24L01本来就是无线传输模块中性能最差的,他没有附加的天线可以获得增益,你的2米很正常,因为你在室内,受到环境影响,传输距离会缩短。如果你要更远一些,可以考虑NRF905,CC1100,或者其它的更大功率的无线数传模块,距离可以很快提升。也可以考虑功能更强的zigbee模块,不过它...

nrf24l01用c8051f020单片机驱动系统时钟不能大于2M
但对C8051而言,2M的晶振其一个机器周期可能就是1us了(C8051详细的参数我记不清了,就说个意思吧),这样如果你使用的是4M,相当于STC外接24M晶振。整体速度提升了,对NRF24L01访问采用的是SPI,那么时序上是否仍符合接口要求?换句话说软件中的相关延时是否就不够了?由于我对C8051FXX不甚了解,有些...

同安区18544966059: 求教nrf24l01无线模块双向通信问题 -
党聂普润: NRF24L01本来就是半双工的吧,你要切换收发的话,可能要延时一段时间再作处理.比如延时500ms,可能这样切换,就会更稳定一些.具体还得实际测试,不断调试方可定夺.

同安区18544966059: nrf24l01双向通讯问题 -
党聂普润: 设置标志位,来回切换,不过有个问题,运行几秒钟后就会卡住,重启任意一方的单片机,恢复正常,又是需要重启master恢复,有时重启slave恢复.将一方设置为单一发送,一方设置为单一就收,结果不卡.说明卡住的原因是在某一时刻双方都切换到接收,或都切换为发射.但是怎么分析,都觉得不会碰撞.

同安区18544966059: NRF24L01的传输速率问题 -
党聂普润: 这种无线模块,误码率比较高,丢包不可避免.所以数据传输可以自己定个协议,一般要有帧头帧尾和校验,比如MODBUS,判断出数据有误,请求重发.另外,也可以用具有纠错能力的编码方式,比如RS编码,二维码识别貌似就是用到这方法.

同安区18544966059: nrf24l01调试时其他信号正常唯独SCK信号杂乱 -
党聂普润: ...这种情况我也遇到过,要不然就是什么信号都没有,或者就是时钟信号时有时没有,这个不关24L01的事,是你对单片机配置的问题,像配置IO口的输入输出方向,设置它相对的引脚,还有单片机上的时钟等,还记得要进行喂狗(),等你将这些配置好以后就可以啦,通过SPI传数据到24L01的时候看你自己是要用硬件SPI实现还是软件SPI实现啦,这些你要通过查阅你自己的MCU的芯片手册来对相应的寄存器进行配置,希望可以给你点提示吧. 哈

同安区18544966059: NRF24L01无线模块怎么在STM32和PC之间通讯 -
党聂普润: PC串口+RF,作为节点1 STM32+RF,作为节点2这样PC上做个软件或者串口工具就可以和STM32无线通信了,我们做过这样的产品.

同安区18544966059: nrf24l01无线模块可以在不同类型单片机之间通信么? -
党聂普润: 24L01无线模块与主机之间采用SPI接口的数据交换方式,与单片机类型无关,只要支持SPI接口或能够IO模拟出SPI通信的都能够控制模块工作的.而且该模块是双工通信,可以同时对发数据,采用两个模块,430发,51接,中间信道是2.4GHz频段.

同安区18544966059: nrf24l01 如何实现按多对一通信,与stc单片机接口是任意的吗?求高手解答 -
党聂普润: nrf24l01 通过SPI与STC单片机 连接,可以用硬件SPI控制器也可以用IO口模拟SPI时序操作. 1侦听多发送模式,侦听端设置好通道,地址码,校验,速率等;发送端按照侦听端同样的参数设置即可;传输协议中应标识不同的发送端ID,以作区别.

同安区18544966059: 2个单片机之间用NRF24L01通信怎么弄 -
党聂普润: 如果用串口通信,好像24l01是SPI通信方式,这样一来就要单片机有SPI功能或者需要模拟SPI模式,了解SPI后就勉强可以试着用了

同安区18544966059: NRF24L01可以与PC通讯吗? -
党聂普润: 通过串口当然是可以的.首先主模块单片机中断接收来自PC串口调试助手的数据,通过NRF发送出去,从模块NRF接收到数据后,通过串口输出即可.不清楚你所想的通讯模式,但这样是可行的.

同安区18544966059: NRF24L01能实现多对多通信吗? -
党聂普润: nRF24L01(+)是可以支持多对多通讯的.当一组使用nRF24L01的设备中任意2两个需要进行通讯时,只需要确保他们之间使用相同的工作频率、数据速率、地址(发射端的发射地址与接收端的接收地址必须一致)、数据包长度(或同时使用可变长度数据包)、CRC校验方式等参数一致时即可完成通讯.当需要对设备进行编号识别时,则需要在发送数据包中的特定位置添加设备识别或编号信息,接收端在接收到数据后对特定位置的信息进行识别即可.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网