реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> TCP/IP и UDP на Nucleo-F767ZI
geotox
сообщение Jun 11 2018, 15:31
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



Ребят, всем привет!
Недавно столкнулся с задачей имплементации TCP/IP / UDP на STM32. До этого работал с микроконтроллерами PIC от Microchip. Погуглив немного, нашел решения, использующие lwIP для реализации TCP/IP. Использовать сторонние либы не хочется, поэтому вопрос - насколько сложна имплементация вышеуказанных протоколов посредством только регистров? Использование HAL и схожих библиотек также не приветствуется.
Для реализации используется Nucleo-F767ZI с STM32F767ZI и LAN8742A на борту.
Для начала пытаюсь разобраться с настройкой LAN8742A. Первое, что меня смутило, это то, что в документации к Nucleo-F767ZI сказано, что соединение между мк и модулем LAN8742A происходит посредством интерфейса RMII, в то время как регистры LAN8742A настраиваются через SMI. Так как настроить LAN8742A через мк?
Заранее спасибо!
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 11 2018, 15:51
Сообщение #2


developer
****

Группа: Свой
Сообщений: 892
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



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

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

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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
geotox
сообщение Jun 11 2018, 16:01
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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

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

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


Спасибо большое за столь быстрый ответ! Значит, как я понял из вашего сообщения, для управления регистрами LAN8742A через STM, нужно на нем использовать MDIOS? Стек наподобие uIP буду писать (во всяком постараюсь) сам.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 11 2018, 16:45
Сообщение #4


developer
****

Группа: Свой
Сообщений: 892
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



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


Я не знаю как именно этот интерфейс в STM32F767ZI назвали. Они любят там всякие буковки добавлять.
Посмотрите по схеме куда ножки MDC и MDIO от LAN8742A идут и узнаете как периферия называется.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
geotox
сообщение Jun 11 2018, 17:16
Сообщение #5





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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


Нет, ошибся, все же RMII переферия оказалась.
Go to the top of the page
 
+Quote Post
yes
сообщение Jun 12 2018, 18:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 173
Регистрация: 23-12-04
Пользователь №: 1 640



проверьте на примере из CUBE, что работает эзернет - в 767 ошибка в RMII интерфейсе (или см еррату для проверки ревизии чипа)
Go to the top of the page
 
+Quote Post
geotox
сообщение Jul 29 2018, 18:29
Сообщение #7





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



Ребят, всем привет! Поднял в итоге Ethernet + DMA. Сейчас пытаюсь отослать UDP пакет на PC. Как понял, можно посылать пакет сразу, без всяких приветствий и рукопожатий. Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный. Некоторые пакеты имеют header-ы как и IPv4 так и UDP, остальные только UDP. Есть ли у кого пример?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 29 2018, 18:33
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 470
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(geotox @ Jul 29 2018, 21:29) *
Единственное не пойму какой вид имеет UDP пакет. Везде в интернете он разный.

Это зависит в каком сечении Семиуровневой модели OSI вы смотрите.
Go to the top of the page
 
+Quote Post
geotox
сообщение Jul 29 2018, 18:47
Сообщение #9





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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

А можно немного поподробнее? Спасибо!
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 29 2018, 19:38
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 470
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

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

Семиуровневая модель OSI
Go to the top of the page
 
+Quote Post
geotox
сообщение Aug 5 2018, 19:33
Сообщение #11





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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


Как думаете, куда копать?
Go to the top of the page
 
+Quote Post
geotox
сообщение Aug 6 2018, 15:24
Сообщение #12





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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 подключен напрямую к ПК, без роутера. В чем может быть проблема?
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 7 2018, 08:14
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

В ARP
arp запросы видны в wireshark?
Go to the top of the page
 
+Quote Post
geotox
сообщение Aug 7 2018, 18:57
Сообщение #14





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



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

Да, по всей видимости вы правы. Запросы есть, ответов нет... LWIP_ARP дефайн существует.
Go to the top of the page
 
+Quote Post
geotox
сообщение Aug 11 2018, 11:21
Сообщение #15





Группа: Участник
Сообщений: 9
Регистрация: 11-06-18
Пользователь №: 105 009



Ребят, что посоветуете сделать, если и STM и PC шлют друг другу ARP запросы, но ни один на них не отвечает? Все запросы видны в Wireshark.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2018 - 23:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01074 секунд с 7
ELECTRONIX ©2004-2016