Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TCP/IP и UDP на Nucleo-F767ZI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
geotox
Ребят, всем привет!
Недавно столкнулся с задачей имплементации TCP/IP / UDP на STM32. До этого работал с микроконтроллерами PIC от Microchip. Погуглив немного, нашел решения, использующие lwIP для реализации TCP/IP. Использовать сторонние либы не хочется, поэтому вопрос - насколько сложна имплементация вышеуказанных протоколов посредством только регистров? Использование HAL и схожих библиотек также не приветствуется.
Для реализации используется Nucleo-F767ZI с STM32F767ZI и LAN8742A на борту.
Для начала пытаюсь разобраться с настройкой LAN8742A. Первое, что меня смутило, это то, что в документации к Nucleo-F767ZI сказано, что соединение между мк и модулем LAN8742A происходит посредством интерфейса RMII, в то время как регистры LAN8742A настраиваются через SMI. Так как настроить LAN8742A через мк?
Заранее спасибо!
dimka76
UDP с нуля за один-два дня написать можно, он простой как палка. Несколько поковыряться придется, если вы захотите использовать
фрагментацию IP пакетов.

Можно использовать вместо lwIP стек uIP. Но его сейчас в чистом виде нет. Он входит в состав Contiki.
Но можно попытаться поискать старые версии. Он написан тем же автором.
uIP тоже достаточно простой.

По RMII происходит обмен данными (выход в сеть).
Для управления регистрами служит интерфейс MDC/MDIO.
geotox
Цитата(dimka76 @ Jun 11 2018, 19:51) *
UDP с нуля за один-два дня написать можно, он простой как палка. Несколько поковыряться придется, если вы захотите использовать
фрагментацию IP пакетов.

Можно использовать вместо lwIP стек uIP. Но его сейчас в чистом виде нет. Он входит в состав Contiki.
Но можно попытаться поискать старые версии. Он написан тем же автором.
uIP тоже достаточно простой.

По RMII происходит обмен данными (выход в сеть).
Для управления регистрами служит интерфейс MDC/MDIO.


Спасибо большое за столь быстрый ответ! Значит, как я понял из вашего сообщения, для управления регистрами LAN8742A через STM, нужно на нем использовать MDIOS? Стек наподобие uIP буду писать (во всяком постараюсь) сам.
dimka76
Цитата(geotox @ Jun 11 2018, 19:01) *
для управления регистрами LAN8742A через STM, нужно на нем использовать MDIOS? Стек наподобие uIP буду писать (во всяком постараюсь) сам.


Я не знаю как именно этот интерфейс в STM32F767ZI назвали. Они любят там всякие буковки добавлять.
Посмотрите по схеме куда ножки MDC и MDIO от LAN8742A идут и узнаете как периферия называется.
geotox
Цитата(dimka76 @ Jun 11 2018, 20:45) *
Я не знаю как именно этот интерфейс в STM32F767ZI назвали. Они любят там всякие буковки добавлять.
Посмотрите по схеме куда ножки MDC и MDIO от LAN8742A идут и узнаете как периферия называется.


Нет, ошибся, все же RMII переферия оказалась.
yes
проверьте на примере из CUBE, что работает эзернет - в 767 ошибка в RMII интерфейсе (или см еррату для проверки ревизии чипа)
geotox
Ребят, всем привет! Поднял в итоге Ethernet + DMA. Сейчас пытаюсь отослать UDP пакет на PC. Как понял, можно посылать пакет сразу, без всяких приветствий и рукопожатий. Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный. Некоторые пакеты имеют header-ы как и IPv4 так и UDP, остальные только UDP. Есть ли у кого пример?
VladislavS
Цитата(geotox @ Jul 29 2018, 21:29) *
Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный.

Это зависит в каком сечении Семиуровневой модели OSI вы смотрите.
geotox
Цитата(VladislavS @ Jul 29 2018, 22:33) *
Это зависит в каком сечении Семиуровневой модели OSI вы смотрите.

А можно немного поподробнее? Спасибо!
VladislavS
Цитата(geotox @ Jul 29 2018, 21:47) *
А можно немного поподробнее? Спасибо!

Я думал бан в гугле это прикол, ан нет...

