Привет, датагорцы!
Выкладываю перевод таблиц из спецификации nRF24L01+, файл с пояснениями и исходники кодов, необходимые для организации радиосвязи между двумя трансиверами nRF24L01+.
Содержание статьи / Table Of Contents
↑ Условия организации радиосвязи между двумя трансиверами
Для того, чтобы два трансивера могли «увидеть» друг друга, необходимо обеспечить идентичность следующих их параметров:1. Несущая частота (регистр RF_CH, адрес – 0x05).
2. Скорость передачи данных (биты RF_DR_LOW, RF_DR_HIGH регистра RF_SETUP, адрес – 0x06)
3. RX-адрес приёмника (регистры RX_ADDR_P0-P5, адресa – 0x0A-0x0F) и TX-адрес передатчика (регистр TX_ADDR, адрес – 0x10). Кроме того, если используется авто-подтверждение, то RX_ADDR_P0 и TX_ADDR передатчика должны быть идентичны RX-адресу приёмника.
4. Ширина адреса (регистр SETUP_AW, адрес – 0x03)
5. Значение регистра RX_PW_Pn (адресa – 0x11-0x16) приёмника и длина отправляемых передатчиком данных. Последняя определяется количеством байт, записываемых после команды W_TX_PAYLOAD внутри одного передёргивания вывода CSN. Т.е., если предполагается обмен, к примеру, двухбайтовыми данными, то в регистр RX_PW_Pn приёмника записывается 2, а загрузка в стек TX_PLD передатчика производится следующим образом:
cbi(nRF_PORT, CSN_pin);
SPI_byte(W_TX_PAYLOAD);
SPI_byte(byte_1);
SPI_byte(byte_2);
sbi(nRF_PORT, CSN_pin);
6. В случае, если по одному и тому же каналу предполагается прём данных разной длины, выхода два:
а) Привести данные к единой, самой большой длине.
б) Разрешить для канала динамическую длину принимаемых данных (ДДПД). Для этого необходимо разрешить ДДПД глобально (бит EN_DPL регистра FEATURE адрес – 0x1D) и локально (регистр DYNPD адрес – 0x1С). Ширина поступивших данных определяется командой R_RX_PL_WID.
↑ Дополнительные условия для работы приёмника
1. По сбросу каналы приёма 5-2 закрыты, поэтому для их активации необходимо записать 1 в биты ERX_P5-2 регистра EN_RXADDR (адрес – 0x02).2. Запись команды W_REGISTER возможна только в режимах Power down и Standby, поэтому, прежде, чем менять содержимое регистров трансивера, находящегося в режиме приёмника (вывод CE – в 1), нужно, как минимум, сбросить вывод CE в 0.
↑ Описание базовых функций трансивера (файл nRF_base.h)
Большинство регистров nRF24L01+ - восьми-битные, поэтому для работы с ними можно использовать функции nRF_write_byte() и nRF_read_byte().Запись/чтения регистров большей длины производится с помощью функций nRF_write_array() и nRF_read_ array (). Для этого необходимо создать массив соответствующей длины и передать в функцию имя регистра/команды, имя массива, размер массива. Например, запись в FIFO передатчика трех-байтного слова происходит так:
uint8_t payload[3];
nRF_write_array(W_TX_PAYLOAD, payload, sizeof(payload));
а чтение из FIFO приёмника так:
uint8_t payload[3];
nRF_read_array(R_RX_PAYLOAD, payload, sizeof(payload));
Можно использовать указанные функции и для работы с одним байтом. В этом случае создается массив размером 1
uint8_t config[1] = (1<<EN_CRC) | (1<<PWR_UP) | (1<<PRIM_RX);
nRF_read_array(R_RX_PAYLOAD, config, sizeof(config));
либо просто переменная, но тогда в функции перед именем переменной ставится символ взятия адреса – амперсанд (&):
uint8_t config = (1<<EN_CRC) | (1<<PWR_UP) | (1<<PRIM_RX);
nRF_read_array(R_RX_PAYLOAD, &config, sizeof(config));
↑ Описание функций трансивера (файл nRF24L01.h)
nRF_soft_reset()В nRF24L01+ не предусмотрен аппаратный сброс, поэтому при сбросе управляющего МК в регистрах трансивера могут оставаться ранее записанные данные, что приведёт к сбоям в работе. Данная функция записывает в регистры nRF24L01+ значения столбца «Reset Value» карты регистров из даташита. Включена в состав функции nRF_init().
nRF_init()
Инициализирует протокол SPI, выдерживает 100 мс, необходимые согласно даташита трансивера и запускает функцию nRF_soft_reset().
↑ Организация и топология сети
Приведённых функций достаточно для организации сети. Количество трансиверов в сети практически не ограничено, поскольку можно варьировать частоту (126 комбинаций), адреса и их размер, длину передаваемых/принимаемых данных.В качестве одной ячейки сети можно рассматривать цепочку центр управления - посредник – управляемые модули. В этом случае, если не предусматривать обратную связь, трансивер ЦУ настраивается как приёмник, трансиверы модулей как передатчики, а трансивер посредника работает попеременно приёмником (принимая данные от модулей) и передатчиком (передавая данные ЦУ).
↑ Файлы
Все таблицы по nRF24L01+ на русском:🎁nrf24l01_tables.7z 33.83 Kb ⇣ 128
Исходники для nRF24L01+
🎁nrf24l01-codes.7z 2.23 Kb ⇣ 142
Спасибо за внимание!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.