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

 
 
 
Reply to this topicStart new topic
> stm32F4 ethernet отправка фрейма
Fobes
сообщение Mar 13 2016, 14:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Всем доброго времени суток. Уже совсем измучился... Нужно отправить чисто ethernet фрейм + vlan tag + свои данные. Т.е. только канальный уровень по ОСИ.
Взял LwIp библиотеку. Как я понял в ней отправка данных происходит через буфер pbuf и при помощи функции low_level_output().
Собственно сделал свои структуры дабы время сэкономить:
CODE

struct ethernet_header
{
uint8_t dstAdr[6];
uint8_t srcAdr[6];
uint8_t type[2];
} __attribute__((packed));

struct vlan_header
{
uint8_t param[2];
uint8_t type[2];
} __attribute__((packed));

struct my_header
{
struct ethernet_header eth_hdr;
struct vlan_header vlan_hdr;
//дальше мои данные
} __attribute__((packed));


Дальше заполняю и отправляю вот так:

CODE

struct pbuf *pbuf_my;
struct my_header my_hdr;

uint32_t errCnt;
err_t error;

my_hdr.eth_hdr.dstAdr[0] = 0x01; my_hdr.eth_hdr.dstAdr[1] = 0x0C;
my_hdr.eth_hdr.dstAdr[2] = 0xCD; my_hdr.eth_hdr.dstAdr[3] = 0x04;
my_hdr.eth_hdr.dstAdr[4] = 0x00; my_hdr.eth_hdr.dstAdr[5] = 0x01;

my_hdr.eth_hdr.srcAdr[0] = 0x06; my_hdr.eth_hdr.srcAdr[1] = 0x02;
my_hdr.eth_hdr.srcAdr[2] = 0x00; my_hdr.eth_hdr.srcAdr[3] = 0xFF;
my_hdr.eth_hdr.srcAdr[4] = 0xFF; my_hdr.eth_hdr.srcAdr[4] = 0x10;

my_hdr.eth_hdr.type[0] = 0x81; my_hdr.eth_hdr.type[1] = 0x00;
//------------
my_hdr.vlan_hdr.param[0] = 0x80; my_hdr.vlan_hdr.param[1] = 0x00;
my_hdr.vlan_hdr.type[0] = 0x88; my_hdr.vlan_hdr.type[1] = 0xba;
//-----

//вот это верно делаю ? sad.gif
pbuf_my= pbuf_alloc(PBUF_RAW,sizeof(struct my_header), PBUF_RAM);
pbuf_my->payload = &my_hdr;


while (1)
{
error = gnetif.linkoutput(&gnetif, pbuf_my);

if (error != ERR_OK)
{
errCnt++;
}
}


Длина одного фрейма порядка 820 байт... Фреймы передаются,но wireshark периодически показывает "Malformed packet". И в error появляется "#define ERR_BUF -2 /* Buffer error. */" Что я делаю не так ? Как правильно использовать буфер ? sad.gif помогите плиз, знающие люди !!!
И второй вопрос, фрейм передается правильно, но vlan tag вырезается почему-то, оно где-то разрешаться должно чтоли ?

п.с. с фреймами меньшей длины такие проблемы возникают, но реже

может ли это быть связано с повреждением микросхемы физического уровня ?

