Ethernet shield enc28j60 подключение
Уже давно был сделан Ethernet модуль, но все валялся в ящике. Никак руки не доходили.
Вот, наконец, собрался. Проверил на примерах от lifelover — работает.
В качестве микрухи используется ENC28J60 в SSOP28 корпусе. Бывает также в DIP28 и QFN корпусе. В общем, на любой вкус.
Схемотехника
Схема типейшая, по даташиту. Никаких заморочек, разве что применен разъем с трансформатором J00-0086NL, тогда как лучше было бы поставить J00-0066NL — у него коэффициент трансформации оптимальней (1:1). Но что было под рукой то и поставил. Можно и отдельный трансформатор взять, вроде FC-22 который стоял в модуле для WIZ100SR
Еще одна важная деталь. Резистор Rbias, у меня он на схеме обозначен как R8 2k 1% нужно подбирать исходя из ревизии микросхемы. Я поставил 2.2кОм. Errata рекомендует
For silicon revisions, B1 and B4, use a 2.7 k, 1% external resistor between the RBIAS pin and ground. The value shown in the data sheet (2.32 k,) is correct for revisions B5 and B7.
Деталей не много, развести все удалось по одной стороне практически, с парой перемычек.
Дорожки мелковаты, 0.3мм, но не думаю, что у кого то это вызовет сильных затруднений. Сделано ЛУТом без проблем.
Интерфейс
Связь с контроллером по SPI интерфейсу.
- SO — MISO
- SI — MOSI
- SCK — SCK
- CS — SS Впрочем, выбор кристалла SS тут может быть повешан куда угодно.
- RESET — если никуда не подключать, то лучше его повесить на +3.3 вольта. Чтобы не болтался и не создавал глюки.
- INT — выход прерывания. При приеме пакета может дрыгать этой ногой и заставлять проц срочно обрабатывать пакет. Или, как минимум, принять во внимание, что надо получать данные.
- WOE — Это, как я понял, Wake On Ethernet. Я никуда не подключал
- 3V3 — питание на 3.3 вольта. Микруха жручая, потребляет 250мА и весьма активно при этом греется. От платы не отпаивается конечно, но горячая — палец еле держит. Да, несмотря на питание в 3.3 вольта ее входы толерантны к 5 вольтам
- GND — земля
Подробнейшее описание работы с этой игрушкой можно найти в сообществе, в цикле статей посвященной этой микросхеме и работе с Ethernet в частности. Подробней вы вряд ли где найдете :)
З.Ы.
Сейчас эта поделка у меня плавно мутирует в боковой модуль для Pinboard II и скоро пойдет в производство.
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
Для связи с внешним миром и передачи данных в наше современное время удобно использовать сеть Интернет. С появлением Wi-Fi модулей задача упростилась и удешевилась, но всё ещё существуют мета, где не существует беспроводной сети, она загрязняет диапазон частот или просто неудобна, но рядом есть сетевой кабель. В таком случае нам поможет Ethernet Shield на основе W5100!
Краткий обзор W5100
Шилд предназначен для коммуникации микроконтроллера с локальной сетью и реализует физический уровень интерфейса. Подключается к Arduino по интерфейсу SPI. Скорость обмена Internet – 10/100 Mb/s. Напряжение питания – 5В.
Кроме собственно элементов для связи с сетью на плате расположен разъём для microSD карты памяти (для упрощения организации памяти для веб-сервера).
На шилд выведены закрытые им кнопка RESET и служебные светодиоды, в том числе индикаторы работы проводного интерфейса. Шилд совместим с Arduino Mega, так как использует ICSP-разъём (разъём программирования) для подключения.
Обратите внимание – стандартный пин 10, используемый для выбора активного устройства, будет занят и для других устройств придётся выбирать другой пин, чтобы избежать конфликта на линиях данных. Это – одна из самых распространённых ошибок, по причине которой у многих не работают SPI устройства вместе с Ethernet Shield.
Подключение в Arduino IDE
Шилд был разработан одним из первых и стал стандартом де-факто, поэтому библиотека для работы с ним включена в комплект поставки Arduino IDE и называется она просто – Ethernet library.
Для подключения шилда к Arduino просто наденьте его на плату (возможны проблемы с совместимостью с Arduino Leonardo)
Используйте качественные сетевые провода, поскольку оборудование чуть более привередливое к мелочам, чем компьютерные сетевые кабели. Для стабильной работы желательно обеспечить отдельное внешнее питание.
Откройте среду и загрузите пример WebServer. После чего подключите Arduino к сети и перейдите по IP-адресу 192.168.1.177. Возможно, это вас удивит, но вы только что зашли на собственный, только что поднятый сервер! А если «пробросить» 80 порт сквозь роутер наружу, то доступ к нему можно будет получить из любой точки света, что позволит удалённо управлять устройством или контролировать его.
Следующие несколько уроков будут посвящены организации сети Ethernet. В этом уроке я изложу минимум информации, необходимой для практической работы с сетью. Немного расскажу об Ethernet модуле ENC28J60 и приведу схему подключения его к плате Ардуино.
Локальная сеть Ethernet.
Ethernet – самый распространенный в мире сетевой интерфейс. Когда говорят об объединении компьютеров в локальную сеть, как правило, имеют в виду именно его. Ethernet контроллер стал штатным устройством для каждого компьютера.
Первый вариант стандарта Ethernet появился еще в 70х годах. Первоначально средой передачи был коаксиальный кабель, топология сети – шина, скорость передачи 10 мегабит/сек. Со временем появилось множество разновидностей Ethernet со скоростью передачи до 100 гигабит/сек, изменилась архитектура сети, стала другой среда передачи. Об этом существует много подробной информации: протоколы, форматы данных, алгоритмы обмена и т.п. Я буду рассказывать о сети Ethernet чисто с практической стороны.
Нам интересны стандарты Ethernet (10 Мбит/сек) и Fast Ethernet (100 Мбит/сек). Они совместимы и отличаются только скоростью передачи данных. Для подключения к сети плат Ардуино мы будем использовать контроллеры первого стандарта (10 Мбит/сек), а штатные сетевые контроллеры компьютеров поддерживают второй стандарт (100 Мбит/сек). Но это не помешает подключить компьютер к той же сети. Стандарты обозначаются соответственно 10BASE-T и 100BASE-TX.
Топология сети.
Два Ethernet устройства могут быть соединены между собой непосредственно. Никакие дополнительные блоки не требуются, достаточно одного кабеля.
Если используется более двух устройств, то соединение происходит по радиальной топологии с помощью хабов (HUB).
Хаб или сетевой концентратор - это электронный прибор для соединения нескольких сетевых устройств в один сегмент сети. Он содержит несколько портов ввода/вывода.
По сути это повторитель. Все сигналы, которые подаются на один из его портов, повторяются на остальных. Несмотря на то, что физически топология сети выглядит как радиальная, логически с использованием хабов она превращается в “общую шину”. Любые пакеты данных в сети попадают на все сетевые устройства, в том числе и на устройства, которым они не предназначены. Благодаря этому возможны конфликты данных, увеличивается нагрузка на сеть. В настоящее время хабы практически вытеснены более совершенными устройствами - сетевыми коммутаторами.
Хабы можно соединять между собой, но только в древовидные структуры.
При этом недостатки, связанные с логической топологией ”общая шина” усугубляются за счет увеличения количества сетевых устройств.
Гораздо больше возможностей имеет сеть, созданная на базе коммутаторов (switch).
Топология сети выглядит, так же, как и сеть, созданная с помощью хабов. Но в отличие от последней, топология сети остается радиальной не только на физическом, но и на логическом уровне.
Коммутатор это прибор для соединения нескольких устройств сети в пределах одного или нескольких сегментов.
Подобно хабу коммутатор имеет несколько портов ввода/вывода. Но в отличие от хаба коммутатор передает пакеты данных не всем подключенным к нему устройствам, а только непосредственно получателю. Благодаря этому увеличивается производительность сети, повышается надежность.
- Хаб - это “тупой” аппаратный повторитель сигналов.
- Коммутатор – интеллектуальное устройство, которое анализирует заголовки пакетов и передает данные только на нужные порты.
Обычно сетевой коммутатор поддерживает различные скорости передачи данных одновременно.
К портам коммутаторов могут быть подключены другие коммутаторы или хабы. Это позволяет почти бесконечно расширять сеть.
Роутер или маршрутизатор – это сетевой шлюз, устройство для передачи пакетов между различными сетями. Как правило, используется для подключения к глобальной сети Интернет.
Большинство роутеров также выполняют функции сетевых коммутаторов. В этом случае можно обойтись без сетевого коммутатора.
Среда передачи данных Ethernet (кабель).
В качестве среды передачи нужные нам стандарты требуют применения кабеля категории 3 или категории 5. Используются только две неэкранированные витые пары (4 провода).
Одна витая пара предназначена для передачи данных, другая для приема.
Кабель обозначается UTP - Unshielded twisted pair (неэкранированная витая пара). Часто на нем написано ”ETHERNET LAN CABLE”.
Стандартный кабель содержит 4 витые пары.
Мы будем использовать только две из них.
Для подключения к портам Ethernet используются 8 контактные разъемы RJ-45.
Есть два варианта распиновки разъемов: T568A и T568B. Часто просто называются варианты A и B.
Номер контакта | Назначение сигнала |
1 | TX+ |
2 | TX- |
3 | RX+ |
6 | RX- |
Понятно, что выходные сигналы одного устройства должны подключаться к входам другого, и наоборот. Поэтому существует 2 варианта кабелей: прямой и перекрестный. Прямой используется для соединения между устройствами с разъемами типов A и B, а перекрестный – для соединения портов с одинаковой распиновкой.
Для нас это означает:
- если мы будем подключать плату Ардуино к материнской плате компьютера или другой плате Ардуино, то необходимо использовать перекрестный кабель;
- если плата Ардуино подключается к коммутатору или роутеру – кабель должен быть прямым.
Прямой кабель предполагает, что соединяются контакты с одинаковыми номерами. Соответствие сигналов вход – выходу обеспечивается распиновкой разъемов сетевых портов.
В перекрестном кабеле провода соединяются таким образом, чтобы у связанных кабелем портов входные сигналы были подключены к выходам, а выходные к входам.
На рисунках показаны общепринятые цвета жил кабеля. Лучше их придерживаться.
В сетевом интерфейсе Ethernet существует полная гальваническая развязка каждого устройства от среды передачи (кабеля). Развязка осуществляется за счет применения импульсных трансформаторов.
Это значительно повышает помехозащищенность сети и обеспечивает электрическую безопасность сетевых устройств.
Модуль ENC28J60.
Платы Ардуино будем подключать к сети Ethernet с помощью модуля ENC28J60. Физически он представляет собой плату размерами 51 x 18 мм.
Это самый дешевый сетевой Ethernet контроллер. По моей партнерской ссылке на момент написания статья его цена составляет всего 250 руб.
Моя цель не сделать обзор возможностей и технических характеристик модуля. Возможно, я напишу отдельную статью о нем в рубрике ”Электронные компоненты”. А сейчас я приведу информацию необходимую для работы модуля совместно с платами Ардуино.
Модуль выполнен на базе микросхемы ENC28J60 фирмы Microchip. Практически это микросхема ENC28J60 в стандартном включении.
Техническую информацию фирмы-производителя можно посмотреть по этой ссылке ENC28J60.pdf.
Вот принципиальная схема модуля.
Основные характеристики модуля ENC28J60.
- Совместимость с Ethernet сетями 10/100/1000 Base-T. Скорость передачи данных 10 мбит/сек, реализация TCP/IP стека.
- Интерфейс связи с микроконтроллером – SPI, частота до 20 мГц.
- Напряжение питания 3,1 – 3,6 В. Типовое 3,3 В.
- Интерфейсные входы модуля позволяют непосредственное подключение к сигналам с 5 вольтовыми уровнями. Максимально-допустимое напряжение на входах интерфейса SPI - 6 В. В половине статей о подключении ENC28J60 к Ардуино написано, что необходимо подключать входные сигналы через согласующие резисторные делители. Это не так. Сомневающееся могут посмотреть документацию на микросхему ENC28J60.
- Ток потребления от источника питания 3,3 В:
- в момент передачи может достигать 180 мА;
- в активном состоянии, но без передачи 120 мА;
- в режиме ожидания (сигнал CS в неактивном уровне) не более 2 мА.
Это характеристики, которые я решил выделить. Главное:
- для питания модуля необходимо использовать источник напряжением 3,3 В и выходным током до 180 мА;
- выводы интерфейса модуля допускается подключать к 5 вольтовым сигналам.
Интерфейс связи с микроконтроллером.
К микроконтроллеру модуль подключается через 10 контактный разъем типа PLHD, расположенный на печатной плате устройства.
Назначение контактов (распиновка) модуля ENC28J60.
Контакт Обозначение Направление Назначение 1 CLK выход Выход тактового сигнала 2 INT выход Сигнал прерывания 3 WOL - Зарезервирован 4 SO выход Сигнал SO интерфейса SPI 5 SI вход Сигнал SI интерфейса SPI 6 SCK вход Сигнал SCK интерфейса SPI 7 CS вход Сигнал CS интерфейса SPI (выбор контроллера) 8 RST вход Сброс 9 VCC - Питание модуля 3,3 В 180 мА 10 GND - Общий вывод Подключение модуля ENC28J60 к плате Ардуино.
Для питания модуля необходим источник напряжения 3,3 В. Такое напряжение есть на плате Arduino UNO. Поэтому я решил подключить модуль к ней. Для других плат пришлось бы добавлять стабилизатор напряжения 3,3 В.
В характеристиках на плату Arduino UNO указано, что ток потребления на выводе 3,3 В должен быть не более 50 мА. А нам необходимо 180 мА. Но на моей плате Arduino UNO в качестве стабилизатора 3,3 В используется микросхема XC6206P332MR. На плате это корпус SOT-23 с обозначением 662K. Допустимый выходной ток для этого стабилизатора 200 мА (технические характеристики можно посмотреть по ссылке XC6206.pdf). Т.е. модуль можно смело запитывать от Arduino UNO.
Для управления модулем мы будем использовать аппаратный интерфейс SPI микроконтроллера. Поэтому выбора выводов платы Ардуино для подключения модуля у нас нет.
Таблица соединения выводов платы Arduino UNO и модуля ENC28J60 выглядит так.
Плата Arduino UNO Модуль ENC28J60 Вывод № вывода Обозначение 12 4 SO 11 5 SI 13 6 SCK 10 7 CS RES 8 RST 3.3 V 9 VCC GND 10 GND Кому-то удобнее будет работать со схемой.
У меня все это выглядит так.
К роутеру я подключил модуль прямым кабелем.
В следующем уроке изучим библиотеку для управления модулем ENC28J60, научимся писать программы для передачи данных через сеть Ethernet.
Зачастую микроконтроллерам требуется доступ к Интернету, локальной сети. Это может пригодится, например, для построения умного дома, создания метеостанций «Народного мониторинга», установки простого веб-сервера и многого другого. Всё это может обеспечить Ethernet-модуль ENC28J60.
В этой статье я бы хотел рассказать о подключении ENC28J60 к Arduino. Этот модуль позволяет Arduino выходить в Интернет либо в локальную сеть.Для реализации проекта из этой статьи нам потребуются следующие компоненты:
Краткий обзор ENC28J60
Модуль подключается к Arduino с помощью SPI интерфейса. Тактовая частота интерфейса может достигать 20 МГц. Для подключения к сети TCP/IP используется разъём RJ-45. Модуль гальванически развязан с ним.
Контроллер модуля имеет максимальную тактовую частоту 25 МГц. Все функции по работе с сетевыми протоколами возложены на него, Arduino остаётся только отправлять пакеты данных и принимать полученные.
Модуль работает при напряжении 3,3 В, благодаря чему совместим и с микроконтроллерами STM32 или STM8. Максимальный потребляемый ток может составлять 250 мА, номинальный – 170 мА.
Теперь разберём подключение ENC28J60 к Arduino.Схема подключения
Рассмотрим подключение ENC28J60 к UNO и к другим платам на базе Arduino ATmega328/168.
Схема будет выглядеть так:
- VCC – 3v3;
- GND – GND;
- CS – 8;
- SI – 11;
- SO – 12;
- SCK – 13.
При использовании Arduino Mega она станет выглядеть так:
- VCC – 3v3;
- GND – GND;
- CS – 53;
- SI – 51;
- SO – 50;
- SCK – 52.
Номер пина CS можно изменить при помощи функции ether.begin().
Обратите внимание на то, что модуль потребляет достаточно много энергии и тока, выдаваемого портом 3v3 может не хватить, особенно на китайских клонах. В этом случае нужно будет использовать внешний источник питания.
Теперь перейдём к программированию и подключению ENC28J60 к Arduino.
Подключение в Arduino IDE
Среди стандартных библиотек Arduino IDE нет библиотеки для нашего модуля, поэтому будем использовать библиотеку EtherCard, которая поддерживает следующие модели Arduino: UNO, Mega, Leonardo, Nano, Pro Mini, LilyPad, Duemilanove и прочие, основанные на AVR микроконтроллерах. Платы с ARM архитектурой, такие как 101, Zero, Due ей не поддерживаются.
Попробуем вывести в последовательный порт компьютера IP адрес устройства, маску подсети, шлюз по умолчанию и адрес DNS сервера.
После сборки схемы и подключения платы к компьютеру загрузим следующий скетч в Arduino:
Долго облизывался на подключение МК к Ethernet, ходил вокруг цикла статей Lifelover'a, и решил попробовать. Но как в том анекдоте «не в лото, а в покер, не Волгу, а сто рублей и не выиграл, а проиграл» отличия от проекта Lifelover'a будут следующие:
- камень stm32f103v, флеша у которого аж 512к. Меньше 64к у STM32 — редкость, что не может не радовать
- tcp стек решил взять готовый, в частности uIP. Пробовал стек от Lifelover'a, но там много AVR-овских особенностей — раздельная адресация как минимум. В итоге запустил, погонял, но решил все-таки перейти на стандартный стек.
- ОС, естественно, FreeRTOS,
- Ну а Ethernet-контроллер все тот же enc28j60, подключенный через SPI
Итак, качаем исходники uIP отсюда
Копируем (или подключаем) полностью папку /uIP, там лежат неизменяемые библиотечные файлыПроект берем из статьи про FreeRTOS, настройку FreeRTOS я здесь опускаю.
В каталог проекта копируем следующие файлы:
uip-conf.h — берем стандартный и потом чуть подправим
clock-arch.c/clock-arch.h – копируем стандартные и закомментируем функцию работы со временем, потом ее допишем
hello-world.с/hello-world.h — это, собственно, приложение, которое и будет крутиться поверх стека
enc28j60.c/enc28j60.h – это драйвер Ethernet контроллера, написаный Lifelover'ом для AVR и адаптированный к stm32. Переписана функция инициализации и работы с SPIТеперь разберем чуть подробнее, как же части системы должны взаимодействовать друг с другом.
Соответственно, главный цикл будет выглядеть так:
Вся остальная настройка сводится к тому, чтобы подключить приложение hello-world в файле uip-conf.h (раскомментировать соответствующую строчку).
Теперь наш файл main.c
Сначала надо проинициализировать все что у нас есть:
Также есть необходимость периодически дергать еще пару функций uIP – чтобы он вовремя широковещательные пакеты рассылал и таблицы чистил.
В оригинале это все предлагалось делать в процедуре main в бесконечном цикле. Но у нас же RTOS! Оформим это все в виде двух тасков:
Ну, собственно, и все. Компилируем, запускаем — опаньки, все работает :)
Все вместе (RTOS и uIP) заняли чуть меньше 11кб кода. Размер буферов для пакетов, количество соединений и т. п., что влияет на оперативку, можно настроить все в том же uip-conf.hПри компиляции вываливается неожиданно много ворнингов на тему «dereferencing type-punned pointer will break strict-aliasing rules», отключил пока опцией -fno-strict-aliasing компилятора, потом гляну подробнее. Ну и ругань на тему «функция не-void, а return нету». Это особенность используемых в библиотеке protothreads.
PS. и пару слов, что изменилось в драйвере от Lifelover'a:
все остальное — без изменений, поскольку хорошо абстрагировано от железа. Ну и понятно, что enc28j60 висит на SPI2, его reset заведен на GPIOA_Pin_7Читайте также: