Nrf не работает на максимальной мощности

ArGoNeOn

✩✩✩✩✩✩✩
15 Апр 2020
36
4
20
У меня радиомодуль nrf не работает на максимальной мощности, пои выставлении в минимум всё отрабатывает, кто нибудь встречался с такой проблемой и как решить её?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
Если внешняя антенна, и есть дополнительно усилитель, то такая плат лупит на километр с лишним. Нужно попробовать увеличить дистанцию.
Если усилителя нет, то дальность 300-500 метров.
Я запускал передатчик дома и с приёмником начал отходить. На 600м. появлялась связь. На 1200 начинало дурить.
У меня платы с внешней антенной и усилителем.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
@ArGoNeOn, У вас перегрузка приемника получается. Мощность нужно выставлять в соответствии с расстоянием: если на короткую дистанцию, то совсем не нужно лупить передатчиком на полную мощность.
Обычно чтобы определить нужную мощность используют обратную связь. В приемнике считывают уровень сигнала, и передают его в служебном пакете на сторону передатчика, а он уже выставляет уровень мощности на оптимальный уровень.
 

ArGoNeOn

✩✩✩✩✩✩✩
15 Апр 2020
36
4
20
@Геннадий П, у меня что то типо дистанционного пульта срабатывания, для авиамодели, чтобы её посадить, там всё идёт на разных расстояниях, получается, что надо сделать адаптивную мощность?

@Эдуард Анисимов, вчера пробовал отходить на 300 метров, надо похоже больше
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@ArGoNeOn,я делал автоматом мощность. Передатчик с приёмником по качеству связи сами регулируют мощность.
А вообще проверь ещё наличие конденсатора перед антенной на 1пФ. Лень гуглить,сам найди какой. Он роль нагрузки и согласования играет,без него хрень,а не связь.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@ArGoNeOn,когда только осваивать начал модули,то наткнулся на это https://aterlux.ru/article/nrf24l01p
Вкурил что к чему, почитал даташит,написал свои функции, ну и через пару недель мучений заработало ))
Я Ардуино IDE, как и язык Wiring не признаю. Только регистры,только хардкор.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@ArGoNeOn,ну вечерком-то скину отдельной библиотекой. По крайней мере можно будет понять как управляется nrf24. Надеюсь)))
И там у меня нет адаптивной регулировки мощности.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
nrf24.c:
#include"timer.h"
#include"Ship_main.h"

#define TXRXDELAY 140

#define PAUSE_US(x) {pause=(x/4U);while(pause--);}

volatile uint8_t *buffer;
uint8_t size_buf;
volatile uint16_t pause;



// Выбирает активное состояние (высокий уровень) на линии CE
void rf_assert_ce() {
  RADIO_PORT_CE |= (1 << RADIO_CE); // Установка высокого уровня на линии CE
}

// Выбирает неактивное состояние (низкий уровень) на линии CE
void rf_deassert_ce() {
  RADIO_PORT_CE &= ~(1 << RADIO_CE); // Установка низкого уровня на линии CE
}

// Поскольку функции для работы с csn не предполагается использовать в иных файлах, их можно объявить static
// Выбирает активное состояние (низкий уровень) на линии CSN
inline static void csn_assert() {
  RADIO_PORT_CSN &= ~(1 << RADIO_CSN); // Установка низкого уровня на линии CSN
}

// Выбирает неактивное состояние (высокий уровень) на линии CSN
inline static void csn_deassert() {
  RADIO_PORT_CSN |= (1 << RADIO_CSN); // Установка высокого уровня на линии CSN
}

// Инициализирует порты
void rf_init(volatile uint8_t *buf,uint8_t size) {
    RADIO_DDR_CE|=(1<<RADIO_CE);// Ножка CE на выход
    RADIO_DDR_IRQ&=~(1<<RADIO_IRQ);// IRQ - на вход
    csn_deassert();
    rf_deassert_ce();
    size_buf=size;
    buffer=buf;
}

