目前调试24L01+,非自动应答可以收到数据,但自动应答时,一直出现达到最大重发次数,但接收方有收到数据。
发送端:
oid ANO_NRF_TX_MODE(void)
{
ANO_SPI_CE_L();
ANO_NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
ANO_NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //写RX节点地址,使能ACK
ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 0X01
ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 0X01
ANO_NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1A); //设置自动重发间隔时间:500us;最大自动重发次数:10次 2M波特率下 0X1a
ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL 必须一致
ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 必须一致
ANO_NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
ANO_NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送
ANO_SPI_CE_H();
delay_us(10);
}
接收端配置:
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通信频率
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数
WR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_CE = 1; //CE为高,进入接收模式
}
发送端:
oid ANO_NRF_TX_MODE(void)
{
ANO_SPI_CE_L();
ANO_NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
ANO_NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //写RX节点地址,使能ACK
ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 0X01
ANO_NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 0X01
ANO_NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1A); //设置自动重发间隔时间:500us;最大自动重发次数:10次 2M波特率下 0X1a
ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL 必须一致
ANO_NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 必须一致
ANO_NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
ANO_NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送
ANO_SPI_CE_H();
delay_us(10);
}
接收端配置:
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通信频率
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_CE = 1; //CE为高,进入接收模式
原文如下:
An ACK packet can contain an optional payload from PRX to PTX. In order to use this feature, the
Dynamic Payload Length (DPL) feature must be enabled.
下面设置我用过没问题,供参考
[mw_shl_code=c,true]
//接收端
writeReg(REG_CONFIG, 0x0f); /* IRQ收发完成中断开启,16位CRC,PRX */
writeReg(REG_DYNPD,0x01); /* 使能RX_P0动态长度PLAYLOAD */
writeReg(REG_FEATURE,0x06); /* 使能动态长度PLAYLOAD、发送ACK PLAYLOAD */
writeReg(REG_EN_AA,0x01); /* 使能通道0的自动应答 */
writeReg(CMD_FLUSH_TX,0xff); /* 冲洗TX_FIFO */
writeReg(CMD_FLUSH_RX,0xff);
//发送端
writeReg(REG_CONFIG, 0x0e); /* IRQ收发完成中断开启,16位CRC,PTX */
writeReg(REG_DYNPD,0x01); /* 使能RX_P0动态长度PLAYLOAD */
writeReg(REG_FEATURE,0x07); /* 使能动态长度、ACK PLAYLOAD发送、W_TX_PAYLOAD_NOACK */
writeReg(CMD_FLUSH_TX,0xff); /* 冲洗TX_FIFO */
writeReg(CMD_FLUSH_RX,0xff);
[/mw_shl_code]
然后看了你的接收端,发送地址都没有
一周热门 更多>