Как определить, был ли кабель Ethernet отключен во время выполнения - PullRequest
1 голос
/ 14 марта 2019

* Обновление: у Cube есть обратные вызовы Status и Link.Еще не пробовал их, но я ожидаю, что это лучшее решение

Я использую периферийное устройство Ethernet на моем STM32F429ZI с

LWIP Middleware, созданным CubeMX

. Этот вопрос похож, но для ПК.

Мне трудно понять раздел Ethernet в спецификации продукта.Неясно, какие регистры я мог бы посмотреть, чтобы проверить наличие неработающих ссылок.

Я также изучил код LWIP на случай очевидного подхода к просмотру без регистрации.В основном цикле он опрашивает сетевой интерфейс с MX_LWIP_Process.При чтении он знает, есть ли пакет через следующее:

void ethernetif_input(struct netif *netif)
{
  err_t err;
  struct pbuf *p;

  /* move received packet into a new pbuf */
  p = low_level_input(netif);

  /* no packet could be read, silently ignore this */
  if (p == NULL) return;

При отправке функция tcp_output() очень громоздка.В нем есть ошибки для недействительного netif, неверного local_ip и общая ошибка, которую я мог наблюдать, но ничего, что прямо говорит мне о том, что канал не работает.

Моя последняя мысль - у заголовков Ethernet есть светодиоды, которые выключаются, есликабель отключен.Я собираюсь посмотреть на схемы оборудования для STM32F4 DK, чтобы увидеть, смогу ли я их посмотреть.

1 Ответ

0 голосов
/ 22 июня 2019

да, вы можете с обратным вызовом.

Все, что вам нужно, это сделать:

1-) Включить определение LWIP_NETIF_LINK_CALLBACK в файле lwipopts.h. По умолчанию значение может быть 0. Проверьте это.

2-) Инициализировать функцию "netif_set_link_callback (netif, ethernetif_update_config);" в void ethernetif_input (struct netif * netif).

3-) Читайте регистр PHY и делайте что хотите.

См. Мой пример, если кабель Ethernet отсоединен и снова подключен, система перезагрузится сама.

void ethernetif_input(struct netif *netif)
{
 err_t err;
 struct pbuf *p;

 /* move received packet into a new pbuf */
 p = low_level_input(netif);
 uint32_t regvalue = 0;
 netif_set_link_callback(netif, ethernetif_update_config); //added by Volkan
 // Read PHY link status

 if (HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, &regvalue) == HAL_OK) 

{
    if((regvalue & PHY_LINKED_STATUS)== (uint16_t)RESET) 
    {
      // Link status = disconnected
       if (netif_is_link_up(netif))

       {

          netif_set_down(netif);
          printf("unplugged\r\n");
          netif_set_link_down(netif);

      }
  }

else

{

// Link status = connected

    if (!netif_is_link_up(netif))
    {

        printf("plugged\r\n");
        NVIC_SystemReset();

    }
 }
}

/* no packet could be read, silently ignore this */
if (p == NULL) return;

/* entry point to the LwIP stack */
err = netif->input(p, netif);

if (err != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
}

Вот и все.

...