// Выполняет команду cmd, и читает count байт ответа, помещая их в буфер buf, возвращает регистр статуса
uint8_t rf_read_buf(uint8_t cmd, volatile uint8_t * buf, uint8_t count) {
    csn_assert();
    uint8_t status = spi_send_recv(cmd);
    while (count--)
    {
        *(buf++) = spi_send_recv(0xFF);
    }
    csn_deassert();
    return status;
}

// Выполняет команду cmd, и передаёт count байт параметров из буфера buf, возвращает регистр статуса
uint8_t rf_write_buf(uint8_t cmd, volatile uint8_t * buf, uint8_t count)
{
    //usart_tx_line_cr("write buf...");
    csn_assert();
    uint8_t status = spi_send_recv(cmd);
    while (count--)
    {
        spi_send_recv(*(buf++));
    }
    csn_deassert();
    return status;
}

// Читает значение однобайтового регистра reg (от 0 до 31) и возвращает его
uint8_t rf_readreg(uint8_t reg) {
    //usart_tx_line_cr("readreg...");
    csn_assert();
    spi_send_recv((reg & 31) | R_REGISTER);
    uint8_t answ = spi_send_recv(0xFF);
    csn_deassert();
    return answ;
}

// Записывает значение однобайтового регистра reg (от 0 до 31), возвращает регистр статуса
uint8_t rf_writereg(uint8_t reg, uint8_t val) {
    csn_assert();
    //usart_tx_line_cr("writereg...");
    uint8_t status = spi_send_recv((reg & 31) | W_REGISTER);
    spi_send_recv(val);
    csn_deassert();
    return status;
}

// Читает count байт многобайтового регистра reg (от 0 до 31) и сохраняет его в буфер buf,
// возвращает регистр статуса
uint8_t rf_readreg_buf(uint8_t reg, volatile uint8_t * buf, uint8_t count) {
  return rf_read_buf((reg & 31) | R_REGISTER, buf, count);
}

// Записывает count байт из буфера buf в многобайтовый регистр reg (от 0 до 31), возвращает регистр статуса
uint8_t rf_writereg_buf(uint8_t reg, volatile uint8_t * buf, uint8_t count) {
    return rf_write_buf((reg & 31) | W_REGISTER, buf, count);
}

// Возвращает размер данных в начале FIFO очереди приёмника
uint8_t rf_read_rx_payload_width()
{
    csn_assert();
    spi_send_recv(R_RX_PL_WID);
    uint8_t answ = spi_send_recv(0xFF);
    csn_deassert();
    return answ;
}

// Выполняет команду. Возвращает регистр статуса
uint8_t rf_cmd(uint8_t cmd)
{
    csn_assert();
    uint8_t status = spi_send_recv(cmd);
    csn_deassert();
    return status;
}

