Урок 68
Часть 1
LAN. ENC28J60
Сегодня мы подключим контроллер к локальной сети с помощью модуля на микросхеме ENC28J60.
Так как мы интерфейсом LAN пользовались только используя микроконтроллер AVR, я решил сделать подобный урок и на STM32., причём также с использованием того же модуля, так как именно этот модуль позволяет прочувствовать тот или иной интерфейс LAN изнутри, так как для него у STM готовых библиотек нет.
Данный модуль выглядит вот так
В качестве микроконтроллера был выбран STM32F103RCT6, на который я ещё уроков не давал, но распаковка среди моих роликов на Youtube имеется. Но так как уроков нет, то проект мы будем создавать заново. Контроллер установлен на отладочной плате, которая выглядит вот так (нажмите на картинку для увеличения изображения)
Для программирования нашей отладочной платы мы будем использовать программатор ST-Link-V2, на который есть также распаковка, подключенный по интерфейсу SWD. Как подключать данный программатор, также есть в видео по распаковке здесь.
Сердцем данного модуля является одноименная микросхема ENC28J60, которая представляет собой готовое сетевое решение, в котором присутствует и физический и канальный уровень. Обмен данными с контроллером данная микросхема осуществляет посредством шины SPI. Физический уровень у неё организован по стандарту 10BASE-T. То есть максимальная скорость передачи данных — 10 мегабит в секунду, что хотя и мало по сегодняшним современным меркам скоростей передачи данных по сети, но для микроконтроллера вполне хватит, и я думаю это будет удобнее, чем по USB, так как, находясь в сети и имея свой адрес и канальный и сетевой, контроллер может обращаться к любому компьютеру как в локальной сети, так и в глобальной, что сравнительно-таки неплохо.
Внутренняя структура микросхемы представляет собой следующий вид (нажмите на картинку для увеличения изображения)
Мы видим здесь, что у нас существуют управляющие регистры, в которые мы будем отправлять определённые команды для управления теми или иными действиями и настройками, Также мы видим буфер размером 8 килобайт для получения и отправки данных по сети.
Поставляется микросхема в различных корпусах. На нашем модуле она в корпусе, предназначенном для поверхностного монтажа.
Для подключения модуля имеется следующий разъём
Все обозначения контактов мы видим справа.
К отладочной плате мы подключим модуль следующим образом
ENC28J60 — STM32F103RCT6
VCC — 3.3V
GND — GND
CS — PA4
RESET — 3.3V
SI — PA7 (MOSI)
SCK — PA5
SO — PA6 (MISO)
Кроме всего прочего мы к плате подключим переходник USART, чтобы следить за за данными, которые будут приходить из сети в контроллер.
Регистры в микросхеме организованы следующим образом
Мы видим здесь, что кроме адресов регистров существуют и банки, то есть порядок адресации регистров сегментированный, а начиная с адреса 1Bh обращение к регистрам от банков не зависит, они мапятся на все банки.
Основное назначение регистров можно узнать по их начальным буквам в аббревиатуре
E — Ethernet,
MA — MAC,
MII — MI.
Конкретно с некоторыми регистрами мы будем знакомиться уже при написании исходного кода, так как его будет очень много и к тому моменту, когда нам потребуется тот или иной регистр, мы уже забудем его назначение.
Само собой, чтобы заниматься программированием передачи данных по сети, необходимы знания сетевых уровней, модели OSI и всего, что связано с сетью, так как учить данным вещам я не буду, по этим вопросам есть очень много информации, могу только если что-то посоветовать, так что обращайтесь если что в комментариях. Но некоторые сведения я, конечно, давать буду, не без этого.
Вообще сетевая модель делится на несколько уровней. Основные из них следующие:
1. Прикладной уровень
2. Уровень представления
3. Сеансовый уровень
4. Транспортный уровень
5. Сетевой уровень
6. Канальный уровень
7. Физический уровень
При передаче данных из программы в сетевой провод мы проходим путь сверху вниз по вышенаписанному списку. Сначала мы наши данные объединяем в какие-то удобные последовательности или массивы, понятные для прикладного уровня принимаемой стороны, затем мы их шифруем либо ещё как-то их преобразуем для защиты от несанкционированного использования, затем обёртываем в определённый протокол, который поможет поддержать соединение и не потерять его (сеансовый уровень), затем прицепляем ещё заголовок спереди, который обеспечит передачу определённому порту от другого определённого порта, затем ещё обёртываем в протокол, который обеспечит доставку к определённому устройству, имеющему сетевой адрес (IP), затем ещё обёртываем протокол, который несёт в себе физические адреса устройств MAC (канальный уровень), а последний уровень уже обеспечит непосредственную доставку всех этих несколько раз обёрнутых пакетов (физический уровень), к которому относятся трансформаторы, провода, концентраторы, повторители сигнала и медиаконвертеры.
Вообщем кратко как-то вот так. Поконкретней с протоколами будем знакомиться по мере их использования.
Ну давайте, чтобы от этой всей теории немного отвлечься, создадим наш проект.
Для этого запустим генератор проектов Cube MX создадим новый проект и выберем там наш контроллер (нажмите на картинку для увеличения изображения)
Включим SWD
Затем подключим кварцевый резонатор
Clock Configuration настроим следующим образом
Вернёмся в «Pinout», включим там SPI
Также включим USART
Ещё включим на выход ножки портов PC13 и PA4, так как к перовой подключен красный светодиод, а ко второй мы подключи Chip Select нашего SPI
Идём в Configuration, первым делом включим на обе ножки портов, задействованные выше скорость Medium
Для SPI настроим следующие параметры
А USART мы настроим следующим образом
На всякий случай включим прерывания, лишним не будет
Сохраним проект для Keil5, а назовём его по имени нашей используемой микросхемы незатейливо — ENC28J60.
Сгенерируем проект для Keil, запустим его, настроим программатор на autoreset и пропробуем проект собрать.
Соединим все наши модули, подключив их согласно распиновке в Cube MX , и посмотрим, что у нас получилось (белый провод от USART можно не подключать, он и так нормально питается)
То есть USART у нас подключен следующим образом:
FDI — STM32F103RCT6
GND — GND
RX — A9
TX — A10
Ножку RESET модуля ENC28J60 желательно подключить к 3.3в через резистор 10 кОм.
В следующей части нашего урока мы добавим несколько макросов и функций по работе с микросхемой ENC28J60, а также немного поработаем над изучением технической документации.
Предыдущий урок Программирование МК STM32 Следующая часть
Техническая документация:
Документация на микросхему ENC28J60
Перечень ошибок ENC28J60 (Errata)
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Ethernet LAN Сетевой Модуль можно купить здесь ENC28J60 Ethernet LAN Сетевой Модуль.
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
RESET лучше подключить к ноге R — и сброс получите при нажатии не кнопку RESET платы, и подтяжку к 3.3В через резистор на отладочной плате.
STM32F103RCT6 имеет форм-фактор LQFP64, на Вашей плате установлен STM32F103C8T6 (собственно, его Вы и выбираете в CubeMX). Поправьте в описании.
Здравствуйте. Только начинаю изучать контроллеры. В частности. работу с ENC28J60. Возможно ли сделать обмен данными между двумя контроллерами по сети без использования ПК. И какой ваш урок лучше всего для этого посмотреть. Спасибо.
Update. Коды дополнены UPD, TCP, DNS, пинг работает в оба направления и даже работает TELNET. Но! Все еще используется один сокет. Отвечая а один пакет вы не можете работать с другим устройством. Для режима запрос-ответ работает идеально. Для работы с несколькими устройствами в режиме мастера нужен кэш, мультисокет и прочие прелести.
Возможно найду время на продолжение статьи. Дело полезное и правильное!
Спасибо!
Внешние ссылки убраны из соображений безопасности.
Добрый день! В статье написано, что вы можете посоветовать литературу по сетям.
Заранее спасибо.