реклама на сайте
подробности

 
 
> nRF24L01+ двусторонняя связь
Ioann_II
сообщение Mar 5 2018, 02:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



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

Приходится просить помощи, т.к. что-то не так, а что не пойму.
Пытаюсь организовать двустроннюю связь на модулях nRF24L01+ и натыкаюсь на какой-то глюк.
По алгоритму каждый модуль постоянно находится в режиме приёма, и всё, что принял - отправляет на UART (управление на Atmega8).
По таймеру, примерно каждые 90мс, модуль переключается в режим передачи и отправляет посылку (другому), после передачи переключается обратно на приём. Прошивка одинаковая.
При включении питания фактически передача не происходит в течении примерно 16с! Хотя попытки отправки есть. Но другой модуль ничего не ловит.
Если ставлю при включении питания дополнительную задержку в 16с (перед инициализацией модуля), то по прошествии этой задержки, модули передают (и принимают) пакеты сразу.

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

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

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


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

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 мкс
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 23:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016