// Функция производит первоначальную настройку устройства. Возвращает 1, в случае успеха, 0 в случае ошибки
uint8_t rf_start()
{
    uint8_t self_addr[]={0xB3,0xB4,0xB5,0xB6,0xF1}; // Собственный адрес
    uint8_t remote_addr[]={0x01,0x23,0x45,0x67,0x89}; // Адрес удалённой стороны
    uint8_t chan=115; // Номер радио-канала (в диапазоне 0 - 125)
    rf_deassert_ce();
    //этот цикл работает на реальном железе,но не в отладке
    for(uint8_t cnt = 100;;)
    {
        rf_writereg(CONFIG, (1 << EN_CRC) | (0 << CRCO) | (1 << PRIM_RX)); // Выключение питания
        if(rf_readreg(CONFIG)==((1<<EN_CRC)|(0<<CRCO)|(1<<PRIM_RX)))
               break;
         //Если прочитано не то что записано, то значит либо радио-чип ещё инициализируется, либо не работает.
        if (!cnt--) return 1; // Если после 100 попыток не удалось записать что нужно, то выходим с ошибкой
        }
    rf_writereg(ACTIVATE,0x73);
    rf_writereg(EN_AA,(1<<ENAA_P0)|(1<<ENAA_P1)); // включение автоподтверждения только по каналу 1 и 0
    rf_writereg(EN_RXADDR,(1<<ERX_P1)|(1<<ERX_P0)); // включение каналов 0 и 1
    rf_writereg(SETUP_AW,SETUP_AW_3BYTES_ADDRESS); // выбор длины адреса 5 байт
    rf_writereg(SETUP_RETR,SETUP_RETR_DELAY_250MKS | SETUP_RETR_NO_RETRANSMIT);
    rf_writereg(RF_CH,chan);// Выбор частотного канала
    rf_writereg(RF_SETUP,RF_SETUP_2MBPS|RF_SETUP_0DBM); // выбор скорости 2 Мбит/с и мощности 0dBm
    rf_writereg_buf(RX_ADDR_P0,&remote_addr[0], 5); // Подтверждения приходят на канал 0
    rf_writereg_buf(TX_ADDR,&remote_addr[0], 5);
    rf_writereg_buf(RX_ADDR_P1,&self_addr[0], 5);
    rf_writereg(RX_PW_P0,0);//устанавливаем длину пакетов данных канала 0
    rf_writereg(RX_PW_P1,SIZE_PACKET);//устанавливаем длину пакетов данных канала 1
    rf_writereg(DYNPD,0/[I](1<<DPL_P0)|(1<<DPL_P1)[/I]/);// запретить произвольную длину пакета
    rf_writereg(FEATURE,0/[I](1<<EN_ACK_PAY)[/I]/);
    rf_status_reset();
    rf_cmd(FLUSH_TX);
    rf_cmd(FLUSH_RX);
    rf_writereg(CONFIG,(1<<EN_CRC)|(1 << CRCO)|(1<<PWR_UP)|(1<<PRIM_RX));// Включение питания,приём
    if(rf_readreg(CONFIG)==((1<<EN_CRC)|(1<<CRCO)|(1<<PWR_UP)|(1<<PRIM_RX)))return 0; else return 2;
   
}

// Помещает пакет в очередь отправки.
// buf - буфер с данными, size - длина данных (от 1 до 32)

uint8_t check_rf()
{
    rf_deassert_ce();
    uint8_t result=1;
     uint8_t status=rf_status_reset();//сохраняем СТАТУС и сбрасываем флаги
    //если принят пакет,считываем его
    if(status&(1<<RX_DR)) result=on_packet();
    if(status&0b00001110) result=4;
     //настраиваем приём
       uint8_t conf = rf_readreg(CONFIG);
       rf_writereg(CONFIG, conf|(1<<PRIM_RX)); // Устанавливаем бит PRIM_RX: приём
       rf_assert_ce(); // Высокий уровень на линии CE переводит радио-чип в режим приёма
    //timer_on(TIME_RX,0,1);//перенастраиваем таймер на "длинный" промежуток
    return result;//приём
}

uint8_t rf_status_reset(void)//сброс флагов
{
    uint8_t status=rf_cmd(NOP);// Просто запишем регистр обратно,
    rf_writereg(STATUS,status); //тем самым сбросив биты прерываний
    return status;
}

void rf_rx_start(void)
{    //приём включен
    rf_deassert_ce();
    uint8_t conf = rf_readreg(CONFIG);
       rf_writereg(CONFIG, conf|(1<<PRIM_RX));
    rf_status_reset();
    rf_assert_ce();
}

void rf_rx_stop(void)
{
    rf_deassert_ce();
    uint8_t conf=rf_readreg(CONFIG);
    rf_writereg(CONFIG,(conf|(1<<PWR_UP)));
    rf_writereg(CONFIG,conf&~(1<<PRIM_RX));

}

