Jump to content

    
Sign in to follow this  
geotox

TCP/IP и UDP на Nucleo-F767ZI

Recommended Posts

Ребят, всем привет!

Недавно столкнулся с задачей имплементации TCP/IP / UDP на STM32. До этого работал с микроконтроллерами PIC от Microchip. Погуглив немного, нашел решения, использующие lwIP для реализации TCP/IP. Использовать сторонние либы не хочется, поэтому вопрос - насколько сложна имплементация вышеуказанных протоколов посредством только регистров? Использование HAL и схожих библиотек также не приветствуется.

Для реализации используется Nucleo-F767ZI с STM32F767ZI и LAN8742A на борту.

Для начала пытаюсь разобраться с настройкой LAN8742A. Первое, что меня смутило, это то, что в документации к Nucleo-F767ZI сказано, что соединение между мк и модулем LAN8742A происходит посредством интерфейса RMII, в то время как регистры LAN8742A настраиваются через SMI. Так как настроить LAN8742A через мк?

Заранее спасибо!

Share this post


Link to post
Share on other sites

UDP с нуля за один-два дня написать можно, он простой как палка. Несколько поковыряться придется, если вы захотите использовать

фрагментацию IP пакетов.

 

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

Но можно попытаться поискать старые версии. Он написан тем же автором.

uIP тоже достаточно простой.

 

По RMII происходит обмен данными (выход в сеть).

Для управления регистрами служит интерфейс MDC/MDIO.

 

Share this post


Link to post
Share on other sites
UDP с нуля за один-два дня написать можно, он простой как палка. Несколько поковыряться придется, если вы захотите использовать

фрагментацию IP пакетов.

 

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

Но можно попытаться поискать старые версии. Он написан тем же автором.

uIP тоже достаточно простой.

 

По RMII происходит обмен данными (выход в сеть).

Для управления регистрами служит интерфейс MDC/MDIO.

 

Спасибо большое за столь быстрый ответ! Значит, как я понял из вашего сообщения, для управления регистрами LAN8742A через STM, нужно на нем использовать MDIOS? Стек наподобие uIP буду писать (во всяком постараюсь) сам.

Share this post


Link to post
Share on other sites
для управления регистрами LAN8742A через STM, нужно на нем использовать MDIOS? Стек наподобие uIP буду писать (во всяком постараюсь) сам.

 

Я не знаю как именно этот интерфейс в STM32F767ZI назвали. Они любят там всякие буковки добавлять.

Посмотрите по схеме куда ножки MDC и MDIO от LAN8742A идут и узнаете как периферия называется.

 

Share this post


Link to post
Share on other sites
Я не знаю как именно этот интерфейс в STM32F767ZI назвали. Они любят там всякие буковки добавлять.

Посмотрите по схеме куда ножки MDC и MDIO от LAN8742A идут и узнаете как периферия называется.

 

Нет, ошибся, все же RMII переферия оказалась.

Share this post


Link to post
Share on other sites

Ребят, всем привет! Поднял в итоге Ethernet + DMA. Сейчас пытаюсь отослать UDP пакет на PC. Как понял, можно посылать пакет сразу, без всяких приветствий и рукопожатий. Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный. Некоторые пакеты имеют header-ы как и IPv4 так и UDP, остальные только UDP. Есть ли у кого пример?

Share this post


Link to post
Share on other sites
Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный.

Это зависит в каком сечении Семиуровневой модели OSI вы смотрите.

 

Share this post


Link to post
Share on other sites

Решил все же испробовать 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);
    }
}

 

Как думаете, куда копать?

Share this post


Link to post
Share on other sites

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 подключен напрямую к ПК, без роутера. В чем может быть проблема?

Share this post


Link to post
Share on other sites
Как только указываю IP компьютера, пакеты перестают приходить. STM подключен напрямую к ПК, без роутера. В чем может быть проблема?

В ARP

arp запросы видны в wireshark?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this