天线|RF射频
直播中

刘桂珍

7年用户 223经验值
私信 关注
[问答]

NRF24L01自动应答和不自动应答的区别是什么?

自检能通过,但是设置发送模式,就是不行。。



但是直接把自动应答给使能了,显示就是发射成功,但是接收不到。

回帖(10)

励黎

2020-7-25 09:45:20
大神快来回答、
举报

李林臻

2020-7-25 09:54:59

[C] 纯文本查看 复制代码
工作模式设置函数:
[C] 纯文本查看 复制代码
void NRF24L01_TX_Mode(void){ NRF24L01_CE_Reset;NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_TX_ADDR ,(unsigned char*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RX_ADDR_P0 ,(unsigned char*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK  NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_EEAA ,0x00);     //使能通道0的自动应答    NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_EN_RXADDR ,0x01); //使能通道0的接收地址  NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_SETUP_RETR ,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RF_CH ,40);       //设置RF通道为40NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RF_SETUP ,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_CONFIG ,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE_Set;//CE为高,10us后启动发送delay_us(20);}








[C] 纯文本查看 复制代码
发送函数:
[C] 纯文本查看 复制代码
//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况unsigned char NRF24L01_TxPacket(unsigned char *txbuf){unsigned char sta;//SPI_InitTypeDef SPI_InitStructure;//////设置SPI1的速率   //SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;//SPI_Init(SPI1,&SPI_InitStructure);//SPI_Cmd(SPI1,ENABLE); //使能SPI1NRF24L01_CE_Reset;NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RX_PAYLOAD ,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节NRF24L01_CE_Set;//启动发送while(NRF24L01_IRQ != 0);//等待发送完成//while(CheckACK());sta = NRF24L01_Read_Register( NRF24L01_Register_STATUS );  //读取状态寄存器的值   //USART_SendData(USART1,sta);NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta & MAX_TX)//达到最大重发次数{NRF24L01_Write_Register(NRF24L01_Command_FLUSH_TX,0xff);//清除TX FIFO寄存器 return MAX_TX; }if(sta & TX_OK)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败}




[C] 纯文本查看 复制代码
主函数:
[C] 纯文本查看 复制代码
int main(void){        RCC_Configuration();   //用外部的晶振 来产生时钟Usart_Configuration();    Systick_configuration();NRF24L01_Init();delay_ms(100);printf(" Hello..rn"); printf("SPI Test--NRF24L01 Test...rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);while(NRF24L01_Check()){printf("NRF24L01 Check Failed!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);}printf("NRF24L01 Check Success!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);while(1){NRF24L01_TX_Mode();if(NRF24L01_TxPacket(buff) == TX_OK){printf("NRF24L01 Send Success!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(100);}else{printf("NRF24L01 Send Failed!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);}}}



运行结果:但是在另外一块战舰的板子上接收不到数据。












[C] 纯文本查看 复制代码
发送函数:
[C] 纯文本查看 复制代码
//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况unsigned char NRF24L01_TxPacket(unsigned char *txbuf){unsigned char sta;//SPI_InitTypeDef SPI_InitStructure;//////设置SPI1的速率   //SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;//SPI_Init(SPI1,&SPI_InitStructure);//SPI_Cmd(SPI1,ENABLE); //使能SPI1NRF24L01_CE_Reset;NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RX_PAYLOAD ,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节NRF24L01_CE_Set;//启动发送while(NRF24L01_IRQ != 0);//等待发送完成//while(CheckACK());sta = NRF24L01_Read_Register( NRF24L01_Register_STATUS );  //读取状态寄存器的值   //USART_SendData(USART1,sta);NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta & MAX_TX)//达到最大重发次数{NRF24L01_Write_Register(NRF24L01_Command_FLUSH_TX,0xff);//清除TX FIFO寄存器 return MAX_TX; }if(sta & TX_OK)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败}




[C] 纯文本查看 复制代码
主函数:
[C] 纯文本查看 复制代码
int main(void){        RCC_Configuration();   //用外部的晶振 来产生时钟Usart_Configuration();    Systick_configuration();NRF24L01_Init();delay_ms(100);printf(" Hello..rn"); printf("SPI Test--NRF24L01 Test...rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);while(NRF24L01_Check()){printf("NRF24L01 Check Failed!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);}printf("NRF24L01 Check Success!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);while(1){NRF24L01_TX_Mode();if(NRF24L01_TxPacket(buff) == TX_OK){printf("NRF24L01 Send Success!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(100);}else{printf("NRF24L01 Send Failed!rn");printf("两个嘴巴笑rn");printf("2014-07-13rnrn");delay_ms(1000);}}}



运行结果:但是在另外一块战舰的板子上接收不到数据。




举报

张依弛

2020-7-25 10:02:33
如果使用自动应答的话,程序一直在检测IRQ的引脚这里死等。。。
举报

周炳胤

2020-7-25 10:20:29
NRF24L01_TX_Mode();

这句话,放到while1之外去...

放里面, 是个奇葩.
举报

更多回帖

相关问答

nRF24L01
发帖
登录/注册
×
20
完善资料,
赚取积分