×
单片机 > 单片机程序设计 > 详情

stm32之nRF24L01无线模块(2):无线模块的地址

发布时间:2020-06-01 发布时间:
|

    可能刚开始接触nRF24L01的童鞋都会注意到例程函数中有两个定义的地址

const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址

const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; 

    这个非常让人疑惑,为什么地址还是数组,而且网上一搜,几乎所有的例程地址都是这一个,为什么呢,换一个不行吗?下面我们从数据手册和实验两个方面来分析,这里注意下,由于Enhanced ShockBurst 模式采用了自动应答的模式,从而简化了硬件方面程序的编写,几乎所有的例程均是基于这个模式,因此之后的nRF24L01也基于这种模式分析。

    首先看数据手册,这个“地址”确确实实是“address”翻译过来的没有问题,手册中给出了地址的解释和具体的例子,再贴段英语,Each pipe can have up to a 5 byte configurable address. Data pipe 0 has a unique 5 byte address. Data pipes 1-5 share the four most significant address bytes. The LSByte must be unique for all six pipes.什么意思呢,就是有6个通道(这个通道下一篇文章会讲),通道0的地址可以5个8位数,通道1-5,虽然可以设置5个八位数,但是前四个必须是一致的。


    数据手册中的说明呢,起码说明了这个地址是可以改的,而且随便改,网上为什么如此一致估计全是复制粘贴的,但这个地址并不是我们硬件的地址能说明通道在哪个位置,而是这个东西就像个协议一样,我发送,你接收,大家一样能识别就行。

    那么识别的机制是什么样的呢,拿板子做个试验就知道了(我这里用的还是stm32f103),大家看了无线模块的例程应该很容易看到NRF24L01_TxPacket()和NRF24L01_RxPacket()这两个函数才是无线模块真正的接收和发送数据的函数,这两个函数中均进行了状态寄存器(看数据手册是0x07)的读取,从而判断数据是否能够发送和接收,我们在编程序的时候可以做个可视化啊,比如用个LCD1602啥的,如果返回发送接收成功就显示数据,不成功就返回fail,显示出来看着更方便一些。

    这里不得不提这个发送模式TX_Mode中的这两行

NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);

NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

    以及接收模式RX_Mode中的这行

NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

    接收模式中这个函数是向指定的寄存器中写入地址,当与发送来的地址一致时会接收成功,而发送模式为什么要有两个地址写入呢,这就与Enhanced ShockBurst这个模式有关,仔细看数据手册,这个模式会自动发送应答信号,而应答信号要接收成功才算发送成功,所以发送模式必须写发送的地址,也同时必须写接收端发送应答信号的接收地址,由于自动应答默认发送的地址是接收端写入的地址,因此发送端写入的接收应答信号的地址必须一致,发送端才会认为发送成功。

    ①我们先把发送端的TX_ADDRESS和RX_ADDRESS改成不一样,接收端的地址与发送端的TX_ADDRESS一致,发现发送不成功,但是接收成功了,这就说明发送成功判断依据是那个自动应答,而现在自动应答不匹配了,于是发送端认为发送失败,但是接收端确确实实接收到了数据,因此接收成功。

    ②当我们将接收端使能多个接收通道的时候,又发现了一个神奇?的现象,就是接收端的状态寄存器读出的通道与发送端使用了哪个寄存器完全没有关系,只要接收成功,它认为的通道就是那个寄存器默认的通道,比如我们使用RX_ADDR_P0接收成功,就显示通道0,而换成RX_ADDR_P1就会显示通道1,与发送端的TX_ADDR是没有关系的。

    这两个现象合理解释了nRF24L01的在Enhanced ShockBurst模式下的收发机制,明白了这个,就能清晰地使用多通道操作了。

    可能有的童鞋还是好奇,这个配置寄存器中有频点的设置啊,那这些个通道是不是一个频率的,答案是肯定的,为什么呢,下回分解,哈哈哈~



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析