关于nRF24L01地址问题
Posted Sunnix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于nRF24L01地址问题相关的知识,希望对你有一定的参考价值。
这几天在做nRF24L01无线通信,刚开始,地址问题很是让我迷惑,按说依照IP地址的惯性思维,IP数据报有一个目的地址,一个本机地址。但是nRF4L01网上找的历程中,目的地址和本机地址设置的却是一样的。
uchar TX_ADDRESS[TX_ADR_WIDTH] = 0x34,0x43,0x10,0x10,0x01;
uchar RX_ADDRESS[RX_ADR_WIDTH] = 0x34,0x43,0x10,0x10,0x01;
这个就很奇怪了,而且接受方设置的地址也是这样,百思不得其解,最后发现原来是自动应答在作怪。
如果设置了自动应答模式,发送方发送完一包数据后,就把自己设置为接受模式(无需手动设置),等待接受方的应带信号,这个和TCP/IP通信是类似的,很好理解。但nRF24L01中,一个数据报中貌似只包含目的地址,却不包含本机地址(源地址)。所以接受方收到数据报以后,理论上是找不到应答方,也就是说不知道给谁应答,但是nRF24L01取出数据报中的目的地址,作为应答地址,发送应答信号。这个目的地址,是发送方的目的地址,同时也是接受方自己的本机地址。这时候就需要发送方在发送数据的时候显式或者说临时的把自己的本机地址设置为和目的地址一样,这样就可以收到接收方发回来的应答信号。所以在发送程序中就有这样的代码
SPI_Write_Buf(RF_WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //
SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
发现没有,两次调用的都是TX_ADDRESS,这样就临时把自己的本机地址设置为和目的地址相同的地址,这样就能够接收到接收方发回来的应答信号。
在接收方设置接受模式的时候,也要设置接受地址,也就是本机地址
SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
相对于刚刚的临时,现在才是真正的设置本机地址,调用的是RX_ADDRESS。那么在定义本机地址和目的地址的时候,其实是不需要设置为一样的,发送方如下设置:
uchar TX_ADDRESS[TX_ADR_WIDTH] = 0x35,0x43,0x10,0x10,0x01; // 目的地址
uchar RX_ADDRESS[RX_ADR_WIDTH] = 0x34,0x43,0x10,0x10,0x01; // 本机地址
接受方如下设置:
uchar TX_ADDRESS[TX_ADR_WIDTH] = 0x34,0x43,0x10,0x10,0x01; // 目的地址
uchar RX_ADDRESS[RX_ADR_WIDTH] = 0x35,0x43,0x10,0x10,0x01; // 本机地址
这样照样是能收到数据,也能自动应答,只不过在自动应答时,发送方会临时的把自己的本机地址设置为和目的地址相同,以便于收到应答信号。
以下是测试结果,能正常收到数据。
以上是关于关于nRF24L01地址问题的主要内容,如果未能解决你的问题,请参考以下文章
关于nRF24L01读内部任何寄存器值为08H的经历和解决办法
NRF24L01 Protocol decoder:nrf24l01