void NRF_transmit_data(BYTE *pBuffer, int nLen) { int i; NRF_Select(TRUE); //Clear previous ints NRF_WriteRegister(0x27, 0x7E); //PWR_UP=1 NRF_WriteRegister(0x20, 0x3A); delay_ms(2); //Takes 1.5ms from PowerDown to Standby mode //Clear TX fifo NRF_WriteCommand(0xE1); //7 bytes payload NRF_WriteCommand(0xA0); //Store payload for(i=0; i<nLen; i++) { _spi_write(pBuffer[i]); } NRF_Select(FALSE); //Pulse CE to start transmission delay_ms(1); NRF_Enable(TRUE); delay_ms(1); NRF_Enable(FALSE); }
void service_net () { while (interrupts > 0) { NRF_CE_lo; uint8_t status = NRF_ReadRegister(NRF_STATUS); RXEN_lo; // received a packet if (status & 0x40) { printf("Radio received a packet\n"); readPacket(); } else if (status & 0x20) { // packet was sent printf("Radio successfully sent the packet\n"); NRF_WriteRegister(NRF_STATUS, 0x10); } else if (status & 0x10) { // packet failed to send printf("Radio failed to send the packet\n"); NRF_WriteRegister(NRF_STATUS, 0x20); } RXEN_hi; NRF_CE_hi; INT_Disable(); interrupts--; INT_Enable(); } }
void sender_enable() { status = SENDER; NRF_CE_lo; NRF_WriteRegister(NRF_STATUS, 0x7E); // reset status register NRF_WriteRegister(NRF_CONFIG, 0x0E); // PRIM_RX LO & PWR_UP NRF_CE_hi; NRF_SendCommand(NRF_FLUSH_TX, 0xFF); // Flush TX }
void recv_setup() { status = RECEIVER; //printf("enabling receiver"); NRF_WriteRegister(NRF_STATUS, 0x7E); // reset status register NRF_SendCommand(NRF_FLUSH_RX, 0xFF); NRF_WriteRegister(NRF_CONFIG, 0x0F); NRF_CE_hi; NRF_Delay(); }
void NRF_EnableRX(void) { NRF_WriteRegister(NRF_STATUS, 0x7E); NRF_WriteRegister(NRF_CONFIG, 0x0F); NRF_SendCommand(NRF_FLUSH_RX, 0xFF); for (int i =0; i < 2; i++) { NRF_Delay(); } NRF_CE_hi; for (int i =0; i < 2; i++) { NRF_Delay(); } NRF_SendCommand(NRF_FLUSH_RX, 0xFF); }
void NRF_config_rx() { NRF_Select(FALSE); NRF_Enable(FALSE); //PRX, CRC enabled NRF_WriteRegister(0x20, 0x39); //config RF interface, e.g. channel, address, data rate, etc NRF_config_rf(); //PWR_UP=1 NRF_WriteRegister(0x20, 0x3B); NRF_Select(FALSE); //Enter RX mode (CE=1 && PRX) NRF_Enable(TRUE); }
void NRF_TransmitPacket(uint8_t bytes, uint8_t *data) { NRF_WriteRegister(NRF_CONFIG, 0x0E); // Power Up, Transmitter NRF_SendPayload(NRF_W_TX_PAYLOAD_NOACK, bytes, data); NRF_CE_hi; }
void NRF_config_tx() { NRF_Enable(FALSE); //RF Power down mode //PTX, CRC enabled NRF_WriteRegister(0x20, 0x38); //config RF interface, e.g. channel, address, data rate, etc NRF_config_rf(); }
void NRF_Carrier(void) { volatile int j; NRF_CE_lo; NRF_WriteRegister(NRF_CONFIG, 0x00); for(j = 0; j < 500000; j++); NRF_WriteRegister(NRF_CONFIG, 0x02); NRF_WriteRegister(NRF_EN_AA, 0x00); NRF_WriteRegister(NRF_SETUP_RETR, 0x00); for(j = 0; j < 5000; j++); NRF_WriteRegister(NRF_RF_SETUP, 0x9E); NRF_WriteRegister(NRF_RF_CH, NODE_CH); NRF_CE_hi; }
void readPacket () { action = READING; NRF_WriteRegister(NRF_STATUS, 0x70); NRF_ReceivePayload(NRF_R_RX_PAYLOAD, NET_PACKET_SIZE, unReadData); printf("in readPacket: type: %d id: %d seq: %d time_to_live: %d\n",unReadData[0],unReadData[1],unReadData[2], unReadData[3]); int aux = process_for_routing (unReadData); NRF_SendCommand(NRF_FLUSH_RX, 0xFF); action = WAITING; if (aux == 0) {// we have a packet to forward if (unReadData[3] < 3) { unReadData[3]++; net_send_packet(unReadData); } } else { if (unReadData[2] > last_seq) { dataToRead = 1; last_seq = unReadData[2]; } } }
void NRF_reset_rx() { int i; //Read RX payload NRF_WriteCommand(0x61); for(i=0; i<NRF_PACKET_SIZE; i++) { gNRFPacket[i] = _spi_read(); } gNRFPacket[NRF_PACKET_SIZE] = 0; //Flush rx FIFO NRF_WriteCommand(0xE2); //Reset int NRF_WriteRegister(0x27, 0x40); NRF_Select(FALSE); }
void NRF_config_rf() { //auto retransmit off //NRF_WriteRegister(0x24, 0x00); //Disable auto act //NRF_WriteRegister(0x21, 0x00); //auto retransmit 15 times, delay 500us NRF_WriteRegister(0x24, 0x1F); //Auto act on at all pipe NRF_WriteRegister(0x21, 0x3F); //Address width = 5 NRF_WriteRegister(0x23, 0x03); //Data rate = 1MB NRF_WriteRegister(0x26, 0x07); //7 bytes Payload NRF_WriteRegister(0x31, NRF_PACKET_SIZE); //Set channel 2 NRF_WriteRegister(0x25, 0x02); //Set TX address E7E7E7E7E7 NRF_WriteCommand(0x30); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); //Set RX address E7E7E7E7E7 NRF_WriteCommand(0x2A); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); _spi_write(0xE7); NRF_Select(FALSE); }
void NRF_PowerUp(void) { NRF_WriteRegister(NRF_CONFIG, NRF_ReadRegister(NRF_CONFIG) | 0x02); }
void NRF_PowerDown(void) { GPIO->P[NRF_RXEN_PORT].DOUT &= ~(1 << NRF_RXEN_PIN); NRF_WriteRegister(NRF_CONFIG, NRF_ReadRegister(NRF_CONFIG) & (~0x02)); }
void NRF_SetupTX(void) { uint8_t addr_array[5]; NRF_CE_lo; NRF_WriteRegister(NRF_CONFIG, 0x0C); //NRF_WriteRegister(NRF_EN_AA, 0x3F); // AutoAcknowledge NRF_WriteRegister(NRF_EN_AA, 0x3F); NRF_WriteRegister(NRF_EN_RXADDR, 0x3F); // Receive Pipe 0 enabled NRF_WriteRegister(NRF_SETUP_RETR, 15); // Retransmits NRF_WriteRegister(NRF_SETUP_AW, 0x03); // Address Width (5 bytes) NRF_WriteRegister(NRF_RF_SETUP, 0x0F); // RF Setup //NRF_WriteRegister(NRF_RF_SETUP, 0x08); // -28dB NRF_WriteRegister(NRF_RF_CH, NODE_CH); // RF Channel NRF_WriteRegister(NRF_RX_PW_P0, 32); // RX Payload Width NRF_WriteRegister(NRF_FEATURE, 0x01); #if NODE_ID == 1 addr_array[0] = 0xE7; addr_array[1] = 0xE7; addr_array[2] = 0xE7; addr_array[3] = 0xE7; addr_array[4] = 0xE7; #else addr_array[0] = 0xC0 + NODE_ID; addr_array[1] = 0xC2; addr_array[2] = 0xC2; addr_array[3] = 0xC2; addr_array[4] = 0xC2; #endif NRF_WriteRegisterMulti(NRF_TX_ADDR, 5, addr_array); NRF_WriteRegisterMulti(NRF_RX_ADDR_P0, 5, addr_array); //NRF_WriteRegister(NRF_RX_ADDR_P1, 2); NRF_WriteRegister(NRF_STATUS, 0x7E); // Clear Interrupts //NRF_WriteRegister(NRF_CONFIG, 0x0E); // Power Up, Transmitter NRF_SendCommand(NRF_FLUSH_TX, 0xFF); NRF_WriteRegister(NRF_CONFIG, 0x0E); }
void net_init() { uint8_t addr_array[5] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7}; RXEN_hi; // enable amp NRF_CE_lo; NRF_WriteRegister(NRF_CONFIG, 0x3C); // Enable CRC and disable TX interrupts NRF_WriteRegister(NRF_EN_AA, 0x0); // Disable auto ACK NRF_WriteRegister(NRF_EN_RXADDR, 0x3F); // Receive Pipe 0 enabled NRF_WriteRegister(NRF_SETUP_RETR, 0); // Retransmits NRF_WriteRegister(NRF_SETUP_AW, 0x03); // Address Width (5 bytes) NRF_WriteRegister(NRF_RF_SETUP, bandwidth | power); // set up NRF_WriteRegister(NRF_RF_CH, channel); // RF Channel NRF_WriteRegister(NRF_RX_PW_P0, 16); // RX Payload Width NRF_WriteRegister(NRF_FEATURE, 0x01); NRF_WriteRegisterMulti(NRF_TX_ADDR, 5, addr_array); NRF_WriteRegisterMulti(NRF_RX_ADDR_P0, 5, addr_array); NRF_WriteRegister(NRF_STATUS, 0x7E); // Clear Interrupts NRF_SendCommand(NRF_FLUSH_TX, 0xFF); NRF_WriteRegister(NRF_CONFIG, 0x0E); recv_setup(); NRF_WriteRegister(NRF_STATUS, 0x70); // clear radio interrupts uint8_t status = NRF_ReadRegister(NRF_STATUS); if (status == 0x0E) { printf("Radio is ready\n"); } else { printf("Radio failed to initialize\n"); } }