Esempio n. 1
0
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;
}
Esempio n. 2
0
File: rf.cpp Progetto: HclX/MSP430
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();
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
/* 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;
}