Top.Mail.Ru
Уведомления
Очистить все

[Решено] Отладка соединения ENC28j60

Страница 3 / 3
(@remontovich)
Level 2

@aveal не за что! Мне очень пригождается твой стек. Как то ничего более простого и понятно работающего на просторах сети не нашел. Наверное есть где то библиотеки LwIP, но их то же нужно "женить" c enc28j60 или другим приемо-передатчиком. Очевидно, что баги не самые критичные и нестабильно появляющиеся. Для обучения и простых задач можно взять и кнопкой ребутнуть устройство. У меня более сложная задача, нужно что бы устройство работало сильно удаленно. Подойти и сделать хард ресет не получится. Я стал костылить механизм программной перезагрузки, просто добавляя в бесконечный цикл Init_ENC28j60 при потере связи. Выяснилось, что это не приводит к полной перезагрузке, как например при хард ресете blue pill. Ну и пошел смотреть регистры ENC. Понял, что некоторые переменные, которые хранят значения регистров ENC остаются не сброшенные и STM продолжат думать, что в ней что то есть, убегает указателем в памяти МК на месте encFrame->data; куда то далеко, уходит в нули вот и responsesize становится нулём.

К тем переменным, что я выше привел, в функции Init_ENC28j60 еще неплохо добавить сброс значения BANKов. Может быть еще что то надо привести к дефолтному значению 😉
Так же добавил отправку greeting ARP пакета после инициализации в начале работы, что бы маршрутизаторам сети устройство показалось сразу после появления в сети. Может и не обязательно, но думаю хуже не будет.

Еще ОЧЕНЬ сильно помогла простая задержка 500 мс после подачи питания перед Init_ENC28j60. И так же добавил задержку после инициализации. ENC долго оживает после подачи питания. Когда это все сделал работает теперь при каждом новом запуске и после программной перезагрузки хорошо.
Вот дамп greeting ARP если что:

uint8_t gArpPkt[42] = {
// --- Заголовок Ethernet
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Широковещательный MAC адрес
0x00, 0x17, 0x22, 0xED, 0xA5, 0x01, // 06: MAC адрес bluepill
0x08, 0x06, // 12: Type (ARP)

// Заголовок ARP фрейма
0x00, 0x01, // 14: HTYPE (Ethernet)
0x08, 0x00, // 16: PTYPE (IPv4)
0x06, // 18: HLEN (6)
0x04, // 19: PLEN (4)
0x00, 0x02, // 20: Opcode (Reply)

//далее два раза повторяется MAC и IP bluepillа

// --- Sender Info ---
0x00, 0x17, 0x22, 0xED, 0xA5, 0x01, // 22: MAC адрес bluepill
10, 31, 36, 34, // 28: Sender IP (10.31.36.64 - этой мой IP, подставьте ваш)

// --- Target Info ---
0x00, 0x17, 0x22, 0xED, 0xA5, 0x01, // 32: MAC адрес bluepill
10, 31, 36, 34 // 38: Target IP (10.31.36.64 - этой мой IP, подставьте ваш)
};

ОтветитьЦитата
Создатель темы Размещено : 24.04.2026 12:51
(@remontovich)
Level 2

Еще пдфку на enc перчитывал. Нашел там такую ноту:

Note: After a Power-on Reset, or the ENC28J60
is removed from Power-Down mode, the
CLKRDY bit must be polled before
transmitting packets, enabling packet
reception or accessing any MAC, MII or
PHY registers.

 

Регистр ESTAT задефайн, но бит нет.  Так что делов не много. Просто в функцию инициализации добавить:

while (!(ReadControlReg(ESTAT) & ESTAT_CLKRDY_BIT))


ОтветитьЦитата
Создатель темы Размещено : 24.04.2026 15:48
Страница 3 / 3
Поделиться:
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.