uint8_t TM_NRF24L01_Init(uint8_t channel, uint8_t payload_size) { //Initialize CE and CSN pins TM_NRF24L01_InitPins(); //Initialize SPI TM_SPI_Init(NRF24L01_SPI, NRF24L01_SPI_PINS); //Max payload is 32bytes if (payload_size > 32) { payload_size = 32; } TM_NRF24L01_Struct.Channel = channel; TM_NRF24L01_Struct.PayloadSize = payload_size; TM_NRF24L01_Struct.OutPwr = TM_NRF24L01_OutputPower_0dBm; TM_NRF24L01_Struct.DataRate = TM_NRF24L01_DataRate_2M; //Reset nRF24L01+ to power on registers values TM_NRF24L01_SoftwareReset(); //Channel select TM_NRF24L01_SetChannel(TM_NRF24L01_Struct.Channel); //Set pipeline to max possible 32 bytes TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, TM_NRF24L01_Struct.PayloadSize); // Auto-ACK pipe TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, TM_NRF24L01_Struct.PayloadSize); // Data payload pipe TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, 0x00); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, 0x00); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, 0x00); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, 0x00); //Set RF settings (2mbps, output power) TM_NRF24L01_SetRF(TM_NRF24L01_Struct.DataRate, TM_NRF24L01_Struct.OutPwr); //Config register TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG); //Enable auto-acknowledgment for all pipes TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, 0xFF); // Enable RX addresses TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 0xFF); //Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials TM_NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 0x4F); // Dynamic length configurations: No dynamic length TM_NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, (0 << NRF24L01_DPL_P0) | (0 << NRF24L01_DPL_P1) | (0 << NRF24L01_DPL_P2) | (0 << NRF24L01_DPL_P3) | (0 << NRF24L01_DPL_P4) | (0 << NRF24L01_DPL_P5)); //Clear FIFOs NRF24L01_FLUSH_TX; NRF24L01_FLUSH_RX; //Go to RX mode TM_NRF24L01_PowerUpRx(); return 1; }
int main(void) { /* Init system clock for maximum system speed */ TM_RCC_InitSystem(); /* Init HAL layer */ HAL_Init(); /* Init leds */ TM_DISCO_LedInit(); /* Init button */ TM_DISCO_ButtonInit(); /* Initialize USART, TX: PB6, RX: PB7 */ TM_USART_Init(USART1, TM_USART_PinsPack_2, 115200); /* Initialize NRF24L01+ on channel 15 and 32bytes of payload */ /* By default 2Mbps data rate and 0dBm output power */ /* NRF24L01 goes to RX mode by default */ TM_NRF24L01_Init(15, 32); /* Set RF settings, Data rate to 2Mbps, Output power to -18dBm */ TM_NRF24L01_SetRF(TM_NRF24L01_DataRate_2M, TM_NRF24L01_OutputPower_M18dBm); /* Set my address, 5 bytes */ TM_NRF24L01_SetMyAddress(MyAddress); /* Set TX address, 5 bytes */ TM_NRF24L01_SetTxAddress(TxAddress); while (1) { /* If data is ready on NRF24L01+ */ if (TM_NRF24L01_DataReady()) { /* Get data from NRF24L01+ */ TM_NRF24L01_GetData(dataIn); /* Start send */ TM_DISCO_LedOn(LED_GREEN); /* Send it back, automatically goes to TX mode */ TM_NRF24L01_Transmit(dataIn); /* Wait for data to be sent */ do { /* Wait till sending */ transmissionStatus = TM_NRF24L01_GetTransmissionStatus(); } while (transmissionStatus == TM_NRF24L01_Transmit_Status_Sending); /* Send done */ TM_DISCO_LedOff(LED_GREEN); /* Go back to RX mode */ TM_NRF24L01_PowerUpRx(); } } }
uint8_t TM_NRF24L01_Init(uint8_t channel, uint8_t payload_size) { /* Initialize CE and CSN pins */ TM_NRF24L01_InitPins(); /* Initialize SPI */ TM_SPI_Init(NRF24L01_SPI, NRF24L01_SPI_PINS); /* Max payload is 32bytes */ if (payload_size > 32) { payload_size = 32; } /* Fill structure */ TM_NRF24L01_Struct.Channel = !channel; /* Set channel to some different value for TM_NRF24L01_SetChannel() function */ TM_NRF24L01_Struct.PayloadSize = payload_size; TM_NRF24L01_Struct.OutPwr = TM_NRF24L01_OutputPower_0dBm; TM_NRF24L01_Struct.DataRate = TM_NRF24L01_DataRate_2M; /* Reset nRF24L01+ to power on registers values */ TM_NRF24L01_SoftwareReset(); /* Channel select */ TM_NRF24L01_SetChannel(channel); /* Set pipeline to max possible 32 bytes */ TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, TM_NRF24L01_Struct.PayloadSize); // Auto-ACK pipe TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, TM_NRF24L01_Struct.PayloadSize); // Data payload pipe TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, TM_NRF24L01_Struct.PayloadSize); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, TM_NRF24L01_Struct.PayloadSize); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, TM_NRF24L01_Struct.PayloadSize); TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, TM_NRF24L01_Struct.PayloadSize); /* Set RF settings (2mbps, output power) */ TM_NRF24L01_SetRF(TM_NRF24L01_Struct.DataRate, TM_NRF24L01_Struct.OutPwr); /* Config register */ TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG); /* Enable auto-acknowledgment for all pipes */ TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, 0x3F); /* Enable RX addresses */ TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 0x3F); /* Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials */ TM_NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 0x4F); /* Dynamic length configurations: No dynamic length */ TM_NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, (0 << NRF24L01_DPL_P0) | (0 << NRF24L01_DPL_P1) | (0 << NRF24L01_DPL_P2) | (0 << NRF24L01_DPL_P3) | (0 << NRF24L01_DPL_P4) | (0 << NRF24L01_DPL_P5)); /* Clear FIFOs */ NRF24L01_FLUSH_TX; NRF24L01_FLUSH_RX; /* Clear interrupts */ NRF24L01_CLEAR_INTERRUPTS; /* Go to RX mode */ TM_NRF24L01_PowerUpRx(); /* Return OK */ return 1; }
int main(void) { TM_NRF24L01_Transmit_Status_t transmissionStatus; char str[40]; //Initialize system SystemInit(); //Initialize system and Delay functions TM_DELAY_Init(); //Initialize onboard leds TM_DISCO_LedInit(); //Initialize USART, TX: PB6, RX: PB7 TM_USART_Init(USART1, TM_USART_PinsPack_2, 115200); //Initialize NRF24L01+ on channel 15 and 32bytes of payload //By default 2Mbps data rate and 0dBm output power //NRF24L01 goes to RX mode by default TM_NRF24L01_Init(15, 32); //Set 2MBps data rate and -18dBm output power TM_NRF24L01_SetRF(TM_NRF24L01_DataRate_2M, TM_NRF24L01_OutputPower_M18dBm); //Set my address, 5 bytes TM_NRF24L01_SetMyAddress(MyAddress); //Set TX address, 5 bytes TM_NRF24L01_SetTxAddress(TxAddress); //Reset counter TM_DELAY_SetTime(0); while (1) { //Every 2 seconds if (TM_DELAY_Time() > 2000000) { //Fill data with something sprintf((char *)dataOut, "abcdefghijklmnoszxABCDEFCBDA"); //Display on USART TM_USART_Puts(USART1, "pinging: "); //Reset time, start counting microseconds TM_DELAY_SetTime(0); //Transmit data, goes automatically to TX mode TM_NRF24L01_Transmit(dataOut); TM_DISCO_LedOn(LED_PIN); //Wait for data to be sent do { transmissionStatus = TM_NRF24L01_GetTransmissionStatus(); } while (transmissionStatus == TM_NRF24L01_Transmit_Status_Sending); TM_DISCO_LedOff(LED_PIN); //Go back to RX mode TM_NRF24L01_PowerUpRx(); //Wait received data, wait max 100ms, if time is larger, than data was probably lost while (!TM_NRF24L01_DataReady() && TM_DELAY_Time() < 100000); //Format time sprintf(str, "%d us", TM_DELAY_Time()); //Show ping time TM_USART_Puts(USART1, str); //Get data from NRF2L01+ TM_NRF24L01_GetData(dataIn); //Check transmit status if (transmissionStatus == TM_NRF24L01_Transmit_Status_Ok) { //Transmit went OK TM_USART_Puts(USART1, ": OK\n\r"); } else if (transmissionStatus == TM_NRF24L01_Transmit_Status_Lost) { //Message was LOST TM_USART_Puts(USART1, ": LOST\n\r"); } else { //This should never happen TM_USART_Puts(USART1, ": SENDING\n\r"); } } } }