bool nrf_init(const NRF_SYS_CONFIG* pConfig) { if (pConfig == NULL) { return false; } if (!nrf_hal_init(pConfig->csPin, pConfig->cePin, pConfig->irqPin)) { return false; } nrf_ce_clear(); nrf_reg_write(NRF_REG_CONFIG, NRF_CONFIG_EN_CRC | NRF_CONFIG_CRCO | NRF_CONFIG_MASK_RX_DR | NRF_CONFIG_MASK_MAX_RT | NRF_CONFIG_MASK_TX_DS); nrf_reg_write(NRF_REG_STATUS, NRF_STATUS_RX_DR | NRF_STATUS_MAX_RT | NRF_STATUS_TX_DS); nrf_cmd_write(NRF_CMD_FLUSH_RX, NULL, 0); nrf_cmd_write(NRF_CMD_FLUSH_TX, NULL, 0); NRF_SETUP_RETR retrSetup = {0}; retrSetup.F.ARC = 3; retrSetup.F.ARD = NRF_ARD_500_US; nrf_reg_write(NRF_REG_SETUP_RETR, retrSetup.B); NRF_RF_SETUP rfSetup = { 0 }; rfSetup.F.RF_DR_LOW = (pConfig->bps == NRF_250K_BPS) ? 1 : 0; rfSetup.F.RF_DR_HIGH = (pConfig->bps == NRF_2M_BPS) ? 1 : 0; rfSetup.F.RF_PWR = 0x03; nrf_reg_write(NRF_REG_RF_SETUP, rfSetup.B); NRF_SETUP_AW setupAW = { 0 }; setupAW.F.AW = NRF_ADDRESS_SIZE - 2; nrf_reg_write(NRF_REG_SETUP_AW, setupAW.B); nrf_reg_write(NRF_REG_RX_ADDR_P0, pConfig->selfAddr.B, sizeof(pConfig->selfAddr.B)); NRF_RF_CH rfCh = { 0 }; rfCh.F.RF_CH = pConfig->channel; nrf_reg_write(NRF_REG_RF_CH, rfCh.B); nrf_reg_write(NRF_REG_RX_PW_P0, NRF_PACKET_SIZE); NRF_EN_RXADR enRxAddr = { 0 }; enRxAddr.F.ERX_P0 = 1; nrf_reg_write(NRF_REG_EN_RXADDR, enRxAddr.B); nrf_reg_write(NRF_REG_EN_AA, enRxAddr.B); nrf_standby(); return true; }
void Rf_Init() { nrf_init(); // disable TX_DS and MAX_RT interrupt nrf_reg_write(REG_CONFIG, MASK_TX_DS | MASK_MAX_RT | PWR_UP); // clear any existing RX/TX payload nrf_flush_rx(); nrf_flush_tx(); // clear any pending RX/TX interrupt flags nrf_reg_write(REG_STATUS, RX_DR| TX_DS | MAX_RT); // disable auto-acknowledge feature nrf_reg_write(REG_EN_AA, 0); // enable only P0 RX channel nrf_reg_write(REG_EN_RXADDR, 0x01); #ifdef __NRF24L01P // 250kbps, max RF power nrf_reg_write(REG_RF_SETUP, 0x27); #else // 1Mbps, max RF power, LNA gain nrf_reg_write(REG_RF_SETUP, 0x07); #endif // RF channel nrf_reg_write(REG_RF_CH, g_sysConfig.channel); // make sure 5 bytes address length nrf_reg_write(REG_SETUP_AW, sizeof(g_sysConfig.rxAddr) - 2); // disable retry nrf_reg_write(REG_SETUP_RETR, 0); // fixed packet size nrf_set_rx_payload_length(sizeof(PACKET)); // initialize rx_addr to be whatever in the system configuration nrf_set_rx_addr(g_sysConfig.rxAddr, sizeof(g_sysConfig.rxAddr)); // standby mode nrf_standby(); // dump registers nrf_test_dump_reg(); }
bool nrf_send_packet(const NRF_ADDR* targetAddr, const uint8_t* data) { if (targetAddr == NULL || data == NULL) { return false; } nrf_standby(); nrf_set_tx_addr(targetAddr->B, sizeof(targetAddr->B)); nrf_cmd_write(NRF_CMD_W_TX_PAYLOAD, data, NRF_PACKET_SIZE); nrf_ce_pulse(NRF_CE_PULSE_DELAY_US); if (nrf_wait_irq(NRF_TX_WAIT_MS)) { uint8_t status = nrf_reg_read(NRF_REG_STATUS); nrf_reg_write(NRF_REG_STATUS, NRF_STATUS_TX_DS | NRF_STATUS_MAX_RT); if (status & NRF_STATUS_TX_DS) { return true; } else if (status & NRF_STATUS_MAX_RT) { nrf_cmd_write(NRF_CMD_FLUSH_TX, NULL, 0); return false; } else { nrf_debugPrint("Unexpected status in sending packet:"); nrf_debugDumpBytes(&status, sizeof(status)); nrf_debugPrint("\r\n"); } } else { nrf_debugPrint("Sending timeout\r\n"); } return false; }
/* This blocks for up to ms_to_wait. */ uint8_t nrf_receive (nrf_t nrf, nrf_node_t *node, void *buffer, uint8_t len, uint8_t ms_to_wait) { nrf_obj_t *dev = nrf; uint8_t packet_length = 0; uint8_t i; /* Changing channel requires a one byte configure. */ nrf_channel_set (dev, node->rx.channel); /* Changing the address requires a full configure. */ nrf_address1_set (dev, &node->rx.address); /* Changing direction requires a one byte configure. */ nrf_dir_set (dev, NRF_RX_MODE); nrf_configure (dev, NRF_CONFIGURATION_REGISTER_SIZE); /* Start receiving. */ nrf_enable (dev); for (i = 0; i < ms_to_wait && !NRF_DATA_READY_P (dev); i++) delay_ms (1); if (!NRF_DATA_READY_P (dev)) return 0; /* Data is available, clock it out into the buffer. */ packet_length = nrf_payload_length1_get (dev); if (len > packet_length) len = packet_length; spi_read (dev->spi, buffer, len, 1); nrf_standby (dev); return packet_length; }