这几天在做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);
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}; // 本机地址
以下是测试结果,能正常收到数据。