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

STM32F429I-DISC1 + DP83848. Не инициализируется LwIP

Привет! Использую микроконтроллер STM32F429ZI-DISC1 с микропроцессором на нём STM32F429ZIT6, + DP83848. Пробую написать прогу через которую этот микроконтроллер будет обмениваться с компом данными по Modbus TCP.

Проблема в инициализации LWIP. Обратил внимание на следующий цикл:

while (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR) > 0U)
  {
    if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
    {
      /* Set Error Code */
      heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
      /* Set State as Error */
      heth->gState = HAL_ETH_STATE_ERROR;
      /* Return Error */
      return HAL_ERROR;
    }
  }

Не происходит программный сброс, бит не сбрасывается в 0. Эту проблему я решил путём комментирования return и добавления break в конце цикла (источник: https://www.programmersought.com/article/52516336171/), LWIP начал инициализироваться, но в таком случае нет эхо в Wiresharke и он спрашивает "Who is ..." про IP. В одной из тем это решили путём подтягивания MII_INT к питанию:

Там используется MII, в моём же случае - RMII, и я не понимаю какой там пин может отвечать за MII_INT и как его определить по схеме со схемой DP83848, и как будет отвечать с RMII у меня. Хотелось бы "излечить причину болезни", а не "симптомы" путём комментирования return. Буду благодарен любой помощи.

Ещё смущает то, что на самой DP83848 горит только оранжевый диод, зелёный не светит и не моргает. На всякий случай ещё распишу как подключил пины:

Спойлер

DP83848 - STM32F429ZIT6

TX_EN - PG11

TX0 - PG13

TX1 - PG14

CRS - PA7

RX0 - PC4 

RX1 - PC5

MDIO - PA2

OSCIN  - PA1 (REF_CLK in configuration)

MDC - PC1

VCC - 3V

GND - GND

image.thumb.png.ca7a3db072838170860bdfe3c821806b.png

image.thumb.png.5260ea8e2a830ff4e66065dac8b0e835.png

image.thumb.png.143524090c0fb11c07a8f663554ebb0a.png

image.thumb.png.8d64045c7b87e256f04ad8afb698195b.png

image.png.7b1e6099d5afbf026c71b7f2a7afd7cc.png

image.png.a22b1a4cee698b237bffb9e218759082.png

 

096DP83848TCP.ioc

Соврал на счёт диодов на DP83848: посмотрел, горят оба диода постоянно. Зелёный никак не мигает, горит как и оранжевый постоянно.

Изменено пользователем haker_fox
Переместил в раздел STM32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно этот бит не устанавливается, пока с PHY не начнет приходить частота на вход ETH_RMII _REF_CLK. У вас она приходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, Grootoportunities сказал:

Привет! Использую микроконтроллер STM32F429ZI-DISC1 с микропроцессором на нём STM32F429ZIT6, + DP83848. Пробую написать прогу через которую этот микроконтроллер будет обмениваться с компом данными по Modbus TCP.

Проблема в инициализации LWIP. Обратил внимание на следующий цикл:

while (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR) > 0U)
  {
    if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
    {
      /* Set Error Code */
      heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
      /* Set State as Error */
      heth->gState = HAL_ETH_STATE_ERROR;
      /* Return Error */
      return HAL_ERROR;
    }
  }

