uint8_t NRF24L01_Init(uint8_t channel, uint8_t payload_size) { /* 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_FLUSH_RX(); /* Clear interrupts */ NRF24L01_CLEAR_INTERRUPTS; /* Go to RX mode */ NRF24L01_PowerUpRx(); /* Return OK */ return 1; }
void InitializeNRF24L01() { // NRF24L01 goes to RX mode by default; NRF24L01_Init(DEFAULT_CHANNEL, DEFAULT_PAYLOAD_SIZE); NRF24L01_SetRF(NRF24L01_DataRate_2M, NRF24L01_OutputPower_M18dBm); NRF24L01_SetMyAddress(MyAddress); NRF24L01_SetTxAddress(TxAddress); }
void transmitter(void) { /* My address */ uint8_t MyAddress[] = { 0xE7, 0xE7, 0xE7, 0xE7, 0xE7 }; /* Receiver address */ uint8_t TxAddress[] = { 0x7E, 0x7E, 0x7E, 0x7E, 0x7E }; uint8_t dataOut[32], dataIn[32], i; uint32_t tr_count; NRF24L01_Transmit_Status_t transmissionStatus; /* 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 */ NRF24L01_Init(15, 32); /* Set RF settings, Data rate to 2Mbps, Output power to -18dBm */ NRF24L01_SetRF(NRF24L01_DataRate_2M, NRF24L01_OutputPower_M18dBm); /* Set my address, 5 bytes */ //NRF24L01_SetMyAddress(MyAddress); /* Set TX address, 5 bytes */ //NRF24L01_SetTxAddress(TxAddress); uint8_t reg; delay_(720000); reg = NRF24L01_ReadRegister(NRF24L01_REG_CONFIG); printf("NRF24L01_REG_CONFIG: 0x%X\r\n", reg); reg = NRF24L01_ReadRegister(NRF24L01_REG_EN_RXADDR); printf("NRF24L01_REG_EN_RXADDR: 0x%X\r\n", reg); reg = NRF24L01_ReadRegister(NRF24L01_REG_RF_CH); printf("NRF24L01_REG_RF_CH: 0x%X\r\n", reg); reg = NRF24L01_ReadRegister(NRF24L01_REG_CONFIG); printf("NRF24L01_REG_CONFIG: 0x%X\r\n", reg); reg = NRF24L01_ReadRegister(NRF24L01_REG_RF_CH); printf("NRF24L01_REG_RF_CH: 0x%X\r\n", reg); reg = NRF24L01_ReadRegister(NRF24L01_REG_CONFIG); printf("NRF24L01_REG_CONFIG: 0x%X\r\n", reg); delay_(720000); for (i = 0; i < 32; i++) { dataOut[i] = i + 30; dataIn[i] = 0; } while (1) { /* Transmit data, goes automatically to TX mode */ NRF24L01_Transmit(dataOut); /* Turn on led to indicate sending */ LED2_ON; /* Wait for data to be sent */ do { transmissionStatus = NRF24L01_GetTransmissionStatus(); printf("transmissionStatus: %d\r\n", transmissionStatus); delay_(72000); } while (transmissionStatus == NRF24L01_Transmit_Status_Sending); /* Turn off led */ LED2_OFF; /* Go back to RX mode */ NRF24L01_PowerUpRx(); i = 0; uint8_t status = NRF24L01_GetStatus(); printf("status: %d\r\n", status); /* Wait received data, wait max 100ms, if time is larger, then data were probably lost */ while (!NRF24L01_DataReady()) { delay_(720000); i++; printf("TM_NRF24L01_DataReady\r\n"); if( i > 100) break; } /* Get data from NRF2L01+ */ NRF24L01_GetData(dataIn); printf("dataIn: %s\r\n", dataIn); /* Check transmit status */ if (transmissionStatus == NRF24L01_Transmit_Status_Ok) { tr_count++; printf("tr_count: %s\r\n", tr_count); } delay_(7200000); } }
void retranslate(void) { /* Receiver address */ uint8_t TxAddress[] = { 0xE7, 0xE7, 0xE7, 0xE7, 0xE7 }; /* My address */ uint8_t MyAddress[] = { 0x7E, 0x7E, 0x7E, 0x7E, 0x7E }; uint8_t dataIn[32]; NRF24L01_Transmit_Status_t transmissionStatus; /* 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 */ NRF24L01_Init(15, 32); /* Set RF settings, Data rate to 2Mbps, Output power to -18dBm */ NRF24L01_SetRF(NRF24L01_DataRate_2M, NRF24L01_OutputPower_M18dBm); /* Set my address, 5 bytes */ NRF24L01_SetMyAddress(MyAddress); /* Set TX address, 5 bytes */ NRF24L01_SetTxAddress(TxAddress); LED1_ON; delay_(3600000); LED1_OFF; while (1) { /* If data is ready on NRF24L01+ */ if (NRF24L01_DataReady()) { /* Get data from NRF24L01+ */ NRF24L01_GetData(dataIn); delay_(36000); /* Send it back, automatically goes to TX mode */ NRF24L01_Transmit(dataIn); /* Start send */ LED1_ON;; delay_(360000); /* Wait for data to be sent */ do { transmissionStatus = NRF24L01_GetTransmissionStatus(); } while (transmissionStatus == NRF24L01_Transmit_Status_Sending); /* Send done */ LED1_OFF; /* Go back to RX Mode */ NRF24L01_PowerUpRx(); } } }