STM32H7 LAN8742 LwIP работает нормально только после включения питания, а не после сброса

У меня под рукой странная проблема, я никогда ее раньше не видел. Тем не менее, я все еще пытаюсь определить проблему. У меня есть STM32H753VIT и сетевой контроллер LAN8742, подключенный к нему. Я запускаю LwIP в режиме NO-SYS. Он работает нормально только после холодного включения, но не после аппаратного сброса (кнопка или датчик ST-LINK). Он запускает простой эхо-сервер TCP. Если он работает, я могу проверить связь с ним, и он отвечает клиенту TCP.

Но после аппаратного сброса я больше не могу пинговать его, и он не отвечает как эхо-сервер. Я заметил, что зеленый светодиод (ссылка) на интерфейсе останется выключенным после сброса.

Я мог видеть, что функция LAN8742_Init успешно выполняется после аппаратного сброса, но больше не видит данных RX, доступных в функции low_level_input.

На Nucleo-H743ZI я запускаю тот же код, и он также работает после аппаратного сброса. Обратите внимание, что код немного отличается, так как отображение контактов немного отличается. Код хорошо работающего Nucleo-H743ZI: https://github.com/bkht/Nucleo-H743ZI_LAN8742_LwIP_NO-SYS Код для странного поведения STM32H753VIT: https://github.com/bkht/STM32H753VIT_LAN8742_LwIP_NO-SYS

NRST микроконтроллера подключается к nRST LAN8742A, а конденсатор емкостью 100 нФ используется для заземления. У меня есть переключатель сброса, и я пробовал подтягивающий резистор, ну не повезло. Я добавил кнопку сброса и обнаружил, что более длительный аппаратный сброс также не работает.

Я думаю в направлении тайминга или содержимого памяти. Кто-нибудь когда-нибудь видел такое поведение при запуске?


person Jack    schedule 20.03.2019    source источник
comment
Вы проверили техническое описание LAN8742A, чтобы узнать минимальное необходимое время импульса сброса? Я сталкивался с этой точной проблемой в прошлом, когда у меня была такая же аппаратная схема - были подключены nRST STM и RST PHY, и они были подключены к разъему отладчика. В моем случае PHY требовал более длинного импульса сброса, чем STM, что иногда приводило к его блокировке, если только не был сделан более длинный импульс сброса.   -  person Jacek Ślimok    schedule 22.03.2019
comment
Вы также, вероятно, захотите проверить это минимально необходимое время импульса сброса и сравнить его с импульсом, сгенерированным на nRST STM, когда вы выполняете программный сброс (сторожевой таймер, сброс ядра, например, через NVIC_SystemReset). Если он длиннее, чем один вывод STM, вы можете позже столкнуться с проблемами в полевых условиях, когда, например, выполняете обновление прошивки и выполняете сброс программного обеспечения.   -  person Jacek Ślimok    schedule 22.03.2019
comment
Спасибо за ответы! Да, я тоже подумал об этом, добавил кнопку сброса и обнаружил, что более длительный аппаратный сброс тоже не работает. Просто для теста, и хотя сброс происходит без него, я пробовал его с подтягивающими резисторами разных номиналов, но безуспешно.   -  person Jack    schedule 22.03.2019
comment
Наконец я решил это. Это была программная проблема. Или на самом деле ремни в HW кажутся неправильными, что я решил в SW. Добавив в код одну строчку. После программного сброса LAN8942A я установил бит автосогласования (бит 12) в регистре BCR (0x00). Я обновлю код в github, для тех, кому интересно.   -  person Jack    schedule 25.03.2019
comment
Пожалуйста, воздержитесь от добавления в заголовок РЕШЕННЫХ. См. meta.stackexchange.com/questions/116101/. Вместо этого ответьте на свой вопрос ниже.   -  person    schedule 25.03.2019
comment
@ Джек, поздравляю. Пожалуйста, добавьте это как ответ на свой вопрос и отметьте его как решенный. Это будет отображаться как решенное в списке вопросов для других.   -  person Jacek Ślimok    schedule 25.03.2019


Ответы (1)


Решено: после кода, выполняющего программный сброс LAN8942A, я добавил одну строку для установки бита автосогласования (бит 12) в регистре BCR (0x00).

pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_AUTONEGO_EN);

Я обновлю код в github, для тех, кому интересно.

person Jack    schedule 25.03.2019
comment
Добро пожаловать в Stack Overflow. Вы сможете принять свой ответ по истечении определенного времени (я думаю, 2 часа) и получить бесплатную репутацию. А пока проголосуйте и добро пожаловать в SO. - person ; 25.03.2019