static void NRF24L01_InitGpio(void) { // CE as OUTPUT const SPIDevice rxSPIDevice = spiDeviceByInstance(RX_SPI_INSTANCE); IOInit(DEFIO_IO(RX_CE_PIN), OWNER_RX_SPI_CS, rxSPIDevice + 1); IOConfigGPIO(DEFIO_IO(RX_CE_PIN), SPI_IO_CS_CFG); NRF24_CE_LO(); }
/* * Enter receive mode */ void NRF24L01_SetRxMode(void) { NRF24_CE_LO(); // drop into standby mode // set the PRIM_RX bit NRF24L01_WriteReg(NRF24L01_00_CONFIG, standbyConfig | BV(NRF24L01_00_CONFIG_PRIM_RX)); NRF24L01_ClearAllInterrupts(); // finally set CE high to start enter RX mode NRF24_CE_HI(); // nRF24L01+ will now transition from Standby mode to RX mode after 130 microseconds settling time }
/* * Enter transmit mode. Anything in the transmit FIFO will be transmitted. */ void NRF24L01_SetTxMode(void) { // Ensure in standby mode, since can only enter TX mode from standby mode NRF24L01_SetStandbyMode(); NRF24L01_ClearAllInterrupts(); // pulse CE for 10 microseconds to enter TX mode NRF24_CE_HI(); delayMicroseconds(10); NRF24_CE_LO(); // nRF24L01+ will now transition from Standby mode to TX mode after 130 microseconds settling time. // Transmission will then begin and continue until TX FIFO is empty. }
void NRF24L01_Initialize(uint8_t baseConfig) { standbyConfig = BV(NRF24L01_00_CONFIG_PWR_UP) | baseConfig; NRF24_CE_LO(); // nRF24L01+ needs 100 milliseconds settling time from PowerOnReset to PowerDown mode static const uint32_t settlingTimeUs = 100000; const uint32_t currentTimeUs = micros(); if (currentTimeUs < settlingTimeUs) { delayMicroseconds(settlingTimeUs - currentTimeUs); } // now in PowerDown mode NRF24L01_WriteReg(NRF24L01_00_CONFIG, standbyConfig); // set PWR_UP to enter Standby mode // nRF24L01+ needs 4500 microseconds from PowerDown mode to Standby mode, for crystal oscillator startup delayMicroseconds(4500); // now in Standby mode }
/* * Enter standby mode */ void NRF24L01_SetStandbyMode(void) { // set CE low and clear the PRIM_RX bit to enter standby mode NRF24_CE_LO(); NRF24L01_WriteReg(NRF24L01_00_CONFIG, standbyConfig); }