/** * @brief * @param Device: The device to use * @param Address: A 5-byte array with the address to set [MSByte ... LSByte] * @param Pipe: The pipe to set the address for. Can be 0 to 5. Pipe 0-1 are 5 bytes, pipe 2-5 are 1 byte * @retval None */ void NRF24L01_SetRxAddressForPipe(NRF24L01_Device* Device, uint8_t* Address, uint8_t Pipe) { if (Pipe < 2) NRF24L01_WriteRegister(Device, RX_ADDR_P0 + Pipe, Address, 5); else if (Pipe < 6) NRF24L01_WriteRegister(Device, RX_ADDR_P0 + Pipe, Address, 1); }
/** * @brief Power up the device in RX mode * @param Device: The device to use * @retval None */ void NRF24L01_PowerUpInRxMode(NRF24L01_Device* Device) { uint8_t data = CONFIG_BASE | (1 << PWR_UP) | (1 << PRIM_RX); NRF24L01_WriteRegister(Device, CONFIG, &data, 1); Device->InTxMode = pdFALSE; }
/** * @brief Set the size of the payload for a specified pipe * @param Device: The device to use * @param Size: The size of the payload, can be 0 to 32 bytes, where 0 means pipe is not used * @param Pipe: The pipe to set, can be 0 to 5 * @retval None */ void NRF24L01_SetPayloadSizeForPipe(NRF24L01_Device* Device, uint8_t Size, uint8_t Pipe) { if (Pipe < 6 && Size < 33) { NRF24L01_WriteRegister(Device, RX_PW_P0 + Pipe, &Size, 1); } }
/** * @brief Set the RF channel to transmit on * @param Device: The device to use * @param Channel: The channel * @retval None * @note Freq = 2400 + RF_CH [MHz], -> 2400 MHz - 2525 MHz operation frequencies */ void NRF24L01_SetRFChannel(NRF24L01_Device* Device, uint8_t Channel) { if (Channel <= 125) { NRF24L01_WriteRegister(Device, W_REGISTER | RF_CH, &Channel, 1); } }
void NRF24L01_SetChannel(uint8_t channel) { if (channel <= 125 && channel != NRF24L01_Struct.Channel) { /* Store new channel setting */ NRF24L01_Struct.Channel = channel; /* Write channel */ NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, channel); } }
/** * @brief Enable a pipe * @param Device: The device to use * @param Pipe: The pipe to enable, can be 0 to 5 * @retval None */ void NRF24L01_EnablePipe(NRF24L01_Device* Device, uint8_t Pipe) { if (Pipe < 6) { uint8_t value = 0; NRF24L01_ReadRegister(Device, EN_RXADDR, &value, 1); /* Get the old value */ value |= (1 << Pipe); /* Enable the new pipe */ NRF24L01_WriteRegister(Device, EN_RXADDR, &value, 1); /* Set the new value */ } }
void NRF24L01_PowerUpRx(void) { /* Disable RX/TX mode */ NRF24L01_CE_LOW; /* Clear RX buffer */ NRF24L01_FLUSH_RX(NRF24L01_SPI); /* Clear interrupts */ NRF24L01_CLEAR_INTERRUPTS; /* Setup RX mode */ NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | 1 << NRF24L01_PWR_UP | 1 << NRF24L01_PRIM_RX); /* Start listening */ NRF24L01_CE_HIGH; }
void NRF24L01_GetData(uint8_t* data) { /* Pull down chip select */ NRF24L01_CSN_LOW; /* Send read payload command*/ SPI_Send(NRF24L01_SPI, NRF24L01_R_RX_PAYLOAD_MASK); /* Read payload */ SPI_SendMulti(NRF24L01_SPI, data, data, NRF24L01_Struct.PayloadSize); /* Pull up chip select */ NRF24L01_CSN_HIGH; /* Reset status register, clear RX_DR interrupt flag */ NRF24L01_WriteRegister(NRF24L01_REG_STATUS, (1 << NRF24L01_RX_DR)); }
void NRF24L01_WriteBit(uint8_t reg, uint8_t bit, uint8_t value) { uint8_t tmp; /* Read register */ tmp = NRF24L01_ReadRegister(reg); /* Make operation */ if (value) { tmp |= 1 << bit; } else { tmp &= ~(1 << bit); } /* Write back */ NRF24L01_WriteRegister(reg, tmp); }
void NRF24L01_SetRF(NRF24L01_DataRate_t DataRate, NRF24L01_OutputPower_t OutPwr) { uint8_t tmp = 0; NRF24L01_Struct.DataRate = DataRate; NRF24L01_Struct.OutPwr = OutPwr; if (DataRate == NRF24L01_DataRate_2M) { tmp |= 1 << NRF24L01_RF_DR_HIGH; } else if (DataRate == NRF24L01_DataRate_250k) { tmp |= 1 << NRF24L01_RF_DR_LOW; } /* If 1Mbps, all bits set to 0 */ if (OutPwr == NRF24L01_OutputPower_0dBm) { tmp |= 3 << NRF24L01_RF_PWR; } else if (OutPwr == NRF24L01_OutputPower_M6dBm) { tmp |= 2 << NRF24L01_RF_PWR; } else if (OutPwr == NRF24L01_OutputPower_M12dBm) { tmp |= 1 << NRF24L01_RF_PWR; } NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, tmp); }
void NRF24L01_SoftwareReset(void) { uint8_t data[5]; NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_REG_DEFAULT_VAL_CONFIG); NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, NRF24L01_REG_DEFAULT_VAL_EN_AA); NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, NRF24L01_REG_DEFAULT_VAL_EN_RXADDR); NRF24L01_WriteRegister(NRF24L01_REG_SETUP_AW, NRF24L01_REG_DEFAULT_VAL_SETUP_AW); NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, NRF24L01_REG_DEFAULT_VAL_SETUP_RETR); NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, NRF24L01_REG_DEFAULT_VAL_RF_CH); NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, NRF24L01_REG_DEFAULT_VAL_RF_SETUP); NRF24L01_WriteRegister(NRF24L01_REG_STATUS, NRF24L01_REG_DEFAULT_VAL_STATUS); NRF24L01_WriteRegister(NRF24L01_REG_OBSERVE_TX, NRF24L01_REG_DEFAULT_VAL_OBSERVE_TX); NRF24L01_WriteRegister(NRF24L01_REG_RPD, NRF24L01_REG_DEFAULT_VAL_RPD); //P0 data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_0; data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_1; data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_2; data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_3; data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_4; NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P0, data, 5); //P1 data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_0; data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_1; data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_2; data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_3; data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_4; NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P1, data, 5); NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P2, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P2); NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P3, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P3); NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P4, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P4); NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P5, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P5); //TX data[0] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_0; data[1] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_1; data[2] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_2; data[3] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_3; data[4] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_4; NRF24L01_WriteRegisterMulti(NRF24L01_REG_TX_ADDR, data, 5); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, NRF24L01_REG_DEFAULT_VAL_RX_PW_P0); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, NRF24L01_REG_DEFAULT_VAL_RX_PW_P1); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, NRF24L01_REG_DEFAULT_VAL_RX_PW_P2); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, NRF24L01_REG_DEFAULT_VAL_RX_PW_P3); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, NRF24L01_REG_DEFAULT_VAL_RX_PW_P4); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, NRF24L01_REG_DEFAULT_VAL_RX_PW_P5); NRF24L01_WriteRegister(NRF24L01_REG_FIFO_STATUS, NRF24L01_REG_DEFAULT_VAL_FIFO_STATUS); NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, NRF24L01_REG_DEFAULT_VAL_DYNPD); NRF24L01_WriteRegister(NRF24L01_REG_FEATURE, NRF24L01_REG_DEFAULT_VAL_FEATURE); }
void NRF24L01_PowerUpTx(void) { NRF24L01_CLEAR_INTERRUPTS; NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | (0 << NRF24L01_PRIM_RX) | (1 << NRF24L01_PWR_UP)); }
uint8_t NRF24L01_Init(uint8_t channel, uint8_t payload_size) { /* Initialize SPI */ SPI_Initialize(); /* Initialize CE and CSN pins */ NRF24L01_InitPins(); /* Max payload is 32bytes */ if (payload_size > 32) { payload_size = 32; } /* Fill structure */ NRF24L01_Struct.Channel = !channel; /* Set channel to some different value for NRF24L01_SetChannel() function */ NRF24L01_Struct.PayloadSize = payload_size; NRF24L01_Struct.OutPwr = NRF24L01_OutputPower_0dBm; NRF24L01_Struct.DataRate = NRF24L01_DataRate_2M; /* Reset nRF24L01+ to power on registers values */ NRF24L01_SoftwareReset(); /* Channel select */ NRF24L01_SetChannel(channel); /* Set pipeline to max possible 32 bytes */ NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, NRF24L01_Struct.PayloadSize); // Auto-ACK pipe NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, NRF24L01_Struct.PayloadSize); // Data payload pipe NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, NRF24L01_Struct.PayloadSize); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, NRF24L01_Struct.PayloadSize); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, NRF24L01_Struct.PayloadSize); NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, NRF24L01_Struct.PayloadSize); /* Set RF settings (2mbps, output power) */ NRF24L01_SetRF(NRF24L01_Struct.DataRate, NRF24L01_Struct.OutPwr); /* Config register */ NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG); /* Enable auto-acknowledgment for all pipes */ NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, 0x3F); /* Enable RX addresses */ NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 0x3F); /* Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials */ NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 0x4F); /* Dynamic length configurations: No dynamic length */ 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_SPI); NRF24L01_FLUSH_RX(NRF24L01_SPI); /* Clear interrupts */ NRF24L01_CLEAR_INTERRUPTS; /* Go to RX mode */ NRF24L01_PowerUpRx(); /* Return OK */ return 1; }
/** * @brief Power down the device * @param Device: The device to use * @retval None */ void NRF24L01_PowerDownMode(NRF24L01_Device* Device) { uint8_t data = CONFIG_BASE | (0 << PWR_UP); NRF24L01_WriteRegister(Device, CONFIG, &data, 1); }
/** * @brief Reset flags related to TX (TX_DS, MAX_RT) in the STATUS register * @param Device: The device to use * @retval None */ void NRF24L01_ResetTxFlags(NRF24L01_Device* Device) { uint8_t data = (1 << TX_DS) | (1 << MAX_RT); NRF24L01_WriteRegister(Device, STATUS, &data, 1); }
/** * @brief Reset the Data Ready (RX_DR) flag in the STATUS register * @param Device: The device to use * @retval None */ void NRF24L01_ResetDataReadyFlag(NRF24L01_Device* Device) { uint8_t data = (1 << RX_DR); NRF24L01_WriteRegister(Device, STATUS, &data, 1); }
/** * @brief Set the address width of the device * @param Device: The device to use * @retval None */ void NRF24L01_SetAddressWidth(NRF24L01_Device* Device) { NRF24L01_WriteRegister(Device, SETUP_AW, &Device->addressWidth, 1); }
/** * @brief * @param Device: The device to use * @param Address: A 5-byte array with the address to set [MSByte ... LSByte] * @retval None */ void NRF24L01_SetTxAddress(NRF24L01_Device* Device, uint8_t* Address) { NRF24L01_WriteRegister(Device, TX_ADDR, Address, 5); }