Семиуровневая модель OSI
geotox
Решил все же испробовать lwIP. Подключил плату напрямую к компу. Установил IP адреса:
Код
  IP_ADDRESS[0] = 192;
  IP_ADDRESS[1] = 168;
  IP_ADDRESS[2] = 1;
  IP_ADDRESS[3] = 107;
  NETMASK_ADDRESS[0] = 255;
  NETMASK_ADDRESS[1] = 255;
  NETMASK_ADDRESS[2] = 255;
  NETMASK_ADDRESS[3] = 0;
  GATEWAY_ADDRESS[0] = 192;
  GATEWAY_ADDRESS[1] = 168;
  GATEWAY_ADDRESS[2] = 1;
  GATEWAY_ADDRESS[3] = 1;


Теперь посылаю каждую секунду на комп инфу:
Код
void udp_client_send(void)
{
  struct pbuf *p;
  sprintf(str1, "Test Data...");
  p = pbuf_alloc(PBUF_TRANSPORT, strlen(str1), PBUF_POOL);

  if (p != NULL)
  {
    pbuf_take(p, (void *) str1, strlen(str1));
    udp_send(upcb, p);
    pbuf_free(p);
  }
}


На PC поднимаю UDP сервер при помощи програмы Hercules, которая ничего не принимает.

Стандартная инициализация.
Код
void udp_init_connection(void)
{
    ip_addr_t dest_ip;
    err_t err;
    upcb = udp_new();

    if (upcb != NULL)
    {
        IP4_ADDR(&dest_ip, 192, 168, 1, 107);
        upcb->local_port = 1556;
        err = udp_connect(upcb, &dest_ip, 1555);
    }

    if (err == ERR_OK)
    {
        udp_recv(upcb, udp_receive_callback, NULL);
    }
}


Как думаете, куда копать?
geotox
UPD:
Решил пойти от обратного. Создал UDP сервер на STM32:
Код
void udp_init_connection(void)
{
    ip_addr_t dest_ip;
    err_t err;
    upcb = udp_new();

    if (upcb != NULL)
    {
        IP4_ADDR(&dest_ip, 169, 254, 166, 3);
        err = udp_bind(upcb, &dest_ip, 22);
        upcb->local_port = 22;
        IP4_ADDR(&dest_ip, 0, 0, 0, 0);
        upcb->remote_ip = dest_ip;
        upcb->remote_port = 22;
    }

    if (err == ERR_OK)
    {
        udp_recv(upcb, udp_receive_callback, NULL);
    }
}


Прописал новые IP в функции инициализации lwip:
Код
  IP_ADDRESS[0] = 169;
  IP_ADDRESS[1] = 254;
  IP_ADDRESS[2] = 166;
  IP_ADDRESS[3] = 3;
  NETMASK_ADDRESS[0] = 255;
  NETMASK_ADDRESS[1] = 255;
  NETMASK_ADDRESS[2] = 0;
  NETMASK_ADDRESS[3] = 0;
  GATEWAY_ADDRESS[0] = 169;
  GATEWAY_ADDRESS[1] = 254;
  GATEWAY_ADDRESS[2] = 166;
  GATEWAY_ADDRESS[3] = 1;


Теперь, когда remote_ip = 0.0.0.0 в WireShark вижу посланный с STM32 пакет. Как только указываю IP компьютера, пакеты перестают приходить. STM подключен напрямую к ПК, без роутера. В чем может быть проблема?
KRS
Цитата(geotox @ Aug 6 2018, 18:24) *
Как только указываю IP компьютера, пакеты перестают приходить. STM подключен напрямую к ПК, без роутера. В чем может быть проблема?

В ARP
arp запросы видны в wireshark?
geotox
Цитата(KRS @ Aug 7 2018, 12:14) *
В ARP
arp запросы видны в wireshark?

Да, по всей видимости вы правы. Запросы есть, ответов нет... LWIP_ARP дефайн существует.
geotox
Ребят, что посоветуете сделать, если и STM и PC шлют друг другу ARP запросы, но ни один на них не отвечает? Все запросы видны в Wireshark.
Arlleex
Цитата(geotox @ Aug 11 2018, 14:21) *
Ребят, что посоветуете сделать, если и STM и PC шлют друг другу ARP запросы, но ни один на них не отвечает? Все запросы видны в Wireshark.

Ну а акула-то что говорит? В пакете все нормально? Если девайс шлет нормальный ARP-запрос, на него обязательно придет ответ, при условии, конечно же, что в запросе указан IP компа... И наоборот.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.