Почему ENC28J60 теряет пакеты при подключении к коммутатору?
Обновлено Редакция GAW
ENC28J60 работает только на 10 Мбит/с и умеет два режима — полудуплекс, когда передаёт одна сторона за раз, и полный дуплекс. Но выбирать режим вместе с партнёром он не умеет: по разделу 9.0 даташита автоматическое согласование дуплекса не поддерживается.
Что происходит с коммутатором
Порт коммутатора в автонастройке не получает от ENC28J60 сведений о режиме и считает его полудуплексным. Варианты:
| Режим ENC28J60 | Порт коммутатора | Результат |
|---|---|---|
| полудуплекс | авто (выберет полудуплекс) | работает |
| полный дуплекс | авто (выберет полудуплекс) | коллизии и потери пакетов |
| полный дуплекс | вручную 10 Мбит/с, полный дуплекс | работает |
| полудуплекс | вручную полный дуплекс | коллизии и потери пакетов |
Microchip называет поздние коллизии признаком того, что узел в полном дуплексе передаёт на полудуплексную линию. А по errata DS80349C (п. 13) и в правильном полудуплексе с некоторыми коммутаторами бывают ложные поздние коллизии, после которых пакет отбрасывается без повтора, — драйвер должен повторять такую передачу сам. Наш вывод: если библиотека по умолчанию включает полный дуплекс, а плата воткнута в обычный домашний коммутатор, связь будет то работать, то нет — особенно под нагрузкой.
Скорость полудуплекса
В полудуплексе передача и приём делят одну полосу 10 Мбит/с, и в сумме данных проходит не больше:
Для датчиков и веб-страницы на микроконтроллере этого хватает. Сколько полезных данных остаётся после заголовков, оценит калькулятор полезной скорости, сравнение с W5500 — в ответе «Что лучше для Arduino: W5500 или ENC28J60», остальные варианты Ethernet — в статье «Ethernet для микроконтроллера».
Похожие вопросы
Как понять, в каком режиме сейчас работает ENC28J60?
По битам MACON3.FULDPX и PHCON1.PDPXMD: оба в нуле — полудуплекс, оба в единице — полный дуплекс. Microchip предупреждает, что если установлен только один из них, контроллер в неопределённом состоянии и работает неправильно.
Что лучше выбрать — полудуплекс или полный дуплекс?
С обычным коммутатором в автонастройке надёжнее полудуплекс: так его и определит коммутатор. Полный дуплекс имеет смысл, только если порт коммутатора можно вручную перевести в 10 Мбит/с, полный дуплекс.
Почему контроллер принимает собственные пакеты?
В полудуплексе после сброса ENC28J60 возвращает передаваемые пакеты в свой приёмный буфер. Если фильтр их не отсеивает, драйвер видит собственный трафик; Microchip советует установить бит PHCON2.HDLDIS.
Источники
- 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 Мбит/с в обоих режимах
- Microchip. ENC28J60 Silicon Errata and Data Sheet Clarification (DS80349C, 2010) — п. 13, ревизии B1–B7: в полудуплексе с некоторыми партнёрами импульс проверки связи принимается за коллизию; если передано больше MACLCON2 байт, это поздняя коллизия, и пакет отбрасывается без повтора; обход — программный повтор передачи при поздней коллизии
Нашли ошибку?
Смотрите также
- ENC28J60MAC + PHY 10BASE-T по SPI: выводы, уровни, обвязка, ошибки ревизии B7
- Полудуплекс и дуплексПередача по очереди или одновременно: RS-485 2-wire и 4-wire, DE и RE
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка
- Что лучше для Arduino: W5500 или ENC28J60?W5500: стек TCP/IP в микросхеме и штатная библиотека Ethernet
- Полезная скорость интерфейсовБиты на байт, кадры в секунду и доля данных для UART, SPI, I²C, CAN, Modbus и USB