Перейти к содержанию

Почему ENC28J60 теряет пакеты при подключении к коммутатору?

Обновлено Редакция GAW

ENC28J60 работает только на 10 Мбит/с и умеет два режима — полудуплекс, когда передаёт одна сторона за раз, и полный дуплекс. Но выбирать режим вместе с партнёром он не умеет: по разделу 9.0 даташита автоматическое согласование дуплекса не поддерживается.

Что происходит с коммутатором

Порт коммутатора в автонастройке не получает от ENC28J60 сведений о режиме и считает его полудуплексным. Варианты:

Режим ENC28J60Порт коммутатораРезультат
полудуплексавто (выберет полудуплекс)работает
полный дуплексавто (выберет полудуплекс)коллизии и потери пакетов
полный дуплексвручную 10 Мбит/с, полный дуплексработает
полудуплексвручную полный дуплексколлизии и потери пакетов

Microchip называет поздние коллизии признаком того, что узел в полном дуплексе передаёт на полудуплексную линию. А по errata DS80349C (п. 13) и в правильном полудуплексе с некоторыми коммутаторами бывают ложные поздние коллизии, после которых пакет отбрасывается без повтора, — драйвер должен повторять такую передачу сам. Наш вывод: если библиотека по умолчанию включает полный дуплекс, а плата воткнута в обычный домашний коммутатор, связь будет то работать, то нет — особенно под нагрузкой.

Скорость полудуплекса

В полудуплексе передача и приём делят одну полосу 10 Мбит/с, и в сумме данных проходит не больше:

vTX+vRX≤10 Мбит/сv_\text{TX} + v_\text{RX} \le 10\ \text{Мбит/с}

Для датчиков и веб-страницы на микроконтроллере этого хватает. Сколько полезных данных остаётся после заголовков, оценит калькулятор полезной скорости, сравнение с W5500 — в ответе «Что лучше для Arduino: W5500 или ENC28J60», остальные варианты Ethernet — в статье «Ethernet для микроконтроллера».

Похожие вопросы

Как понять, в каком режиме сейчас работает ENC28J60?

По битам MACON3.FULDPX и PHCON1.PDPXMD: оба в нуле — полудуплекс, оба в единице — полный дуплекс. Microchip предупреждает, что если установлен только один из них, контроллер в неопределённом состоянии и работает неправильно.

Что лучше выбрать — полудуплекс или полный дуплекс?

С обычным коммутатором в автонастройке надёжнее полудуплекс: так его и определит коммутатор. Полный дуплекс имеет смысл, только если порт коммутатора можно вручную перевести в 10 Мбит/с, полный дуплекс.

Почему контроллер принимает собственные пакеты?

В полудуплексе после сброса ENC28J60 возвращает передаваемые пакеты в свой приёмный буфер. Если фильтр их не отсеивает, драйвер видит собственный трафик; Microchip советует установить бит PHCON2.HDLDIS.

Источники

  1. Microchip. ENC28J60 Stand-Alone Ethernet Controller with SPI Interface (DS39662E, 2006–2012) — разд. 9.0: автоматическое согласование дуплекса не поддерживается; с коммутатором или контроллером с автосогласованием ENC28J60 определяется как полудуплексный; для полного дуплекса обе стороны настраивают вручную; разд. 9.1: полудуплекс — MACON3.FULDPX = 0 и PHCON1.PDPXMD = 0, если установлен только один бит — состояние неопределённое; поздние коллизии — признак узла в полном дуплексе на полудуплексной линии; в полудуплексе по умолчанию передаваемые пакеты возвращаются в приёмник, отключается битом PHCON2.HDLDIS; разд. 9.2: полный дуплекс — оба бита в единице; PHSTAT: 10 Мбит/с в обоих режимах
  2. Microchip. ENC28J60 Silicon Errata and Data Sheet Clarification (DS80349C, 2010) — п. 13, ревизии B1–B7: в полудуплексе с некоторыми партнёрами импульс проверки связи принимается за коллизию; если передано больше MACLCON2 байт, это поздняя коллизия, и пакет отбрасывается без повтора; обход — программный повтор передачи при поздней коллизии

Нашли ошибку?