Эксперименты подключения esp32 и платы XL1278-SMT
Реализовать генератор AIS подобного сигнала на базе XL1278-SMT для отладки AIS приемника
- Операционная система Ubuntu Ubuntu 24.04.3 LTS
- Visual Studio Code v1.108.2 с Platformio v 3.3.4
- EasyEDA онлайн IDE для разработки радиосхем
- Плата ESP32 doit-devkit-v1
- Плата XL1278-SMT с радиочипом SX1278
*выводы DIO3, DIO4, DIO5 платы xl1278 не задействованы
-
Припаиваем SMA разъем и Dupont-провода на плату. Неприятным открытием стало, что многие Dupont-провода по факту сделаны из омедненного алюминия или стали и паяются очень плохо.

-
Соединяем монтажные платы, вполне стандартная распиновка подключения шины SPI (VSPI) для ESP32. Не стоит подключать произвольные GPIO ESP32 к периферии, так как часть из них используется при загрузке чипа и может влиять на стабильность работы схемы: "GPIO0, GPIO2, GPIO5, MTDI (GPIO 12), and MTDO (GPIO15) are strapping pins", см 1.3.9 Strapping Pins

-
Почти весь код написан с помощью бесплатной версии ChatGPT без использования библиотек: прямое управление SX1278 через регистры по шине SPI. Был приятно удивлен, что код ChatGPT вполне рабочий, особенно, если добавить в промт условия о реальности работы схемы, использования таймингов, задержек и тп.
В коде реализована подготовка пакета с двумя байтами данных (0x00, 0xFF) с AIS преамбулой, HDLC флагами, расчетом CRC, кодированием NRZI. Далее идет RF-передача примерно раз в 2 секунды подготовленного пакета на частоте 162 МГц с заданной минимальной мощностью +2 дБм (аппаратные ограничения PA в SX1278) и параметрами близкими к реальному сигналу AIS . Не забываем о порядке бит в байте в пакете AIS - должен быть LSB (младший бит вначале).
Параметр BT Гауссовского фильтра - произведение ширины полосы пропускания фильтра на длительность одного бита (Bandwidth-Time product) установлен BT=0.3, а не 0.4 как необходимо для AIS из-за аппаратных ограничений чипа SX1278 (может выбираться из ряда 0.3, 0.5 или 1.0). Битрейт для AIS R = 9600 бит/с, индекс модуляции GMSK h = 0.5 (не путать с параметром BT), девиация частоты: f = h * R/2 = 0.5 * 9600/2 = 2.4 кГц (размах девиации частоты 2 * 2.4 кГц = 4.8 кГц). См так же ITU-R M.1371-1 п 2.4.1 "GMSK" и п 2.4.2 "Frequency modulation".
Более подробно AIS сигнал разбирали здесь.
Сделаю оговорку, что код и сама конструкция НЕ является "production ready", а сделаны лишь для удобства отладки приемника AIS и изучении работы с чипом SX1278.
-
Проверяем наличие и параметры сигнала на спектроанализаторе Rigol RSA3015N. Реальная частота ощутимо отличается от ожидаемой 162 МГц ровно: ~162.09 МГц. Это связано с ошибкой округления при записи частоты в регистр SX1278, по факту устанавливается частота ~162.09332 МГц с шагом ~61.035156 Гц. Уровень сигнала без аттенюатора составил около -7,3 дБм при установленном в коде +2 дБм. Т.е. затухание в RF цепях составило порядка 10 дБ. Ожидал более существенных значений. Похоже, на RF-фильтрах платы XL1278-SMT сильно сэкономили. Уровня сигнала с большим запасом достаточно для отладки. Добавил в схему дополнительный аттенюатор на 30 дБ, чтобы не "оглушать" приемник.

-
Проводим запись IQ сигнала с платы XL1278-SMT с помощью приемника Малахит, как описано здесь. Полученная запись IQ сигнала с частотой дискретизации 192 кГц находится здесь.

-
Проводим извлечения полезных данных из IQ сигнала, как делали с реальным сигналом AIS с помощью GNU Radio (GRC). Не забываем в пайплайне GRC скорректировать значение изменение переноса частоты в FIR фильтре, установить в пределах ± пары килогерц и уменьшить минимальную длину пакета в HDLC Deframer до 2 байт. Убеждаемся, что стабильно детектируется преамбула AIS (24 бита 0101..01) и извлекаются данные (0x00, 0xFF) из HDLC пакетов с проверкой CRC.

- Техническая спецификация AIS ITU-R M.1371-1
- Даташит SX1278

