Перейти к содержанию
    

nRF24L01+ двусторонняя связь

Здравствуйте, Уважаемые форумчане.

 

Приходится просить помощи, т.к. что-то не так, а что не пойму.

Пытаюсь организовать двустроннюю связь на модулях nRF24L01+ и натыкаюсь на какой-то глюк.

По алгоритму каждый модуль постоянно находится в режиме приёма, и всё, что принял - отправляет на UART (управление на Atmega8).

По таймеру, примерно каждые 90мс, модуль переключается в режим передачи и отправляет посылку (другому), после передачи переключается обратно на приём. Прошивка одинаковая.

При включении питания фактически передача не происходит в течении примерно 16с! Хотя попытки отправки есть. Но другой модуль ничего не ловит.

Если ставлю при включении питания дополнительную задержку в 16с (перед инициализацией модуля), то по прошествии этой задержки, модули передают (и принимают) пакеты сразу.

 

Прошу подсказать, где косяк.

Спасибо.

 

Вот инициализация:

sleep(NRF_TURN_ON_DELAY);                                                                       // ожидание, пока заведётся генератор
// sleep(16000);
nrf24l01p_get_clear_irq_flags();                                                                    // чтение и очистка флагов прерываний
nrf24l01p_close_pipe(NRF24L01P_ALL);                                                         // закрыть все ТРУБЫ
nrf24l01p_open_pipe(NRF24L01P_TX, false);                                                  // открыть ТРУБУ TX 0, без автоподтверждения
nrf24l01p_open_pipe(NRF24L01P_PIPE0, false);                                              // открыть ТРУБУ 0, без автоподтверждения
nrf24l01p_set_crc_mode(NRF24L01P_CRC_16BIT);                                         // выбрать режим CRC16
nrf24l01p_set_auto_retr(0,250);                                                                    // запретить АВТОРЕТРАНСМИССИИ
nrf24l01p_set_address_width(NRF24L01P_AW_5BYTES);                                 // выбрать ширину АДРЕСА в байтах
nrf24l01p_set_address(NRF24L01P_TX, address);                                           // установить АДРЕС передатчика
nrf24l01p_set_address(NRF24L01P_PIPE0, address);                                       // установить АДРЕС приёмника 
nrf24l01p_set_operation_mode(NRF24L01P_PRX);                                          // установить режим работы (PRX или PTX)
nrf24l01p_set_rx_payload_width(NRF24L01P_PIPE0, NRF_PAYLOAD_LENGTH); // установить РАЗМЕР ДАННЫХ для ТРУБЫ

nrf24l01p_set_rf_channel(NRF_CHANNEL);                                                     // выбрать КАНАЛ
nrf24l01p_set_power_mode(NRF24L01P_PWR_UP);                                         // включить трансивер
sleep(NRF_POWER_UP_DELAY);                                                                     // ожидание пока перейдёт в режим STANDBY

 

Передача сделана так:

 cbi(CE_pin);                                                                                                // установить на CE лог. 0
 nrf24l01p_set_operation_mode(NRF24L01P_PTX);                                          // переключить на передачу
 strcpy(payload, test_data);                                                                           // загрузить данные для отправки
 nrf24l01p_write_tx_payload(payload, NRF_PAYLOAD_LENGTH);                      

 sbi(CE_pin); sleep(1); delay_us(10); cbi(CE_pin);                                          // сделать импульс на CE
 delay_us(50);   delay_us(50);   delay_us(35);                                                // ожидание 135 мкс

 // подождать окончания передачи и очистить соответствующий флаг
 while (!(nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_TX_DS)));
 nrf24l01p_clear_irq_flag(NRF24L01P_IRQ_TX_DS);

 nrf24l01p_set_operation_mode(NRF24L01P_PRX);                                         // перейти на приём
 sbi(CE_pin);                                                                                                // установить на  CE лог. 1

 delay_us(50);   delay_us(50);   delay_us(35);                                               // задержка 135 мкс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. В данное время я как раз работаю с модулями RFM73, они сходны с вашими более современными. Я так вам скажу, что этот орешек крепок, пришлось не мало попотеть, чтобы его расколоть... Вы Банк 1 не загружаете? А адреса приёма и передачи у вас одинаковы? Если вы используете адрес канала ноль то адреса приёма и передачи лучше не загружать а использовать по умолчанию. А как вы контролируете что информация пришла? Я например проверяю FIFO приёмника на пустоту, и если он не пуст тогда считываю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про Банк 1 не в курсе - в даташите не видел (этот модуль без внутреннего контроллера (управляется atmega по SPI).

Адреса назначил одинаковые для передачи и на Pipe 0 для приёма. Проверяю, что информация пришла так:

 

if((nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_RX_DR)))

 

Каждое отправляемое сообщение имеет свой номер, который передаётся, т.о. контролируется передача сообщений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...