Jump to content

    

STM32F407VG + LAN8720 ETH BOARD (Waveshare)

Пытаюсь запустить эзернет на 407, используя готовый модуль от waveshare.

В кубе добавляю ETH по RMII, в настройках ввожу МАК и выставляю PHY Address в 1 (нашел в даташите для этого модуля) и больше ничего не трогаю.

Подключаю к этому LWIP, в нем отключаю DHCP и руками задаю маску и шлюз роутера + вписываю свободный ip. Включаю UDP и больше ничего не трогаю.

Собираю проект, в переменные добавляю структуру gnetif, а в бесконечном цикле функции для постоянной работы стека (ethernetif_input и sys_check_timeouts).

После прошивки в контроллер плата по указанному ip не пингуется, а роутер не находит новое устройство с указанным маком. Перепроверил все подключения на правильность, прослушал контакты - все в порядке.

Уже отчаялся, так и не могу понять в чем заключается проблема...

     

blob.png

blob.png

blob.png

blob.png

Edited by remixx

Share this post


Link to post
Share on other sites

У вас где-то должна быть функция

/**
  * LwIP initialization function
  */
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
  IP_ADDRESS[0] = IP_ADDRESS_0;
  IP_ADDRESS[1] = IP_ADDRESS_1;
  IP_ADDRESS[2] = IP_ADDRESS_2;
  IP_ADDRESS[3] = IP_ADDRESS_3;
    
  NETMASK_ADDRESS[0] = NETMASK_ADDRESS_0;
  NETMASK_ADDRESS[1] = NETMASK_ADDRESS_1;
  NETMASK_ADDRESS[2] = NETMASK_ADDRESS_2;
  NETMASK_ADDRESS[3] = NETMASK_ADDRESS_3;

  GATEWAY_ADDRESS[0] = GATEWAY_ADDRESS_0;
  GATEWAY_ADDRESS[1] = GATEWAY_ADDRESS_1;
  GATEWAY_ADDRESS[2] = GATEWAY_ADDRESS_2;
  GATEWAY_ADDRESS[3] = GATEWAY_ADDRESS_3;
  
  /* Initilialize the LwIP stack without RTOS */

  lwip_init();

  /* IP addresses initialization without DHCP (IPv4) */
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) without RTOS */
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

  /* Registers the default network interface */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
	/* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
	/* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }

Которую вы должны вызвать в main() до wile(1)

А так же должна быть функция настройки тактовой частоты

/* Configure the system clock */
	SysClock_Init();
	SystemCoreClockUpdate();

 

Share this post


Link to post
Share on other sites
1 minute ago, dimka76 said:

У вас где-то должна быть функция


/**
  * LwIP initialization function
  */
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
  IP_ADDRESS[0] = IP_ADDRESS_0;
  IP_ADDRESS[1] = IP_ADDRESS_1;
  IP_ADDRESS[2] = IP_ADDRESS_2;
  IP_ADDRESS[3] = IP_ADDRESS_3;
    
  NETMASK_ADDRESS[0] = NETMASK_ADDRESS_0;
  NETMASK_ADDRESS[1] = NETMASK_ADDRESS_1;
  NETMASK_ADDRESS[2] = NETMASK_ADDRESS_2;
  NETMASK_ADDRESS[3] = NETMASK_ADDRESS_3;

  GATEWAY_ADDRESS[0] = GATEWAY_ADDRESS_0;
  GATEWAY_ADDRESS[1] = GATEWAY_ADDRESS_1;
  GATEWAY_ADDRESS[2] = GATEWAY_ADDRESS_2;
  GATEWAY_ADDRESS[3] = GATEWAY_ADDRESS_3;
  
  /* Initilialize the LwIP stack without RTOS */

  lwip_init();

  /* IP addresses initialization without DHCP (IPv4) */
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) without RTOS */
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

  /* Registers the default network interface */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
	/* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
	/* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }

Которую вы должны вызвать в main() до wile(1)

А так же должна быть функция настройки тактовой частоты


/* Configure the system clock */
	SysClock_Init();
	SystemCoreClockUpdate();

 

Я так понимаю настройку тактовой частоты выполняет функция SystemClock_Config, после неё вызывается MX_LWIP_Init вместе с функциями инициализации портов и таймера, а уже после идет цикл.

blob.png.626563cc6911eb19ce046075ff7b202f.png

 

Share this post


Link to post
Share on other sites
5 minutes ago, remixx said:

Я так понимаю настройку тактовой частоты выполняет функция SystemClock_Config, после неё вызывается MX_LWIP_Init вместе с функциями инициализации портов и таймера, а уже после идет цикл.

 

Да

Share this post


Link to post
Share on other sites
2 minutes ago, dimka76 said:

 

Да

Тогда все функции есть :biggrin:

Share this post


Link to post
Share on other sites

Посмотрите файл opt.h.