void on_send_error(void)//что делать? Связи нет!!!
{
}
uint8_t on_packet(void)//Принимаем посылочку!)))
{
    rf_read_buf(R_RX_PAYLOAD, buffer, SIZE_PACKET);
    return 2;
}

uint8_t rf_irq_handler(void)
{
    uint8_t stat;
    stat=rf_readreg(STATUS);
    if(stat&(1<<RX_DR))
    {
        rf_read_buf(R_RX_PAYLOAD, buffer, SIZE_PACKET);
        rf_status_reset();
        rf_assert_ce();
    }
    return 0;
}

void rf_irq_init(void)
{
    DDRE&=~(1<<7);
    EICRB=(1<<ISC71);//прерывание по спаду
    EIMSK=(1<<INT7);//резрешаем прерывание INT7
}
nrf24.h:
#ifndef NRF24
#define NRF24 1
#include "io_nrf24.h"


void rf_assert_ce(void);
void rf_deassert_ce(void);
// Инициализирует порты
void rf_init(volatile uint8_t *,uint8_t);

// Выполняет команду cmd, и читает count байт ответа, помещая их в буфер buf, возвращает регистр статуса
uint8_t rf_read_buf(uint8_t, volatile uint8_t *, uint8_t);

// Выполняет команду cmd, и передаёт count байт параметров из буфера buf, возвращает регистр статуса
uint8_t rf_write_buf(uint8_t, volatile uint8_t *, uint8_t);

// Читает значение однобайтового регистра reg (от 0 до 31) и возвращает его
uint8_t rf_readreg(uint8_t);

// Записывает значение однобайтового регистра reg (от 0 до 31), возвращает регистр статуса
uint8_t rf_writereg(uint8_t, uint8_t);

// Читает count байт многобайтового регистра reg (от 0 до 31) и сохраняет его в буфер buf,
// возвращает регистр статуса
uint8_t rf_readreg_buf(uint8_t, volatile uint8_t *, uint8_t);

// Записывает count байт из буфера buf в многобайтовый регистр reg (от 0 до 31), возвращает регистр статуса
uint8_t rf_writereg_buf(uint8_t, volatile uint8_t *, uint8_t);

// Возвращает размер данных в начале FIFO очереди приёмника
uint8_t rf_read_rx_payload_width(void);

// Выполняет команду. Возвращает регистр статуса
uint8_t rf_cmd(uint8_t);

// Возвращает 1, если на линии IRQ активный (низкий) уровень.
uint8_t rf_is_interrupt(void);

uint8_t rf_status_reset(void);

//инициализация модуля NRF24
uint8_t rf_start(void);
uint8_t check_rf();//проверка статуса и выполнение действий
//отправка массива. 1-ок,2-ошибка
uint8_t send_data(volatile uint8_t *, uint8_t);
void on_send_error(void);//обработка ошибки числа попыток передачи
void rf_rx_start(void);
uint8_t on_packet(void);
uint8_t rf_irq_handler(void);
void rf_irq_init(void);

#endif
io_nrf24.h:
#ifndef IO_NRF24
#define IO_NRF24 1

/* Команды */

#define R_REGISTER          0x00 // + n Прочитать регистр n
#define W_REGISTER          0x20 // + n Записать регистр n
#define ACTIVATE              0x50
#define R_RX_PAYLOAD        0x61 // Принять данные данные из верхнего слота очереди приёмника.
#define W_TX_PAYLOAD        0xA0 // Записать в очередь передатчика данные для отправки
#define FLUSH_TX            0xE1 // Сбросить очередь передатчика
#define FLUSH_RX            0xE2 // Сбросить очередь приёмника
#define REUSE_TX_PL         0xE3 // Использовать повторно последний переданный пакет
#define R_RX_PL_WID         0x60 // Прочитать размер данных принятого пакета в начале очереди приёмника.
#define W_ACK_PAYLOAD       0xA8 // + p Записать данные для отправки с пакетом подтверждения по каналу p.
#define W_TX_PAYLOAD_NOACK  0xB0 // Записать в очередь передатчика данные, для отправки без подтверждения
#define NOP                 0xFF // Нет операции. Может быть использовано для чтения регистра статуса