Сообщение отредактировал Fobes - Mar 13 2016, 16:27
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 14 2016, 07:43
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Я не особо "Знающий" но выскажусь. Такая ошибка в low_level_output и ниже происходит только в одном месте:
Код
      /* Is this buffer available? If not, goto error */
      if((DmaTxDesc->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
      {
        errval = ERR_BUF;
        goto error;
      }

В связи с этим вопрос: как часто посылаете? Какие размеры ETH_TX_BUF_SIZE и ETH_TXBUFNB?

Цитата
//вот это верно делаю ?
pbuf_my= pbuf_alloc(PBUF_RAW,sizeof(struct my_header), PBUF_RAM);
pbuf_my->payload = &my_hdr;


Тут я не знаю, но, возможно, если вы не используете lwip, то есть смысл и не использовать pbuf_alloc, а делать пакет pbuf полностью самостоятельно.

Сообщение отредактировал cyrax0 - Mar 14 2016, 07:44
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 14 2016, 09:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Посылаются пакеты двух типов, 127 байт - 4000 раз в секунду, 817 байт - 1600 раз в секунду.

CODE


#define ETH_TXBUFNB 4

#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE
#define ETH_MAX_PACKET_SIZE 1524




Цитата(cyrax0 @ Mar 14 2016, 08:43) *
Тут я не знаю, но, возможно, если вы не используете lwip, то есть смысл и не использовать pbuf_alloc, а делать пакет pbuf полностью самостоятельно.


А вот тут поподробнее можно или что почитать ?
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 14 2016, 12:16
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Цитата(Fobes @ Mar 14 2016, 13:54) *
Посылаются пакеты двух типов, 127 байт - 4000 раз в секунду, 817 байт - 1600 раз в секунду.

Не кратные циклы получаются, вы не из разных прерываний посылаете пакеты? В некоторых реализациях low_level_output нет проверки на занятость функции, это может привести к проблемам...

Попробуйте сделать такие константы:
#define ETH_TXBUFNB 20 (лучше максимум, на сколько хватит места)
#define ETH_TX_BUF_SIZE 820

Если и на 20 не хватит места, то сделайте ETH_TX_BUF_SIZE 128 (этот вариант не могу рекомендовать, т.к. в параллельной теме у меня проблема как раз с посылкой пакетов, не влезающих в один сетевой буфер).

Цитата(Fobes @ Mar 14 2016, 13:54) *
А вот тут поподробнее можно или что почитать ?

Ну почитайте про pbuf_alloc, раз в нем не уверены, или создайте полностью struct pbuf, описанную в pbuf.h, без вызова этой функции. По идее, если посылка у вас идет, вызов сделан корректно, но лучше разобраться в функции, а такие ее параметры я не изучал, так что не подскажу, верны они или нет.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Mar 14 2016, 13:52
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (Fobes @ Mar 13 2016, 16:13) *
И второй вопрос, фрейм передается правильно, но vlan tag вырезается почему-то, оно где-то разрешаться должно чтоли ?

п.с. с фреймами меньшей длины такие проблемы возникают, но реже

может ли это быть связано с повреждением микросхемы физического уровня ?


Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 14 2016, 19:41
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Цитата(cyrax0 @ Mar 14 2016, 12:16) *
Попробуйте сделать такие константы:
#define ETH_TXBUFNB 20 (лучше максимум, на сколько хватит места)
#define ETH_TX_BUF_SIZE 820


Попробовал. ERR_BUF пропала, появилась #define ERR_USE -8 /* Address in use. */ и тот же Malformed packet в шарке...
Сейчас отправляю вообще только 1 тип пакетов, на 817, даже не из прерываний а просто в главном цикле, пытаюсь понять причину не верной работы... Ради интереса выставил задержку между пакетами в 0.1с low_level_output перестал выдавать какие-либо ошибки, но шарк по прежнему периодически показывает Malformed packet... Может ли это быть неисправность физики ethernet или самого stm32f4 ?

Цитата(ig_z @ Mar 14 2016, 13:52) *
Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера


Т.е. от других устройств ничего не стирается, а от моего ему не нравятся и он их обрезает ?) Причина в чем-то другом.
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 15 2016, 06:01
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Цитата(Fobes @ Mar 14 2016, 23:41) *
Попробовал. ERR_BUF пропала, появилась #define ERR_USE -8 /* Address in use. */

Эмм, такая ошибка возникает тоже в одном месте. Если ETH_TX_BUF_SIZE 820, то получается, что 817 вы назвали размер данных, а не целого пакета по логу wireshark. Если же нет, то вам надо поставить брекпоинт на это место и посмотреть, почему он происходит (по факту, похоже, что у вас пакеты делятся, а не должны). Или верните размер 1520, ошибка должна исчезнуть. Но это не относится к главному вопросу; по сути, эта и предыдущая ошибки указывают, что MAC не успевает отослать прежде чем вы пытаетесь передать следующие пакеты, что странно, потому что в моем случае данный контроллер выдает порядка 30000 пакетов (правда меньшего размера) в while(1) при числе буферов 20. Попробуйте udp-посылки с той же частотой или udp-client из куба, посмотрите как он заработает.

Цитата
и тот же Malformed packet в шарке...

Как это выглядит? Обычно вайршарк пишет конкретную ошибку. Попробуйте отправлять один и тот же пакет, может из тех, что вы создаете, есть некорректные.

Цитата
Может ли это быть неисправность физики ethernet или самого stm32f4 ?

Мое мнение, что это очень маловероятно.
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 15 2016, 09:48
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Цитата(cyrax0 @ Mar 15 2016, 07:01) *
Но это не относится к главному вопросу; по сути, эта и предыдущая ошибки указывают, что MAC не успевает отослать прежде чем вы пытаетесь передать следующие пакеты, что странно, потому что в моем случае данный контроллер выдает порядка 30000 пакетов (правда меньшего размера) в while(1) при числе буферов 20.


Именно по этому и пишу про возможное повреждение... я сжег лапу МК большим током, и ethernet phy и stm32f4 питались от одной шины. Теоретически мог что-то повредить, именно после этого началась эта веселуха с пакетами, до этого все вроде верно работало.

Цитата(cyrax0 @ Mar 15 2016, 07:01) *
Как это выглядит? Обычно вайршарк пишет конкретную ошибку. Попробуйте отправлять один и тот же пакет, может из тех, что вы создаете, есть некорректные.


В while(1) отправляю сейчас один и тот же пакет, без изменений. Ошибки постоянно разные.... Начиная от верных пакетов и заканчивая пакетами совершенно другой длины с другими типами и не верными контрольными суммами...
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 15 2016, 09:53
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Цитата
я сжег лапу МК большим током, и ethernet phy и stm32f4 питались от одной шины.

Ну, такого я не предполагал. Имхо остается проверить стандартный пример и другой контроллер. Может, кто подскажет еще что.
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 15 2016, 16:43
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Цитата(cyrax0 @ Mar 15 2016, 09:53) *
Ну, такого я не предполагал. Имхо остается проверить стандартный пример и другой контроллер. Может, кто подскажет еще что.


Новое железо заказал, жду... Не подкините примерчик для проверки, дабы время сэкономить ?
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 16 2016, 06:04
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Ну что же вы, батенька, про куб не знаете sm.gif ?

http://www.st.com/st-web-ui/static/active/...stm32cubef4.zip
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 16 2016, 07:16
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Цитата(cyrax0 @ Mar 16 2016, 07:04) *
Ну что же вы, батенька, про куб не знаете sm.gif ?


Знаю)) Но использую его только как своебразный даташит )) Не понравился мне hal)) Посмотрел архив, конкретных примеров не нашел) Может просто покажете кусок кода, отправляющий любой пакет(чем больше тем лучше) и работающий верно в бесконечном цикле, чтобы было с чем сравнить всетаки, без шанса самому наврать.
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 16 2016, 07:49
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Плохо ищете...
STM32Cube_FW_F4_V1.11.0\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Client (вместо STM324xG_EVAL см. ваш контроллер)
udp_echoclient_send, который у них сделан в коллбэке, перенесите в while(1), и получите, видимо, то, что хотите.
Go to the top of the page
 
+Quote Post
Fobes
сообщение Mar 16 2016, 22:53
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Цитата(ig_z @ Mar 14 2016, 13:52) *
Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера


Приношу свои извинения) Забыл что с других устройств снимал данные под линуксом) Вопрос с влан тегом снят. Все верно отправляется.


Цитата(cyrax0 @ Mar 16 2016, 07:49) *
Плохо ищете...
STM32Cube_FW_F4_V1.11.0\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Client (вместо STM324xG_EVAL см. ваш контроллер)
udp_echoclient_send, который у них сделан в коллбэке, перенесите в while(1), и получите, видимо, то, что хотите.


Посмотрел всетаки свой код, при отправке моих пакетов никаких ошибок не вылетает, но шарк ругается по прежнему, буду надеяться что это неисправность железа всетаки)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:59
Рейтинг@Mail.ru


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