Не происходит программный сброс, бит не сбрасывается в 0. Эту проблему я решил путём комментирования return и добавления break в конце цикла (источник: https://www.programmersought.com/article/52516336171/), LWIP начал инициализироваться, но в таком случае нет эхо в Wiresharke и он спрашивает "Who is ..." про IP. В одной из тем это решили путём подтягивания MII_INT к питанию:

Там используется MII, в моём же случае - RMII, и я не понимаю какой там пин может отвечать за MII_INT и как его определить по схеме со схемой DP83848, и как будет отвечать с RMII у меня. Хотелось бы "излечить причину болезни", а не "симптомы" путём комментирования return. Буду благодарен любой помощи.

Ещё смущает то, что на самой DP83848 оба диода (оранжевый и зелёный) горят постоянно. Разве зелёный не должен моргать при передаче данных? На всякий случай ещё распишу как подключил пины:

  Показать контент

DP83848 - STM32F429ZIT6

TX_EN - PG11

TX0 - PG13

TX1 - PG14

CRS - PA7

RX0 - PC4 

RX1 - PC5

MDIO - PA2

OSCIN  - PA1 (REF_CLK in configuration)

MDC - PC1

VCC - 3V

GND - GND

image.thumb.png.ca7a3db072838170860bdfe3c821806b.png

image.thumb.png.5260ea8e2a830ff4e66065dac8b0e835.png

image.thumb.png.143524090c0fb11c07a8f663554ebb0a.png

image.thumb.png.8d64045c7b87e256f04ad8afb698195b.png

image.png.7b1e6099d5afbf026c71b7f2a7afd7cc.png

image.png.a22b1a4cee698b237bffb9e218759082.png

 

096DP83848TCP.ioc

 

3 минуты назад, Сергей Борщ сказал:

Обычно этот бит не устанавливается, пока с PHY не начнет приходить частота на вход ETH_RMII _REF_CLK. У вас она приходит?

Если посмотреть это возможно только с осциллографом или мультиметром, то к сожалению у меня их нет в наличии 😞 Или можно это как-то узнать другим способом?

Заранее прошу прощения за своё незнание, только недавно влился в работу с микроконтроллерами 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Сергей Борщ сказал:

Обычно этот бит не устанавливается, пока с PHY не начнет приходить частота на вход ETH_RMII _REF_CLK. У вас она приходит?

По datasheet GPIOA (ETH_REF_CLK - PA1) у меня подключен к шине AHB1. По Clock Configuration на шину AHB у меня идёт 180MHz, если я конечно правильно всё посмотрел по вашему вопросу.

image.thumb.png.a488e4dc287b661e748772642eff8363.png

 image.png.885b6808f9da0dffe609ca5da056bba0.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, Grootoportunities сказал:

Если посмотреть это возможно только с осциллографом или мультиметром,

Просто наличие частоты можно посмотреть даже 2 послед. включенными светодиодами с общей точкой - 1 диод на + другой на - ср. точка на сигнал, с резисторами разумеется)). если частота есть - будут светится оба...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, mantech сказал:

Просто наличие частоты можно посмотреть даже 2 послед. включенными светодиодами с общей точкой - 1 диод на + другой на - ср. точка на сигнал, с резисторами разумеется)). если частота есть - будут светится оба...

 

Спасибо за совет, но в скором времени лучше раздобуду осцил и посмотрю на нём приходит ли частота, мне кажется им проще) Как посмотрю - отпишусь 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Grootoportunities сказал:

По datasheet GPIOA (ETH_REF_CLK - PA1) у меня подключен к шине AHB1. По Clock Configuration на шину AHB у меня идёт 180MHz, если я конечно правильно всё посмотрел по вашему вопросу.

На эту ногу должен приходить сигнал REF_CLK частотой 50 МГц от внешнего источника:

image.png.b8880863a6ea24d170c9b9cfdad12a42.png

Некоторые RMII_PHY (я использовал LAN8720A) умеют сами генерить этот сигнал:

image.thumb.png.ac06c3f8b1252bfd04a16f36bb24dcea.png

Ваша DP83848 такого делать не умеет, ей требуется эти же 50 МГц подать на вход X1:

image.thumb.png.b503d650c2ff02e40204ee0edddcc8bb.png

Ищите, кто в вашей схеме должен производить эти 50 МГц. Возможно, они берутся с выхода MCO1 или MCO2 контроллера (STM32F407), тогда вам нужно в вашей программе настроить соответствующим образом PLL и выход MCO.

2 часа назад, Grootoportunities сказал:

Если посмотреть это возможно только с осциллографом или мультиметром, то к сожалению у меня их нет в наличии 😞 Или можно это как-то узнать другим способом?

В отладчике откройте окно с регистрами периферии, найдите там регистр GPIOA->IDR, сделайте несколько шагов по циклу ожидания ETH_DMABMR_SR наблюдая за битом 1 в GPIOA->IDR. Если частота на этом выводе присутствует - в момент чтения регистра после остановки ядра отладчик будет попадать то на высокий, то на низкий уровень и вы будете наблюдать то 0, то 1 в бите, соответствующем PA1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 29.06.2023 в 13:30, Сергей Борщ сказал:

Ищите, кто в вашей схеме должен производить эти 50 МГц. Возможно, они берутся с выхода MCO1 или MCO2 контроллера (STM32F407), тогда вам нужно в вашей программе настроить соответствующим образом PLL и выход MCO.

В отладчике откройте окно с регистрами периферии, найдите там регистр GPIOA->IDR, сделайте несколько шагов по циклу ожидания ETH_DMABMR_SR наблюдая за битом 1 в GPIOA->IDR. Если частота на этом выводе присутствует - в момент чтения регистра после остановки ядра отладчик будет попадать то на высокий, то на низкий уровень и вы будете наблюдать то 0, то 1 в бите, соответствующем PA1.

