NRF24 Передача и получение от одного и того же модуля - PullRequest
0 голосов
/ 24 апреля 2019

Я настраиваю два модуля `nrf24l01 'для связи друг с другом, используя две разные платы, то есть nrf24 должен получить некоторые данные и переключиться в режим Tx, а другой nrf24 что-то передаст и переключиться в режим Rx.И этот процесс будет продолжаться.

До сих пор я могу успешно настроить один модуль в режиме Tx и другой в режиме Rx.И в состоянии получить успешный результат в односторонней связи.

Функция для режима Rx.

void NRF24_startListening(void)
{
//Power up and set to RX mode
NRF24_write_register(REG_CONFIG, NRF24_read_register(REG_CONFIG) | (1UL<<1) |(1UL <<0));
    //clearing status register
NRF24_write_register(REG_STATUS, (1 << BIT_RX_DR) | (1 << BIT_TX_DS) | (1 << BIT_MAX_RT));
//Set CE HIGH to start listenning
NRF24_ce(1);
//Restore pipe 0 address if exists
if(pipe0_reading_address)
    NRF24_write_registerN(REG_RX_ADDR_P0, (uint8_t *)(&pipe0_reading_address), 5);

//Flush buffers
if (NRF24_read_register(REG_FEATURE) & (1 << BIT_EN_ACK_PAY))   {
    NRF24_flush_tx();
}
//NRF24_flush_rx();

//Wait for 130 uSec for the radio to come on
HAL_Delay(1);
}

Функция для режима Tx.

void NRF24_stopListening(void)
{
NRF24_ce(0);
HAL_Delay(1);

if (NRF24_read_register(REG_FEATURE) & (1 << BIT_EN_ACK_PAY))   {
    HAL_Delay(1);
    NRF24_flush_tx();
}

NRF24_write_register(REG_CONFIG, NRF24_read_register(REG_CONFIG) & ~(1 << BIT_PRIM_RX));
NRF24_write_register(REG_EN_RXADDR, NRF24_read_register(REG_EN_RXADDR) | (1 << BIT_ERX_P0));
}

Функция переключения режимов.Я повторно инициализировал всю шину SPI для переключения режимов.

 void vNRF24_StartAs(NEW_MODE xNewMode) {
NRF24_powerDown();
HAL_Delay(100);
NRF24_begin(RF_CS_GPIO_Port, RF_CS_Pin, RF_CE_Pin, hspi2);
NRF24_setAutoAck(true);
NRF24_setChannel(52);
NRF24_setPayloadSize(32);
if (xNewMode == RX_MODE)    {
    NRF24_openReadingPipe(1, TxpipeAddrs);
    NRF24_startListening();
}
else    {
    NRF24_stopListening();
    NRF24_openWritingPipe(TxpipeAddrs);
}
}

Мой основной код, где я переключаюсь между режимами Rx и Tx

 while (1)
 {

  if (xMode == RX_MODE)
  {
      if(NRF24_available())
      {
          NRF24_read(myRxData, 32);
          myRxData[32] = '\r'; myRxData[32+1] = '\n';
          vSerial_Transmit(myRxData, 32);
          HAL_GPIO_TogglePin(BLUE_GPIO_Port, BLUE_Pin);
          vNRF24_StartAs(TX_MODE);
          xMode = TX_MODE;
          HAL_Delay(5000);
      }
  }

  if (xMode == TX_MODE) {
      if(NRF24_write(myTxData, 32))     {
          vSerial_Transmit("Transmit OK!!\r\n", strlen("Transmit OK!!\r\n"));
          vNRF24_StartAs(RX_MODE);
          xMode = RX_MODE;
          HAL_Delay(5000);
      }
      else  {
          vSerial_Transmit("Transmit FAIL!!\r\n", strlen("Transmit FAIL!!\r\n"));
      }
  }

 }

Я попытался инициализировать оба модуля в двухразные режимы.Первые две транзакции между ними - это идеальный модуль.Затем оба модуля как-то переключаются в режим Tx.Любые предложения ??

С уважением.

...