Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Разработка IoT-приложений

716

26.2. Ethernet контроллер W5500

За исключением новейших плат Nucleo-144, ни одна из плат Nucleo-64 и Nucleo-32 не предоставляет микроконтроллер STM32 со встроенным Ethernet контроллером. Это означает, что если вы хотите разрабатывать IoT-приложения с помощью Nucleo, то вам необходимо использовать внешнюю плату расширения.

WIZnet – корейская компания, которая достигла популярности благодаря плате Arduino. Фактически, ее первый Ethernet контроллер, W5100, был чипом, который использовался для создания Arduino Ethernet Shield. Начиная с контроллера W5100, WIZnet повторила разработку других подобных продуктов. На данный момент лучшим в своем классе продуктом является W5500, который мы рассмотрим в данной главе.

W5500 – это монолитный Ethernet контроллер со встроенным LAN Phyther. Более того, это полноценный сетевой процессор с зашитым стеком TCP/IP. Чип предназначен для обмена данными с ведущим микроконтроллером через быстрый интерфейс SPI (интерфейс может работать до 80 МГц). Самые важные характеристики данного чипа:

Поддержка TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE

Одновременная поддержка 8 независимых сокетов

Поддержка режима выключенного питания (Power down mode)

Поддержка пробуждения по локальной сети через UDP (Wake on LAN over UDP)

Поддержка высокоскоростного SPI (SPI MODE 0, 3) до 80 МГц

Внутренняя память 32 КБ для буферов приема/передачи

Встроенный 10BaseT/100BaseTX Ethernet PHY

Поддержка автосогласования (полнодуплексный и полудуплексный)

Работа 3,3 В с допуском сигнала I/O в 5 В

Светодиодные выходы (полнодуплексный/полудуплексный, связь, скорость, активен)

48-выводной бессвинцовый корпус (Lead-Free Package) LQFP (7x7 мм, шаг 0,5 мм)

Рисунок 2: Заказное устройство, сделанное на базе микроконтроллера STM32F0 (слева) и микро-

схемы W5500 (справа)

Разработка IoT-приложений

717

Микросхему W5500 довольно легко встроить в заказную плату. Для ее работы требуется всего лишь кварцевый генератор, несколько пассивных компонентов и трансформатор LAN. В чип также встроена схема с накачкой заряда (charging pump), необходимая для питания трансформатора LAN. Я успешно использовал этот чип в нескольких заказных устройствах. Поскольку весь стек TCP/IP включен в сетевой процессор, этот чип можно использовать даже в сочетании с недорогими микроконтроллерами STM32F0. Более того, для мелкосерийных производств удобнее использовать один из этих чипов с недорогим микроконтроллером STM32 вместо мощного со встроенным Ethernet и внешним выделенным LAN Phyther. На рисунке 2 показано заказное устройство, спроектированное автором книги, в котором микроконтроллер STM32F030 используется для управления микросхемой W5500. Статические веб-страницы хранятся во внешней Flashпамяти через интерфейс SPI.

Рисунок 3: W5500 Ethernet Shield от WIZnet

WIZnet разработала совместимый с Arduino шилд (см. рисунок 3), который работает «из коробки» даже с платами Nucleo. В данный шилд также встроен кардридер MicroSD, который подключен к тому же порту SPI микросхемы W5500. Это позволяет хранить вебстраницы и другое статическое содержимое (изображения, файлы CSS, JavaScript и т. д.) на внешней SD-карте.

Сетевые процессоры, такие как W5500 и подобные, работают очень просто. Чип предлагает до восьми сокетов15. Каждый сокет имеет набор связанных регистров (associated registers). Изменяя содержимое этих регистров, можно управлять сокетом (открывать соединение, переводить его в режим прослушивания (listening mode), отправлять/получать данные и т. д.). Для передачи данных через сокет W5500 предлагает внутреннее буферное 32 КБ пространство, которое можно свободно разделять между восьмью сокетами, как мы увидим позже. Путем чтения/записи из этого буфера вы можете обмениваться данными с другой конечной точкой (endpoint). Это означает, что с точки зрения микроконтроллера управление этими микросхемами – это всего лишь вопрос байтов, которыми обмениваются через интерфейс SPI. Однако обрабатывать все внутренние состояния сокета может быть сложно, особенно для новичков в этих микросхемах. Я разработал библиотеку для работы с W5100 и могу подтвердить, что на это уходит много времени.

15 Сокет (socket) в сети – это абстракция над сложным стеком TCP/IP. Это просто дескриптор, который позволяет отправлять поток байт с одной машины на другую, не имея дело со сложным базовым протоколом (если вам не нужно выполнять продвинутые операции).

Разработка IoT-приложений

718

Более того, к сожалению, все микросхемы W5X00 (5100, 5200, 5300 и 5500) имеют некоторые «неприятные» и плохо документированные ошибки, которые трудно исправить.

Рисунок 4: Архитектура библиотеки ioLibrary_Driver

WIZnet начала выпуск специальной библиотеки для этого семейства микросхем около двух лет назад. Она называется ioLibrary_Driver, и она доступна на GitHub16. Архитектура библиотеки показана на рисунке 4. Библиотека, по существу, состоит из двух уровней. Один уровень, называемый Ethernet, содержит примитивы, используемые для установления соединений между узлами. Файл Ethernet/socket.c содержит все процедуры, относящиеся к управлению сокетами. API-интерфейс сокета похож на API-интерфейс сокета BSD, но несмотря на это, он не полностью совместим с ним. Один и тот же уровень Ethernet содержит низкоуровневые драйверы для каждого чипа WIZnet. Например, файл Ethernet/w5500.c содержит всю необходимую логику для управления микросхемой W5500. Наконец, файл Ethernet/wizchip_conf.h содержит макросы конфигурации, используемые для настройки библиотеки (подробнее об этом позже).

Уровень Internet построен над уровнем Ethernet и представляет собой набор нескольких Интернет-протоколов и служб:

Клиент DHCP

Клиент DNS

Клиент и сервер FTP

Агент/ловушка SNMP (SNMP agent/trap)

Клиент SNTP

Клиент TFTP

Сервер HTTP

Пользовательское приложение может использовать один или несколько из вышеперечисленных протоколов или напрямую обращаться к уровню Ethernet для создания собственного приложения.

16 https://github.com/Wiznet/ioLibrary_Driver