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

TCP/IP и UDP на Nucleo-F767ZI

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

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

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

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

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

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


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

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

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

 

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

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

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

 

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

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

 

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


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

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

 

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

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

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

 

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

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

 

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

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


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

 

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

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

 

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


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

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

 

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

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


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

проверьте на примере из CUBE, что работает эзернет - в 767 ошибка в RMII интерфейсе (или см еррату для проверки ревизии чипа)

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный.

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

 

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


Ссылка на сообщение
Поделиться на другие сайты
Это зависит в каком сечении Семиуровневой модели OSI вы смотрите.

А можно немного поподробнее? Спасибо!

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


Ссылка на сообщение
Поделиться на другие сайты
А можно немного поподробнее? Спасибо!

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

 

Семиуровневая модель OSI

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


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

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

 

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Как только указываю IP компьютера, пакеты перестают приходить. STM подключен напрямую к ПК, без роутера. В чем может быть проблема?

В ARP

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

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


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

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

Да, по всей видимости вы правы. Запросы есть, ответов нет... LWIP_ARP дефайн существует.

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


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

Ребят, что посоветуете сделать, если и STM и PC шлют друг другу ARP запросы, но ни один на них не отвечает? Все запросы видны в Wireshark.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация