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

Как проверить, что W5500 отвечает по SPI?

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

У W5500 есть регистр, значение которого известно заранее: VERSIONR по адресу 0x0039 в блоке общих регистров всегда содержит 0x04 (WIZnet, разд. 3.1). Прочитать его — самый быстрый способ понять, разговаривает ли микроконтроллер с микросхемой. Так же поступает и библиотека Ethernet для Arduino: при запуске она пишет и читает регистр режима и сверяет VERSIONR с 4 (isW5500() в w5100.cpp).

БайтЗначениеЧто означает
10x00старший байт адреса
20x39младший байт адреса: VERSIONR
30x00управление: блок 00000 (общие регистры), RWB = 0 (чтение), OM = 00 (длина по CS)
4любойW5500 выдаёт на MISO значение 0x04

Кадр W5500 состоит из 16-битного адреса, байта управления и данных, старшим битом вперёд; режим SPI — 0 или 3 (разд. 2.1–2.2).

Если пришло не 0x04

ОтветВероятная причинаЧто проверить
0xFF или 0x00микросхема не отвечаетCS опускается в ноль, питание 3,3 В, провод MISO, вывод RSTn в единице, кварц 25 МГц
случайные значенияошибки тактированиярежим SPI 0 или 3, частота SCK, длина проводов
то верно, то нетдругое устройство на шине SPICS остальных устройств в единице

Сброс: RSTn держат в нуле не меньше 500 мкс, а после его отпускания внутренней ФАПЧ нужно до 1 мс (табл. выводов, разд. 5.5.1) — читать регистры раньше бессмысленно. Частоту SCK WIZnet указывает до 80 МГц, но гарантирует работу на 33,3 МГц (разд. 5.5.4).

Общие причины, по которым SPI возвращает 0xFF, разобраны в ответе «Почему SPI читает только 0xFF?», режимы и сигналы шины — в статье «SPI». Чем W5500 удобнее ENC28J60 на Arduino — в ответе «Что лучше для Arduino: W5500 или ENC28J60?», разводка разъёма и трансформатора — в статье «Ethernet для микроконтроллера».

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

Какие байты отправить, чтобы прочитать VERSIONR?

При CS в нуле: 0x00 и 0x39 — адрес, 0x00 — байт управления (блок общих регистров, чтение, режим переменной длины), затем любой байт, во время которого W5500 выдаст значение. Должно прийти 0x04; после этого CS поднимают.

Почему W5500 работает на 8 МГц, а на 40 МГц нет?

WIZnet пишет, что микросхема рассчитана на SCK до 80 МГц, но гарантированно проверена на 33,3 МГц. Выше этой частоты, да ещё на длинных проводах до модуля, ошибки чтения ожидаемы — снизьте частоту SPI.

VERSIONR читается, а сеть не работает. Что дальше?

Прочитайте регистр PHYCFGR (0x002E): бит 0 LNK показывает, есть ли связь с коммутатором, бит 1 SPD — скорость 100 или 10 Мбит/с. Если LNK = 0, проверьте кабель, разъём с трансформатором и кварц 25 МГц; если связь есть — настройки IP, шлюза и маски.

Источники

  1. WIZnet. W5500 Datasheet v1.1.0 (17 Dec 2022) — разд. 2.1 — SPI режимы 0 и 3, старший бит первым; разд. 2.2 — кадр из фазы адреса (16 бит), фазы управления (BSB[4:0], RWB, OM[1:0]) и данных; режим VDM — длина задаётся сигналом SCSn; разд. 3.1 — VERSIONR [0x0039] всегда 0x04, PHYCFGR [0x002E], бит 0 LNK — связь есть, бит 1 SPD — 100 Мбит/с; табл. выводов — RSTn держать в нуле не меньше 500 мкс; разд. 5.5.1 — после сброса до захвата ФАПЧ до 1 мс; разд. 5.5.4 — SCK до 80 МГц, проверено на 33,3 МГц
  2. Arduino. Ethernet library 2.0.2 (arduino-libraries/Ethernet), src/utility/w5100.cpp — W5100Class::isW5500 — запись и чтение регистра режима и проверка VERSIONR == 4; при отсутствии ответа init возвращает 0 («no chip»)

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