![](https://habrastorage.org/getpro/habr/upload_files/ff9/603/99c/ff960399c0adf9b73fe88006cd967155.png)
Быстрый Wi-Fi позволяет собрать больше диагностической информации, а значит облегчает отладку, поддержку и открывает путь к машинному обучению в ПЛК и во встраиваемых устройствах. Но кроме быстрого Wi-Fi модуля нужен ещё быстрый драйвер на стороне микроконтроллера. Здесь покажем процесс портирования открытого проекта Infineon Wi-Fi Host Driver (WHD) на нашу платформу универсального ПЛК PLCS7.
PLCS7 использует модуль S7V30 (32 МБ SDRAM, LoRA, BLE, Wi-Fi a/b/g/n, uSD, USB HS, IMU, NV RTC, Li-ion Charger, 81 свободных входов-выходов, 22 из них аналоговые 12-битные , потребление 7 мкА в пробуждаемом будильником сне), а тот в свою очередь выполнен на базе микроконтроллера R7FS7G27H2A01CBD (ядро ARM Cortex-M4, 240 МГц, 640 КБ RAM, 4 МБ Flash) серии S7G2 семейства Renesas Synergy. Портировать будем на эту платформу.
Проект WHD реализует драйвер на стороне хоста для коммуникации с чипами фирмы Infineon семейства AIROC™ Wi-Fi . Раньше эти чипы разрабатывались в Cypress Semiconductors, а ещё раньше в Broadcom. Т.е. архитектурное ядро семейства достаточно освоенное и стабильное. Коммуникация может осуществляться через интерфейсы: SDIO, USB, SPI.
Когда Cypress приобрёл права на семейство, он выпустил открытый проект драйвера для микроконтроллеров не привязанный к Линуксу под названием WICED. Драйвер быстро приобрёл популярность и сейчас включён в такие экосистемы как mbed и Amazon FreeRTOS.
Семейство AIROC включает множество чипов и на них производится большое количество разных модулей сторонними фирмами. Мы остановили своё внимание на чипах из ветви Wi-Fi 5 (802.11ac). Кроме Wi-Fi они содержат и Bluetooth . Не все чипы поддерживаются драйвером WHD, для этого нужно смотреть таблицу.
Наиболее быстрый интерфейс в микроконтроллерах для общения с Wi-Fi чипами в драйвере WHD - это SDIO. Поэтому выбираем чип имеющий SDIO на борту. Конкретно останавливаем свой выбор на CYW4373.
Чипы CYW4373 имеют следующие характеристики:
Wi-Fi 5 (802.11ac), двух диапазонные (2.4/5 GHz).
Градация скоростей в соответствии со спецификацией IEEE 802.11 a/b/g/n/ac
Одна антенна на приём и передачу. 1x1 SISO
Ширина частотных каналов 20/40/80 МГц
До 433 Мбит/сек. физическая скорость передачи.
Внутренние усилители мощности (PA) и приёмные усилители (LNA) и поддержка внешних усилителей
Наличие Bluetooth 5.4 и работа в режимах Class 1 (100 метров) and Class 2 (10 метров)
Bluetooth и Wi-Fi работают на одну общую антенну
Внешний интерфейс Wi-Fi: SDIO v3.0 (DDR50 50 МГц, SDR104 208 МГц), 4-битная или 1-битная конфигурация или USB 2.0 HS (480 Мбит/сек.)
Внешний интерфейс Bluetooth: HCI через UART (4 Мбит/сек.)
![Wi-Fi модуль LWB5PLUS 453-00045C размещённый на нашей плате S7V30 Wi-Fi модуль LWB5PLUS 453-00045C размещённый на нашей плате S7V30](https://habrastorage.org/getpro/habr/upload_files/8f3/ce8/40f/8f3ce840f514153da7c2a93b3c22c9e5.png)
Выбрав чип выбираем модуль с ним. Почему модуль? Дело в том, что просто взять чип и разработать плату с ним в принципе можно, открытой документации для этого достаточно. Но эти чипы ещё требуют подгружаемую прошивку. Прошивка должна сопровождаться калибровочными константами соответствующими частотным характеристикам полученной платы. А вот это уже сделать слишком дорого для малобюджетного и не профильного разработчика.
Как следствие мы должны искать модуль обеспеченный подгружаемой прошивкой совместимой с драйвером хоста. Для CYW4373 в проекте WHD есть на выбор прошивки для трех модулей. Мы выбрали модуль LWB5PLUS 453-00045C с встроенной антенной. Непосредственно бинарник прошивки находится здесь. Кроме него надо загружать настройки специфичные для модуля и файл CLM (Country Locale Matrix) с базой данных допустимых мощностей, частот, каналов по странам и регионам.
Прошивка и остальные файлы загружаются в модуль LWB5PLUS 453-00045C по интерфейсу SDIO после каждой подачи питания. Несмотря на то что прошивка имеет размер около 600 Кбайт загрузка всех файлов и полная инициализация модуля занимает не более 0.2 сек. Подключение с точке доступа занимает около 4 сек.
Чтобы было не скучно, я сразу встроил порт драйвера в полезное приложение для тестирования скорости связи по Wi-Fi с использованием известной утилиты IPerf.
Приложение и драйвер работают под управление Azure RTOS. Под эту RTOS (тогда называлась ThreadX) драйвер был изначально портирован фирмой Infineon. Но он был под микроконтроллеры STM32, а у нас другая платформа и придётся кое-что переделать.
Репозитарий проекта находится здесь.
Архитектура драйвера дана ниже
![](https://habrastorage.org/getpro/habr/upload_files/2aa/e57/0a3/2aae570a3d8b51b78b1a8300db0af4bc.png)
То что обведено синим нам достаётся из RTOS. В нашем случае из Azure RTOS. То что обведено красным нам надо написать самим или позаимствовать в других источниках и откорректировать. Чёрное - это то что содержат исходники драйвера.
Портирование заключается в реализации нескольких десятков требуемых драйверу функций в файле WiFi_Host_Driver_Port.c и реализации двух функций связи драйвера со стеком NetX Duo операционной системы: функции приёма пакетов от драйвера и пересылки их в NetX Duo - WHD_network_process_ethernet_data и функции приёма пакетов от NetX Duo и пересылки их в драйвер - WHD_NetXDuo_driver_entry. Особо требует внимания вариант работы драйвера, когда Wi-Fi модуль выполняет функции и точки доступа и станции одновременно.
На быстродействие больше всего влияет реализация функций получения и отправки блоков данных функцией cyhal_sdio_bulk_transfer. Здесь мы сталкиваемся с необходимостью использования драйвера SDIO из пакета Renesas Synergy™ Software Package, поскольку используя программные модули этого пакета организуется взаимодействие с периферией микроконтроллеров семейства Synergy. Поставляемый драйвер не оптимизирован по быстродействию, особенно обработчики прерываний. Поэтому обработчики прерываний были переписаны и вынесены в файл SDIO1.c. В стальном используются сервисы драйвера SDIO.
Выбранная частота ядра микроконтроллера в 240 МГц не позволяет выставить на шине SDIO стандартную частоту в 50 МГц, поэтому пришлось вмешаться в стандартный драйвер SDIO и установить частоту 60МГц. Длительные тесты показали, что на работоспособность модуля и SD карты это не повлияло.
Сами исходники драйвера WHD я тоже немного изменил. Главное изменение в аргументах функций создания семафоров и флагов (cy_rtos_init_semaphore и cy_rtos_init_event). В исходный текстах они создавались анонимными, без имён. В сложной программной системе иметь множество объектов RTOS без имён обременит отладку. Ещё понадобилось переопределить функции выделения динамической памяти в файле cybsp.h. Так как изменился порядок работы с прерываниями, то были внесены изменения в функции драйвера whd_bus_sdio_packet_available_to_read и whd_thread_init. Были добавлены строки для дополнительных отладочных сообщений. Отладочный вывод разрешается если закоментировать макрос #define WHD_PRINT_DISABLE
Детализированный лог обмена пакетами был реализован и в файле WiFi_Host_Driver_Port.c. Вывод отладочной информации осуществляется в порт RTT отладочного движка ARM-Cortex M. Для активизации отладочного вывода надо объявить макрос #define DEBUG_RTT_PRINT
Несколько замечаний по работе модуля Wi-Fi
Модуль Wi-Fi двух-диапазонный, но не на каждом диапазоне он может обеспечить заявленную максимальную скорость. Максимальная скорость достигается только на диапазоне 5 ГГц и только в режиме станции. Когда мы выбираем режим точки доступа, то при назначении канала можем выбирать только из диапазона 2.4 ГГц (1 2 3 4 5 6 7 8 9 10 11).
Несмотря на то что в хидерах драйвера модуля можем найти почти все страны мира для корректного выбора своего региона, модуль может отказаться работать со многими из них.
Перевод SDIO в 1-битный режим.
Некоторые чипы Synergy поддерживают второй SDIO только в 1-битном режиме (первый SDIO у нас всегда занят SD картой). Для того чтобы переключиться в 1-битный режим нужно сделать изменения в двух местах: в файле SDIO1.c поменять установку на 1-битный интерфейс и в файле WiFi_network.c поменять флаг g_whd_sdio_cfg.sdio_1bit_mode на WHD_TRUE. Как покажут тесты ниже, 1-битный режим совсем не так плох и при нем производительность Wi-Fi канала не падает в 4-е раза.
Настройка и вывод в отладочный терминал
Чтобы устройство сконфигурировать для работы через Wi-Fi используется отладочный терминал через USB интерфейс.
Настройки позволяют выбрать режим Wi-Fi: станция или точка доступа. В режиме точки доступа можно выбрать частотный канал. В настройках устанавливаются также логины и пароли. Во всех режимах устройство может либо использовать DHCP или статические адреса. Для удобства поиска устройства в сети, если оно работает как станция в приложении активируется протокол mDNS и к устройству можно обращаться по доменному имени S7V30.
![](https://habrastorage.org/getpro/habr/upload_files/7a0/109/d3e/7a0109d3e2e6baf10873856b8b2e0ba5.png)
Устройство помимо непосредственно приложения IPerf обслуживает также встроенный FTP сервер, клиента точного времени по протоколу NTP, сервер Telnet с таким же окном терминала как и через USB, сервер FreeMaster, клиента MQTT, сервер протокола связи с MATLAB.
В терминале также можно посмотреть статистику событий в драйвере WHD.
![Окно в терминале с версией прошивки Wi-Fi модуля и статистикой драйвера WHD Окно в терминале с версией прошивки Wi-Fi модуля и статистикой драйвера WHD](https://habrastorage.org/getpro/habr/upload_files/8be/d8c/9f2/8bed8c9f2a2c53ced231520f93108fd2.png)
Тестирование с помощью утилиты IPerf
Для тестирования скорости соединения по TCP и UDP в обоих направлениях воспользуемся утилитой IPerf и оконной оболочкой под неё jperf-2.0.2.
В программе устройства реализован клиент и сервер для IPerf, управление выполняется с WEB страницы устройства
![Жёлтым цветом подсвечены команды, при нажатии на которые начинается соответствующий тест Жёлтым цветом подсвечены команды, при нажатии на которые начинается соответствующий тест](https://habrastorage.org/getpro/habr/upload_files/080/e76/093/080e76093b49e4a2d225dd350d71b474.png)
![Окно утилиты jperf Окно утилиты jperf](https://habrastorage.org/getpro/habr/upload_files/3db/fd2/a69/3dbfd2a69f64a762e82c09466e890a9e.png)
В броузере открываем управляющую страницу теста со стороны устройства, на компьютере запускаем утилиту jperf. Если на устройстве включаем отсылку (Transmit test), то в утилите выбираем режим сервера. Важно правильно указать IP адреса и следить за отсутствием блокировки со стороны файрволла на компьютере.
Результаты IPerf
Результаты при передаче через RNDIS. Проверочный тест через проводной канал USB. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1
![](https://habrastorage.org/getpro/habr/upload_files/1eb/3b4/030/1eb3b403044c7c7f8ff7146152917909.png)
Результаты при передаче по Wi-Fi в режиме точки доступа на канале 10. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1
![](https://habrastorage.org/getpro/habr/upload_files/e7e/5a9/d23/e7e5a9d23ba8ff7678ea2cdecfb993b2.png)
Результаты при передаче по Wi-Fi в режиме станции на диапазоне 5 ГГц. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1. Работа SDIO в 4-битном режиме
![](https://habrastorage.org/getpro/habr/upload_files/f53/626/be8/f53626be8ac5ac6d67fce6f1b1e5e642.png)
Результаты при передаче по Wi-Fi в режиме станции на диапазоне 5 ГГц. Компиляция проекта с максимальной оптимизацией по скорости в среде IAR 9.50.1. Работа SDIO в 1-битном режиме
![](https://habrastorage.org/getpro/habr/upload_files/213/dc2/6c9/213dc26c94d586556ab8a651bd1d93e8.png)
Кстати, если попытаться измерить скорость скачивания со встроенного FTP сервера устройства, то получим совсем не выдающийся результат в 20 Мбит в сек. Это можно объяснить тем, что в стеке NetX Duo из проекта Azure RTOS не делается усилий по оптимизации исходников по скорости. Там больше уделяется внимания переносимости исходников между платформами, поскольку это растущий мультиплатформенный проект. И встроенный сервер FTP не умеет одновременно читать файлы с SD карты и передавать пакеты по Wi-Fi, он это делает по очереди. Если эти процессы разбить на отдельные задачи, то удаётся скорость FTP поднять почти до скорости показываемой в IPerf.
Тестирование протокола FreeMaster
FreeMaster - это наш любимый отладочный протокол для дистанционного наблюдения за устройствами в реальном времени с высокой частотой дискретизации. Чтобы устройство в Wi-Fi сети было найдено клиентской программой FreeMaster ему даже не надо иметь включённый сервис mDNS. Программа сразу находит устройство
![](https://habrastorage.org/getpro/habr/upload_files/ce9/823/f80/ce9823f80eb46681584618f070a9dcd1.png)
Далее конфигурируем на вывод графика загрузки процессора.
![](https://habrastorage.org/getpro/habr/upload_files/2ff/ca9/a9f/2ffca9a9ffbabfa1ce33e9690db3c000.gif)
Как видно при вывод потока во FreeMaster через Wi-Fi занимает у процессора всего 4% времени включая работу сервисов RTOS.
Итог
Нам удалось получить стабильный поток через Wi-Fi по TCP протоколу со скоростью почти в 100 Мбит в сек. Это больше чем мы могли бы получить на том же микроконтроллере используя проводной интерфейс 100Base-T и даже USB 2.0 HS.
Комментарии (3)
almaz1c
26.12.2023 12:59CYW4373
странный диапазон рабочих температур: от -20°С. Недостаточно для уличного применения, избыточно для комнатного применения.
В свое время выбрали WF200C/D/SR - и дешевле, и корпус проще в монтаже (можно съэкономить на покупке готового модуля), и рабочие температуры от -40°С.
DieSlogan
Вот это Хардкор