/* Регистры */

#define CONFIG      0x00 // Регистр настроек
#define EN_AA       0x01 // Выбор автоподтверждения
#define EN_RXADDR   0x02 // Выбор каналов приёмника
#define SETUP_AW    0x03 // Настройка размера адреса
#define SETUP_RETR  0x04 // Настройка повторной отправки
#define RF_CH       0x05 // Номер радиоканала, на котором осуществляется работа. От 0 до 125.
#define RF_SETUP    0x06 // Настройка радиоканала
#define STATUS      0x07 // Регистр статуса.
#define OBSERVE_TX  0x08 // Количество повторов передачи и потерянных пакетов
#define RPD         0x09 // Мощность принимаемого сигнала. Если младший бит = 1, то уровень более -64dBm
#define RX_ADDR_P0  0x0A // 3-5 байт (начиная с младшего байта). Адрес канала 0 приёмника.
#define RX_ADDR_P1  0x0B // 3-5 байт (начиная с младшего байта). Адрес канала 1 приёмника.
#define RX_ADDR_P2  0x0C // Младший байт адреса канала 2 приёмника. Старшие байты из RX_ADDR_P1
#define RX_ADDR_P3  0x0D // Младший байт адреса канала 3 приёмника. Старшие байты из RX_ADDR_P1
#define RX_ADDR_P4  0x0E // Младший байт адреса канала 4 приёмника. Старшие байты из RX_ADDR_P1
#define RX_ADDR_P5  0x0F // Младший байт адреса канала 5 приёмника. Старшие байты из RX_ADDR_P1
#define TX_ADDR     0x10 // 3-5 байт (начиная с младшего байта). Адрес удалённого устройства для передачи
#define RX_PW_P0    0x11 // Размер данных при приёме по каналу 0: от 1 до 32. 0 - канал не используется.
#define RX_PW_P1    0x12 // Размер данных при приёме по каналу 1: от 1 до 32. 0 - канал не используется.
#define RX_PW_P2    0x13 // Размер данных при приёме по каналу 2: от 1 до 32. 0 - канал не используется.
#define RX_PW_P3    0x14 // Размер данных при приёме по каналу 3: от 1 до 32. 0 - канал не используется.
#define RX_PW_P4    0x15 // Размер данных при приёме по каналу 4: от 1 до 32. 0 - канал не используется.
#define RX_PW_P5    0x16 // Размер данных при приёме по каналу 5: от 1 до 32. 0 - канал не используется.
#define FIFO_STATUS 0x17 // Состояние очередей FIFO приёмника и передатчика
#define DYNPD       0x1C // Выбор каналов приёмника для которых используется произвольная длина пакетов.
#define FEATURE     0x1D // Регистр опций


/* Биты регистров */

// CONFIG
#define MASK_RX_DR  6 // Запрещает прерывание по RX_DR (получение пакета)
#define MASK_TX_DS  5 // Запрещает прерывание по TX_DS (завершение отправки пакета)
#define MASK_MAX_RT 4 // Запрещает прерывание по MAX_RT (превышение числа повторных попыток отправки)
#define EN_CRC      3 // Включает CRC
#define CRCO        2 // Размер поля CRC: 0 - 1 байт; 1 - 2 байта
#define PWR_UP      1 // Включение питания
#define PRIM_RX     0 // Выбор режима: 0 - PTX (передатчик) 1 - PRX (приёмник)

// EN_AA
#define ENAA_P5 5 // Включает автоподтверждение данных, полученных по каналу 5
#define ENAA_P4 4 // Включает автоподтверждение данных, полученных по каналу 4
#define ENAA_P3 3 // Включает автоподтверждение данных, полученных по каналу 3
#define ENAA_P2 2 // Включает автоподтверждение данных, полученных по каналу 2
#define ENAA_P1 1 // Включает автоподтверждение данных, полученных по каналу 1
#define ENAA_P0 0 // Включает автоподтверждение данных, полученных по каналу 0