Может там что-то подстроить надо.

Share this post


Link to post
Share on other sites
5 minutes ago, dimka76 said:

Посмотрите файл opt.h.

Может там что-то подстроить надо.

по конкретней бы(
похоже что это файл настроек, которые в кубе находятся в LWIP->Key options, там не менял ничего в соответствии с теми уроками по которым собственно и делал этот проект

Share this post


Link to post
Share on other sites
4 часа назад, remixx сказал:

Пытаюсь запустить эзернет на 407, используя готовый модуль от waveshare

Зачем изобретать велосипед, если если есть уже готовый проект, связывающий 407 контроллер с LAN8720. По-моему я его скачивал  с сайта STM. Там заточено как под Standalone, так и под FreeRTOS. Проект рабочий - лично проверял (тоже после покупки демо-платок с 407VET6 и LAN8720 проверял работу связки и вникал в принцип Ethernet). Так что скачай готовый и залей в МК. Будет тебе счастье :bb:

 

Share this post


Link to post
Share on other sites
15 minutes ago, Byte1024 said:

Зачем изобретать велосипед, если если есть уже готовый проект, связывающий 407 контроллер с LAN8720. По-моему я его скачивал  с сайта STM. Там заточено как под Standalone, так и под FreeRTOS. Проект рабочий - лично проверял (тоже после покупки демо-платок с 407VET6 и LAN8720 проверял работу связки и вникал в принцип Ethernet). Так что скачай готовый и залей в МК. Будет тебе счастье :bb:

 

сейчас буду разбираться

может быть проблема даже не в самом коде, потому что после прошивки и подключения интернет кабеля на разъеме rj45 начинает гореть зеленый светодиод, это по идеи означает что соединение по локальной сети установлено. Может что-то мешает конкретно добавить новое устройство в сеть?

Edited by remixx

Share this post


Link to post
Share on other sites

Должен один светодиод светиться постоянно, а второй мигать хаотично. Но это не является гарантированой работой библиотеки LwIP. Платка должна по крайней мере пинговаться с ПК.

https://www.element14.com/community/docs/DOC-51670/l/stm32f4dis-bb-discover-more-software-examples

Вот ссылка на готовые 100% рабочие проекты.

Share this post


Link to post
Share on other sites
9 minutes ago, Byte1024 said:

Должен один светодиод светиться постоянно, а второй мигать хаотично. Но это не является гарантированой работой библиотеки LwIP. Платка должна по крайней мере пинговаться с ПК.

https://www.element14.com/community/docs/DOC-51670/l/stm32f4dis-bb-discover-more-software-examples

Вот ссылка на готовые 100% рабочие проекты.

скачал, но на работе нельзя ставить кейл (использую систем воркбенч), дома попробую запуститься)

Share this post


Link to post
Share on other sites
22 minutes ago, Byte1024 said:

Так в архиве под IAR есть проект (EWARM).

воркбенч тоже не видит их

upd: тут недопонимание - я использую stm32systemworkbench)

Edited by remixx

Share this post


Link to post
Share on other sites
8 hours ago, remixx said:

Уже отчаялся, так и не могу понять в чем заключается проблема...

Ваша основная проблема заключается в том, что вы свою работу свалили на плечи других. Вместо того, чтобы разобраться с lan8720, модулем MAC у STM'ки, вы используете куб, не понимая сути работы. В прошлом году запускал lan8720 + LPC4337. Прежде, чем всё заработало около недели шерстил даташит на phy'тер, документацию на стэк и модуль MAC. Большую помощь оказала программа wireshark. Конечно, разномастные примеры разной степени качества тоже оказали услугу. Но основную часть работы я делал сам.

7 hours ago, remixx said:

по конкретней бы(

Документацию на стек почитайте. Она в свободном доступе. Есть нюанс, если стэк одной из крайних версий, то документация может оказаться только для предыдущей версии.

Запустите wireshark, оно позволит увидеть, ходят ли хоть какие-то пакеты, пусть битые, с кривой контрльной суммой. Но всё-таки это лучше, чем гадать на кофейной гуще. Кстати, эта прога помогла мне настроить стэк: в нём стояла опция аппаратного расчёта контрольных сумм, а LPC4337 это не поддерживал. Поменял опцию, и всё заработало))) Но до этого, как я написал. потратил около недели.

Share this post


Link to post
Share on other sites
В 05.07.2019 в 09:30, remixx сказал:

Пытаюсь запустить эзернет на 407, используя готовый модуль от waveshare.

курите область Advanced parameters (ETH) в кубе

сравнивайте эти данные с ДШ на 7820.

По своим наблюдениям:

там переменные, который куб подставляет по умолчанию, разнятся с ДШ.

Сам помню часа 2 пыхтел - на отладочной плате заводилось на своей фиг.

(могу ошибаться: где то маска не соответствовала)

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now