Я настраиваю два модуля `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.Любые предложения ??
С уважением.