// EN_RXADDR
#define ERX_P5 5 // Включает канал 5 приёмника
#define ERX_P4 4 // Включает канал 4 приёмника
#define ERX_P3 3 // Включает канал 3 приёмника
#define ERX_P2 2 // Включает канал 2 приёмника
#define ERX_P1 1 // Включает канал 1 приёмника
#define ERX_P0 0 // Включает канал 0 приёмника

// SETUP_AW
#define AW 0 // Два бита, Выбирает ширину поля адреса: 1 - 3 байта; 2 - 4 байта; 3 - 5 байт.

#define SETUP_AW_3BYTES_ADDRESS (1 << AW)
#define SETUP_AW_4BYTES_ADDRESS (2 << AW)
#define SETUP_AW_5BYTES_ADDRESS (3 << AW)

// SETUP_RETR
#define ARD 4 // 4 бита. Задаёт значение задержки перед повторной отправкой пакета: 250 x (n + 1) мкс
#define ARC 0 // 4 бита. Количество повторных попыток отправки, 0 - повторная отправка отключена.

#define SETUP_RETR_DELAY_250MKS  (0 << ARD)
#define SETUP_RETR_DELAY_500MKS  (1 << ARD)
#define SETUP_RETR_DELAY_750MKS  (2 << ARD)
#define SETUP_RETR_DELAY_1000MKS (3 << ARD)
#define SETUP_RETR_DELAY_1250MKS (4 << ARD)
#define SETUP_RETR_DELAY_1500MKS (5 << ARD)
#define SETUP_RETR_DELAY_1750MKS (6 << ARD)
#define SETUP_RETR_DELAY_2000MKS (7 << ARD)
#define SETUP_RETR_DELAY_2250MKS (8 << ARD)
#define SETUP_RETR_DELAY_2500MKS (9 << ARD)
#define SETUP_RETR_DELAY_2750MKS (10 << ARD)
#define SETUP_RETR_DELAY_3000MKS (11 << ARD)
#define SETUP_RETR_DELAY_3250MKS (12 << ARD)
#define SETUP_RETR_DELAY_3500MKS (13 << ARD)
#define SETUP_RETR_DELAY_3750MKS (14 << ARD)
#define SETUP_RETR_DELAY_4000MKS (15 << ARD)

#define SETUP_RETR_NO_RETRANSMIT (0 << ARC)
#define SETUP_RETR_UP_TO_1_RETRANSMIT (1 << ARC)
#define SETUP_RETR_UP_TO_2_RETRANSMIT (2 << ARC)
#define SETUP_RETR_UP_TO_3_RETRANSMIT (3 << ARC)
#define SETUP_RETR_UP_TO_4_RETRANSMIT (4 << ARC)
#define SETUP_RETR_UP_TO_5_RETRANSMIT (5 << ARC)
#define SETUP_RETR_UP_TO_6_RETRANSMIT (6 << ARC)
#define SETUP_RETR_UP_TO_7_RETRANSMIT (7 << ARC)
#define SETUP_RETR_UP_TO_8_RETRANSMIT (8 << ARC)
#define SETUP_RETR_UP_TO_9_RETRANSMIT (9 << ARC)
#define SETUP_RETR_UP_TO_10_RETRANSMIT (10 << ARC)
#define SETUP_RETR_UP_TO_11_RETRANSMIT (11 << ARC)
#define SETUP_RETR_UP_TO_12_RETRANSMIT (12 << ARC)
#define SETUP_RETR_UP_TO_13_RETRANSMIT (13 << ARC)
#define SETUP_RETR_UP_TO_14_RETRANSMIT (14 << ARC)
#define SETUP_RETR_UP_TO_15_RETRANSMIT (15 << ARC)

