This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF24L01+ PIC16F886 and Raspberry Pi

Im using the Raspberry Pi as my transmitter and PIC16F886 as my receiver. For the RasPi im using the library from TMRh20 and on the PIC side using code I got from various sources. I have the PIC side working (using one PIC as TX and two PICs as RXs and its working fine), but when trying to port the same settings to my RasPi, something seems to be missing.

The following is the code i get when i run the RasPi:

    ================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO22
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xf7f7f7f7f8 0xc2c2c2c2c2
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0xf7f7f7f7f8
RX_PW_P0-6       = 0x20 0x00 0x00 0x00 0x00 0x00
EN_AA            = 0x01
EN_RXADDR        = 0x03
RF_CH            = 0x55
RF_SETUP         = 0x0f
CONFIG           = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 2MBPS
Model            = nRF24L01
CRC Length       = 16 bits
PA Power         = PA_MAX

the following are the settings i have on my PIC side (the working TX code on the PIC which i want to copy to the RasPi side)

    void nrf24l01_initialize_custom(bool rx,
        unsigned char p0_payload_width,
        bool enable_auto_ack,
        unsigned char * rx_addr_p0,
        unsigned char * rx_addr_p1,
        unsigned char * tx_addr,
        unsigned char rf_channel)
{
    unsigned char data[5];
    unsigned char config;
    unsigned char en_aa;

    config = nrf24l01_CONFIG_DEFAULT_VAL | nrf24l01_CONFIG_PWR_UP;

    if(enable_auto_ack != false)
        en_aa = nrf24l01_EN_AA_ENAA_P0;
    else
        en_aa = nrf24l01_EN_AA_ENAA_NONE;

    if(rx == true)
        config = config | nrf24l01_CONFIG_PRIM_RX;

    data[0] = en_aa;
    nrf24l01_write_register(nrf24l01_EN_AA, data, 1);

    data[0] = nrf24l01_EN_RXADDR_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_EN_RXADDR, data, 1);

    data[0] = nrf24l01_SETUP_AW_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_SETUP_AW, data, 1);

    data[0] = nrf24l01_SETUP_RETR_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_SETUP_RETR, data, 1);

    if(rf_channel != NULL)
        data[0] = rf_channel;
    else
        data[0] = nrf24l01_RF_CH_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RF_CH, data, 1);

    data[0] = nrf24l01_RF_SETUP_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RF_SETUP, data, 1);

    if(rx_addr_p0 != NULL)
            nrf24l01_set_rx_addr(rx_addr_p0, 5, 0);
    else
    {
            data[0] = nrf24l01_RX_ADDR_P0_B0_DEFAULT_VAL;
            data[1] = nrf24l01_RX_ADDR_P0_B1_DEFAULT_VAL;
            data[2] = nrf24l01_RX_ADDR_P0_B2_DEFAULT_VAL;
            data[3] = nrf24l01_RX_ADDR_P0_B3_DEFAULT_VAL;
            data[4] = nrf24l01_RX_ADDR_P0_B4_DEFAULT_VAL;

            nrf24l01_set_rx_addr(data, 5, 0);
    }

    if(rx_addr_p1 != NULL)
            nrf24l01_set_rx_addr(rx_addr_p1, 5, 1);
    else
    {
            data[0] = nrf24l01_RX_ADDR_P1_B0_DEFAULT_VAL;
            data[1] = nrf24l01_RX_ADDR_P1_B1_DEFAULT_VAL;
            data[2] = nrf24l01_RX_ADDR_P1_B2_DEFAULT_VAL;
            data[3] = nrf24l01_RX_ADDR_P1_B3_DEFAULT_VAL;
            data[4] = nrf24l01_RX_ADDR_P1_B4_DEFAULT_VAL;

            nrf24l01_set_rx_addr(data, 5, 1);
    }

    data[0] = nrf24l01_RX_ADDR_P2_DEFAULT_VAL;
    nrf24l01_set_rx_addr(data, 1, 2);

    data[0] = nrf24l01_RX_ADDR_P3_DEFAULT_VAL;
    nrf24l01_set_rx_addr(data, 1, 3);

    data[0] = nrf24l01_RX_ADDR_P4_DEFAULT_VAL;
    nrf24l01_set_rx_addr(data, 1, 4);

    data[0] = nrf24l01_RX_ADDR_P5_DEFAULT_VAL;
    nrf24l01_set_rx_addr(data, 1, 5);

    if(tx_addr != NULL)
            nrf24l01_set_tx_addr(tx_addr, 5);
    else
    {
            data[0] = nrf24l01_TX_ADDR_B0_DEFAULT_VAL;
            data[1] = nrf24l01_TX_ADDR_B1_DEFAULT_VAL;
            data[2] = nrf24l01_TX_ADDR_B2_DEFAULT_VAL;
            data[3] = nrf24l01_TX_ADDR_B3_DEFAULT_VAL;
            data[4] = nrf24l01_TX_ADDR_B4_DEFAULT_VAL;

            nrf24l01_set_tx_addr(data, 5);
    }

    data[0] = p0_payload_width;
    nrf24l01_write_register(nrf24l01_RX_PW_P0, data, 1);

    data[0] = nrf24l01_RX_PW_P1_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RX_PW_P1, data, 1);

    data[0] = nrf24l01_RX_PW_P2_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RX_PW_P2, data, 1);

    data[0] = nrf24l01_RX_PW_P3_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RX_PW_P3, data, 1);

    data[0] = nrf24l01_RX_PW_P4_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RX_PW_P4, data, 1);

    data[0] = nrf24l01_RX_PW_P5_DEFAULT_VAL;
    nrf24l01_write_register(nrf24l01_RX_PW_P5, data, 1);

    if((config & nrf24l01_CONFIG_PWR_UP) != 0)
        nrf24l01_power_up_param(true, config);
    else
        nrf24l01_power_down_param(config);
Parents
  • I'm not sure I get what's wrong and what's not working. I would recommend you to try to narrow down what is working and what is not working. For example, on the transmitter side, check the VDD_PA pin. This pin will go up to 1.8 V when it's transmitting, so for the transmitter it should regularly go up to 1.8 V. It's a simple way to check that the transmitter at least is sending something.

    On the receiver, do you get any interrupts? Which ones? Do you see any 1.8 V on the VDD_PA pin on the receiver? This pin will go high when sending back the ACK.

Reply
  • I'm not sure I get what's wrong and what's not working. I would recommend you to try to narrow down what is working and what is not working. For example, on the transmitter side, check the VDD_PA pin. This pin will go up to 1.8 V when it's transmitting, so for the transmitter it should regularly go up to 1.8 V. It's a simple way to check that the transmitter at least is sending something.

    On the receiver, do you get any interrupts? Which ones? Do you see any 1.8 V on the VDD_PA pin on the receiver? This pin will go high when sending back the ACK.

Children
No Data
Related