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

Продолжаю мучить изернет для STM32F417 без ОС.

Собрал простую программу на STM32CubeMX с ETH и LWIP. Пытаюсь установить соединение, как показано в примерах

err_t tcp_recv_cb(void *arg, struct tcp_pcb *tpcb,
						 struct pbuf *p, err_t err)
{
return ERR_OK;
}
void tcp_err_cb(void *arg, err_t err)
{
Err = err;
arg_ = arg;
}
err_t tcp_poll_cb(void *arg, struct tcp_pcb *tpcb)
{
return ERR_OK;
}
err_t tcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err)
{
tcp_arg(tcp_pcb_, tcp_pcb_);
tcp_recv(tcp_pcb_,tcp_recv_cb);
tcp_err(tcp_pcb_,tcp_err_cb);

tcp_poll(tcp_pcb_, tcp_poll_cb, 10);
return ERR_OK;
}
err_t tcp_connected_cb(void *arg, struct tcp_pcb *tpcb, err_t err)
{
return ERR_OK;
}
…………………………………………………………………
To_IP_ADDRESS[0] = 169;
To_IP_ADDRESS[1] = 254;
To_IP_ADDRESS[2] = 248;
To_IP_ADDRESS[3] = 45;
My_IP_ADDRESS[0] = 169;
My_IP_ADDRESS[1] = 254;
My_IP_ADDRESS[2] = 61;
My_IP_ADDRESS[3] = 18;

IP4_ADDR(&To_ipaddr, To_IP_ADDRESS[0], To_IP_ADDRESS[1], To_IP_ADDRESS[2], To_IP_ADDRESS[3]);
IP4_ADDR(&My_ipaddr, My_IP_ADDRESS[0], My_IP_ADDRESS[1], My_IP_ADDRESS[2], My_IP_ADDRESS[3]);

tcp_pcb_ = tcp_new();
tcp_setprio(tcp_pcb_,TCP_PRIO_NORMAL);
Err = tcp_bind(tcp_pcb_,&My_ipaddr,2323);
tcp_accept(tcp_pcb_,tcp_accept_cb);

Err = tcp_connect(tcp_pcb_,&To_ipaddr,2324,tcp_connected_cb);
 while (1)
 {
 /* USER CODE END WHILE */
  MX_LWIP_Process();
 /* USER CODE BEGIN 3 */

 }

Результат смотрю и в Wireshark и в дебагере. Ни какая колбек функция не вызывается. ARP запрос и, соответствующий ответ поступают в Wireshark в тот момент, когда в программе на модуле соединение закрывается, tcp_pcb_.state равно CLOSED. Принимающая программа запущена, она работала с модулем на LPC с TCP_ARM_L.lib.

Все примеры, которые я нашёл это или эхо клиент, сервер или протоколы высокого уровня, а мне нужно просто гонять бинарные буфера между модулем и компьютером. Помогите поднять соединение.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

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


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

А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

 

Посмотрел свой код, не вижу у вас вызовов lwip_init() netif_add, sys_check_timeouts(). Также должны быть предоставлены внешние функции u32_t sys_now(void) и u32_t sys_jiffies(void). Вы это сделали? Время тикает?

 

LWIP имеет развитую систему логов, попробуйте для начала их все включить и посмотреть, что происходит. Включите логи в вашем драйвере ethernet, пакеты приходят/уходят?

 

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


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

А почему вы акцентируете внимание на отсутствии ОС? Надо писать промежуточный слой что для ОС, что для голого железа.

 

Посмотрел свой код, не вижу у вас вызовов lwip_init() netif_add, sys_check_timeouts(). Также должны быть предоставлены внешние функции u32_t sys_now(void) и u32_t sys_jiffies(void). Вы это сделали? Время тикает?

 

LWIP имеет развитую систему логов, попробуйте для начала их все включить и посмотреть, что происходит. Включите логи в вашем драйвере ethernet, пакеты приходят/уходят?

 

Большой кусок инициализации lwip строит STM32CubeMX, там все вызовы lwip_init() netif_add, ... sys_check_timeouts(), ethernetif_input() включены в MX_LWIP_Process();

С логами разберусь, надеюсь поможет.

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


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

Собрал простую программу на STM32CubeMX с ETH и LWIP.
Выкидывайте из головы все эти библиотеки - простите - этого говнокод. Пишите все свое. Столкнулся с МК от ST не так давно. Документация не всегда точная . Про библиотеки я сказал. Пишите свое, анализируя на первое и второе. Результат будет быстрее, чем спрашивать тех, кто пользуются этими либами - это очевидно. Кто ими пользуется могут ответить только - работает/не работает.

 

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


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

Выкидывайте из головы все эти библиотеки - простите - этого говнокод.

Вы предлагаете самому переписать lwip или ...?

 

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


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

Вы предлагаете самому переписать lwip или ...?

Нет -я не имел ввиду lwIP. Хотя я не использую его в своих проектах. Есть своя билиотека. Я имел ввиду библиотеки от ST. Они, на мой взгляд, не готовы для использования в серьезных проектах.

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


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

А я так и не смог прикрутить LwIP. Наверное, у меня руки не из плеч немного.. Зато в HAL приём/отправка пакетов реализуются достаточно быстро. Можно как с прерываниями, так и без них.

Как раз случай ТС - достаточно собственно, HAL библиотеки. Инициализировать только придётся самому содержимое пакетов. Либо забивать готовым дампом заголовки.

Примерно, как это сделано в TCP/IP стэке здесь.

Кстати, использую именно логику данного примера: ZeroCopy и сборку пакета по уровням.

 

Последняя мысль к связи контроллера с сетью Ethernet без полного переписывания "родных" библиотек производителя: "О сколько грабель чудных готовит нам отладки час!".

Собственно, минимум, что можно получить:

- Не работают прерывания.

- Прерывания работают, но не те. /HardFault?/

- Прерывания работают. Всё остальное не работает.

- Работает!!!! А почему принимается только N пакетов?

- Принимается!!!! А с передачей у нас что?

- Хм...

- А, вот!

- А теперь-то что?! Как CRC? Куда оно делось? Почему пакетов два?

- Ах вот ты какой, зелёный солнёнок... Но зачем?

Изменено пользователем AlanDrakes

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


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

А я так и не смог прикрутить LwIP.

А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

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


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

А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

Я собственно этим и занимаюсь сейчас, лезу внутрь библиотеки, смотрю как оно там работает. А Куб, повторюсь, использую только для начального конфигурирования

Есть у меня желание найти рабочий пример, такой как для LPC - LEDClient, с ним у меня сходу всё получилось.

 

Примерно, как это сделано в TCP/IP стэке здесь.

Нет на сервере странички по ссылке:(

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


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

А я смог. Перед эти был lwip на ColdFire. Драйвер сам сделал в обоих случаях. Переход был довольно безболезненным (обратите внимание, в том числе big endian --> little endian). После того, как влез в кишки lwip, и, слушая страдальцев по кубу, не верю, что наивные тыкатели в галочки куба смогут получить вменяемый Ethernet. Тут, пардон, надо разбираться в том, как эта штука работает.

У меня просто проект не компилится с использованием arm-none-eabi-gcc. Возможно, недостаточно библиотек, возможно, что-то ещё. По сути - забил на либу, решив использовать другой вполне вменяемый, легковесный стэк. Сейчас вот допиливаю его. По будням.. Сейчас занят стабилизатором питания.

 

ЗЫ: Извиняюсь, ссылка битая. Рабочая сслыка.

 

Исправил.

Изменено пользователем AlanDrakes

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...