// RF_SETUP
#define CONT_WAVE   7 // (Только для nRF24L01+) Непрерывная передача несущей (для тестов)
#define RF_DR_LOW   5 // (Только для nRF24L01+) Включает скорость 250кбит/с. RF_DR_HIGH должен быть 0
#define PLL_LOCK    4 // Для тестов
#define RF_DR_HIGH  3 // Выбор скорости обмена (при значении бита RF_DR_LOW = 0): 0 - 1Мбит/с; 1 - 2Мбит/с
#define RF_PWR      1 // 2бита. Выбирает мощность передатчика: 0 - -18dBm; 1 - -16dBm; 2 - -6dBm; 3 - 0dBm

#define RF_SETUP_MINUS18DBM (0 << RF_PWR)
#define RF_SETUP_MINUS12DBM (1 << RF_PWR)
#define RF_SETUP_MINUS6DBM  (2 << RF_PWR)
#define RF_SETUP_0DBM       (3 << RF_PWR)

#define RF_SETUP_1MBPS (0 << RF_DR_HIGH)
#define RF_SETUP_2MBPS (1 << RF_DR_HIGH)
#define RF_SETUP_250KBPS (1 << RF_DR_LOW) // этот режим не должен использоваться с контролем доставки

// STATUS
#define RX_DR   6 // Флаг получения новых данных в FIFO приёмника. Для сброса флага нужно записать 1
#define TX_DS   5 // Флаг завершения передачи. Для сброса флага нужно записать 1
#define MAX_RT  4 // Флаг превышения установленного числа повторов. Без сброса (записать 1) обмен невозможен
#define RX_P_NO 1 // 3 бита. Номер канала, данные для которого доступны в FIFO приёмника. 7 -  FIFO пусто.
#define TX_FULL_STATUS 0 // Признак заполнения FIFO передатчика: 1 - заполнено; 0 - есть доступные слоты
        // (переименовано из TX_FULL во избежание путаницы с одноимённым битом из регистра FIFO_STATUS)

// OBSERVE_TX
#define PLOS_CNT  4 // 4 бита. Общее количество пакетов без подтверждения. Сбрасывается записью RF_CH
#define ARC_CNT   0 // 4 бита. Количество предпринятых повторов при последней отправке.

// FIFO_STATUS
#define TX_REUSE      6 // Признак готовности последнего пакета для повторной отправки.
#define TX_FULL_FIFO  5 // Флаг переполнения FIFO очереди передатчика.
        // (переименовано из TX_FULL во избежание путаницы с одноимённым битом из регистра STATUS)
#define TX_EMPTY      4 // Флаг освобождения FIFO очереди передатчика.
#define RX_FULL       1 // Флаг переполнения FIFO очереди приёмника.
#define RX_EMPTY      0 // Флаг освобождения FIFO очереди приёмника.

// DYNDP
#define DPL_P5 5 // Включает приём пакетов произвольной длины по каналу 5
#define DPL_P4 4 // Включает приём пакетов произвольной длины по каналу 4
#define DPL_P3 3 // Включает приём пакетов произвольной длины по каналу 3
#define DPL_P2 2 // Включает приём пакетов произвольной длины по каналу 2
#define DPL_P1 1 // Включает приём пакетов произвольной длины по каналу 1
#define DPL_P0 0 // Включает приём пакетов произвольной длины по каналу 0

// FEATURE
#define EN_DPL      2 // Включает поддержку приёма и передачи пакетов произвольной длины
#define EN_ACK_PAY  1 // Разрешает передачу данных с пакетами подтверждения приёма
#define EN_DYN_ACK  0 // Разрешает использование W_TX_PAYLOAD_NOACK

#endif
В принципе,тут вся информация. Но! Чтобы грамотно это использовать,нужно знать логику работы модуля.
В данном примере в главном коде нужно вызывать rf_irq_handler(void) с нужной периодичностью,либо как у меня при поступлении внешнего прерывания от модуля.
 
Изменено: