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; }
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; }