В общем, проверил на осциллографе ногу PA1 - выдаёт 50МГц, но линия какая-то странная, то есть, то нет (возможно дело в проводах, они плохо держат и отходят легко, скоро подключу новыми проводами). 

В окне с регистрами периферии проверил регистры IDR. При проходе цикла, IDR1 (как я понимаю, именно он отвечает за PA1), бит в нём не меняется (0x0). Странно получается, по регистрам частоты нет, а по осциллографу есть?

Подключил ещё MCO1 (PA8) через HSE на 8MHz  (как и Input Frequency)- он меняется.

image.png.27f539df72df48107ef63af4d00fc869.png

image.png.6470adea016b614b0e203fd0db68cb9c.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Короче, проблема инициализации LWIP была в проводах 🙄 Теперь в дебаге код не останавливается на данном цикле и проходит дальше функции инициализации в main и без комментирования ретёрна. Но в Вайршарке по прежнему нет эхо, и про данный айпишник всё тот же вопрос - "Who has ... ?"

image.thumb.png.9df480cd6435f45a07bb70a923b7618c.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Grootoportunities сказал:

В общем, проверил на осциллографе ногу PA1 - выдаёт 50МГц, но линия какая-то странная, то есть, то нет (возможно дело в проводах, они плохо держат и отходят легко, скоро подключу новыми проводами).

Вы 50 МГц по какой-то лапше гоняете и ещё удивляетесь что оно нестабильно работает???  :shok: :mosking:

Сразу надо было писать, что у вас всё на соплях висит....  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, jcxz сказал:

Вы 50 МГц по какой-то лапше гоняете и ещё удивляетесь что оно нестабильно работает???  :shok: :mosking:

Сразу надо было писать, что у вас всё на соплях висит....  

Действительно сглупил, внешне они выглядели нормально, но легко можно было их потревожить лишь дотронувшись до них) Понял это только после сигнала осциллографа

Сейчас нужно понять в чём причина того, что в вайршарке ругается на айпишник

Изменено пользователем Grootoportunities

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, Grootoportunities сказал:

Сейчас нужно понять в чём причина того, что в вайршарке ругается на айпишник

Он не ругается. Судя по вашим настройкам из первого сообщения, ваше устройство имеет адрес 192.168.1.193. 192.168.1.1 - шлюз. 192.168.1.192 - адрес компьютера, с которого вы пытаетесь связаться с железкой? Так вот этот компьютер хочет послать что-то за пределами вашей подсети (отчет дяде Биллу или просто запросить у мирового разума текущее время), для этого он должен послать пакет через шлюз и запросами "Who has 192.168.1.1" ищет шлюз. На этот запрос должен ответить шлюз. Пинг с компа на железку судя по последней картинке у вас проходит, то есть железка принимает запросы и отвечает на них. Непонятно, что вам не нравится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Сергей Борщ сказал:

Он не ругается. Судя по вашим настройкам из первого сообщения, ваше устройство имеет адрес 192.168.1.193. 192.168.1.1 - шлюз. 192.168.1.192 - адрес компьютера, с которого вы пытаетесь связаться с железкой? Так вот этот компьютер хочет послать что-то за пределами вашей подсети (отчет дяде Биллу или просто запросить у мирового разума текущее время), для этого он должен послать пакет через шлюз и запросами "Who has 192.168.1.1" ищет шлюз. На этот запрос должен ответить шлюз. Пинг с компа на железку судя по последней картинке у вас проходит, то есть железка принимает запросы и отвечает на них. Непонятно, что вам не нравится?

В ответе, который я прикрепил ниже, у человека, который разобрался с проблемой, в вайршарке есть сообщения с протоколом ICMP и echo реквестом и реплаем (в скриншоте).

Я думал, раз синициализироовался LWIP, при пинге айпишника через cmd должны приходить такие же сообщения в вайршарке. Я чего-то не понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Grootoportunities сказал:

Я думал, раз синициализироовался LWIP, при пинге айпишника через cmd должны приходить такие же сообщения в вайршарке.

Причём тут сообщения к 192.168.1.1 если у вас комп и устройство - в одной подсети? Зачем тогда смотрите на сообщения к шлюзу? Шлюз используется только при обращении за пределы подсети. Ищите сообщения с IP своего устройства.

А то что в логе шарка много ARP к 192.168.1.1, говорит возможно о том, что: или шлюз почему-то не отвечает (неправильно сконфигурена сеть?); или о том, что на запрашивающем устройстве (192.168.1.192?) почему-то не работает ARP-кеш; или ...

1 час назад, Grootoportunities сказал:

Я чего-то не понимаю?

Не понимаете принципов работы сетевых устройств?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...