微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微波和射频技术 > 射频综合技术问答 > NRF24L01多节点组网问题,求助,谢谢!!

NRF24L01多节点组网问题,求助,谢谢!!

时间:10-02 整理:3721RD 点击:
        利用NRF24L01+stm32F4进行传感器组网,关闭了自动应答功能,利用时隙分配,进行节点轮询(设节点6ms一个周期,0号节点在收到基站启动信号后使能定时器,1号节点在收到启动信号后延迟3ms使能定时器,两个节点是同时收到启动信号的,这样正好错开3ms)。现在存在一个问题,当使用单个节点时,数据传输没有问题,一切正常;但使用双节点时,基站接收2-3秒消息后(此期间有串口输出),无消息输出(无串口打印输出),这不知道为什么?
节点地址(两个节点都是一样的地址,只是利用定时器错开了发送时间):

  1. const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
  2. const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x00}; //接收地址       

复制代码

基站地址:

  1. const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x00}; //发送地址
  2. const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址       

复制代码


节点读模式转换函数(与基站同样):

  1. void RX_Mode(void)
  2. {
  3.         Clr_NRF24L01_CE;          
  4.           NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
  5.         NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址
  6.           
  7.         NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA,0x00);    //失能通道0的自动应答   
  8.           NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址           
  9.           NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,100);             //设置RF通信频率                  
  10.           NRF24L01_Write_Reg(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度             
  11.           NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  12.           NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG1, 0x3f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
  13.           Set_NRF24L01_CE;
  14. }

复制代码

节点写模式转换函数(与基站同样):

  1. void TX_Mode(void)
  2. {
  3.         Clr_NRF24L01_CE;            
  4.           NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址
  5.           NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          
  6.           NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA,0x00);     //失能通道0的自动应答   
  7.           NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址  
  8.         NRF24L01_Write_Reg(SPI_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  9.           NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,100);       //设置RF通道为40,AD转换测试,暂时设置为40
  10.           NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  11.           NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG1,0x3e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  12.         Set_NRF24L01_CE;
  13. }

复制代码

节点发送函数(与基站同样):

  1. u8  Wireless_Send_Data(u8 *txbuf){
  2.         u8 ret = 0;
  3.         TX_Mode();
  4.         delay_us(200);
  5.     ret =<font color="Red"> NRF24L01_TxPacket</font>(txbuf);
  6.         delay_us(200);
  7.         RX_Mode();
  8.     delay_us(200);
  9.         return ret;
  10. }
  11. u8 <font color="Red"><b>NRF24L01_TxPacket</b></font>(u8 *txbuf)
  12. {

  13.         u8 state;   
  14.     u32 timeout = 0;
  15.         Clr_NRF24L01_CE;
  16.         NRF24L01_Write_Reg(FLUSH_TX,NOP);   //刷新发送缓冲器千万不要去掉,否则数据有时候不更新
  17.           NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
  18.         Set_NRF24L01_CE;                                     //启动发送          
  19.         while(timeout <2000)
  20.         {
  21.           timeout++;
  22.         }
  23.         state=NRF24L01_Read_Reg(STATUS);                     //读取状态寄存器的值          
  24.         NRF24L01_Write_Reg(SPI_WRITE_REG+STATUS,0x7E);      //清除TX_DS或MAX_RT中断标志
  25.         if(state&TX_OK)                                      //发送完成
  26.         {
  27.                 return TX_OK;
  28.         }
  29.         return 0xff;                                         //其他原因发送失败
  30. }

复制代码

基站NRF24L01+接收信号中断函数:

  1. void EXTI1_IRQHandler(void){
  2.          u8 RX_Status;
  3.          if(EXTI_GetITStatus(EXTI_Line1) != RESET){
  4.                 RX_Status=NRF24L01_RxPacket(rev_buf);
  5.                  if(RX_Status == 0){
  6.                         rev_buf[27] = '\0';
  7.                         Uart1_SendString(rev_buf);
  8.                  }
  9.                 EXTI_ClearITPendingBit(EXTI_Line1);
  10.          }
  11. }

复制代码

基站串口打印函数:

  1. void Uart1_SendString(u8 *str)
  2. {
  3.   while(*str)
  4.   {
  5.            USART_SendData(USART1,*str);                                                                                           //将*str从USARTx发送出去
  6.          while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);                       //等待发送完毕
  7.          str++;                                                                           //str的地址增加1,到下一个字符
  8.   }
  9. }

复制代码


已退回5积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top