|
STM32F407 Ethernet checksum = 0 |
|
|
|
Mar 10 2016, 09:29
|
Участник

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

|
Всем добрый день!
Используется связка контроллеров STM32F407 с Ethernet, набортными свичами, lwip, аппаратной чексуммой и широковещательным udp-обменом. Время от времени происходит проблема: как показывает лог Вайршарка, один случайный контроллер из тех, которые посылают чаще, чем другие (порядка 200 пак./с.), вроде как перестает считать чексумму исходящих пакетов (ставит 0 в Header checksum и UDP checksum) или, реже, дает некорректную чек-сумму. Из-за этого другие теряют с ним связь. Этой ситуации предшествует обрезанный или склеенный с другим пакет (что странно, но не критично), после чего все пакеты следуют или без чек-суммы, или с некорректной. Ситуация может устраниться, может устраниться временно, может не устраниться - до передергивания Ethernet-кабеля, что через прерывание вызывает ETH_Stop/ETH_Start (stm32f4x7_eth.c), ETH_FlushTransmitFIFO и пр. (HAL-драйвер не используется). Вероятно, очищение fifo микросхемы каким-то образом и исправляет ситуацию.
Случайный сброс признаков аппаратной чексуммы в дескрипторах я исключил - задавал им 1 прямо перед выставлением признака OWN. (Еще при нагрузочном тестировании зафиксировал попадание в лог редких одиночных пакетов с нулевой Header checksum, но с корректной UDP checksum и без левого пакета перед этим. Непонятно, связано ли это вообще с основной проблемой.)
Скажите, есть ли вероятность, что сама микросхема перестает корректно считать чек-сумму (потому что пакеты, в остальном, она выдает корректно)? Если нет, то куда копать: lwip, еще какая-то работа с dma? Даташит, само собой, я изучал, и ситуаций, подпадающих под нулевую crc, у нас вроде как нет.
Сообщение отредактировал cyrax0 - Mar 10 2016, 09:35
|
|
|
|
|
 |
Ответов
|
Mar 11 2016, 13:38
|
Участник

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

|
Изучая проблему, наткнулся на функцию ETH_Prepare_Transmit_Descriptors... Не видите ли вы в ней проблемы? В функции проверяется занятость текущего дескриптора, но если пакет делится на несколько буферов (т.е. пакет больше ETH_TX_BUF_SIZE), то второй и последующие могут затереть занятые ДМА буферы и дескрипторы? CODE /** * @brief Prepares DMA Tx descriptors to transmit an ethernet frame * @param FrameLength : length of the frame to send * @retval error status */ uint32_t ETH_Prepare_Transmit_Descriptors(u16 FrameLength) { uint32_t buf_count =0, size=0,i=0; __IO ETH_DMADESCTypeDef *DMATxDesc;
/* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET) { /* Return ERROR: OWN bit set */ return ETH_ERROR; }
DMATxDesc = DMATxDescToSet; if (FrameLength > ETH_TX_BUF_SIZE) { buf_count = FrameLength/ETH_TX_BUF_SIZE; if (FrameLength%ETH_TX_BUF_SIZE) buf_count++; } else buf_count =1;
if (buf_count ==1) { /*set LAST and FIRST segment */ DMATxDesc->Status |=ETH_DMATxDesc_FS|ETH_DMATxDesc_LS; /* Set frame size */ DMATxDesc->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ DMATxDesc->Status |= ETH_DMATxDesc_OWN; DMATxDesc= (ETH_DMADESCTypeDef *)(DMATxDesc->Buffer2NextDescAddr); } else { for (i=0; i< buf_count; i++) { /* Clear FIRST and LAST segment bits */ DMATxDesc->Status &= ~(ETH_DMATxDesc_FS | ETH_DMATxDesc_LS); if (i==0) { /* Setting the first segment bit */ DMATxDesc->Status |= ETH_DMATxDesc_FS; }
/* Program size */ DMATxDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATxDesc_TBS1); if (i== (buf_count-1)) { /* Setting the last segment bit */ DMATxDesc->Status |= ETH_DMATxDesc_LS; size = FrameLength - (buf_count-1)*ETH_TX_BUF_SIZE; DMATxDesc->ControlBufferSize = (size & ETH_DMATxDesc_TBS1); }
/* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ DMATxDesc->Status |= ETH_DMATxDesc_OWN;
DMATxDesc = (ETH_DMADESCTypeDef *)(DMATxDesc->Buffer2NextDescAddr); } } DMATxDescToSet = DMATxDesc;
/* When Tx Buffer unavailable flag is set: clear it and resume transmission */ if ((ETH->DMASR & ETH_DMASR_TBUS) != (u32)RESET) { /* Clear TBUS ETHERNET DMA flag */ ETH->DMASR = ETH_DMASR_TBUS; /* Resume DMA transmission*/ ETH->DMATPDR = 0; }
/* Return SUCCESS */ return ETH_SUCCESS; }
Сообщение отредактировал IgorKossak - Mar 11 2016, 18:32
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Mar 12 2016, 16:34
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(scifi @ Mar 12 2016, 04:02)  Это STM наговнокодили? Ну тогда не удивительно, что глючит. У них всё глючит. Напишите драйвер Ethernet сами. Я так и сделал - ни разу глюков не замечал. Кстати, всего 500 строк, в отличие от. Это такая бизнес-модель: как можно быстрее, чтобы нишу занять. Кроме того, их "код" на все возможные и нереальные комбинации, которые позволяет их железо. Я, как и Вы и многие другие написал и пишу свои драйвера, но они делают не все, а то что я или Вы или другие считают необходимым. Кроме того, это стоит времени, а оно есть не всегда и не у всех, вот и расплачиваются надежностью и качеством... Я никого не оправдываю и ни в чем не убеждаю, просто принимая решение, делайте это осознанно. Цитата * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, ST MICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
--------------------
|
|
|
|
Сообщений в этой теме
cyrax0 STM32F407 Ethernet checksum = 0 Mar 10 2016, 09:29   AleksBak Цитата(pitt @ Mar 12 2016, 20:34) ...
Я н... Mar 12 2016, 17:21    pitt Цитата(AleksBak @ Mar 12 2016, 12:21) Не ... Mar 13 2016, 01:33 aaarrr Проблема есть, но:
- чему у Вас равен ETH_TX_BUF_S... Mar 11 2016, 14:05 cyrax0 Цитата(aaarrr @ Mar 11 2016, 18:05) Пробл... Mar 14 2016, 07:13  aaarrr Цитата(cyrax0 @ Mar 14 2016, 10:13) Верно... Mar 14 2016, 10:23 AleksBak "спецом" - имел ввиду специально, а не ... Mar 13 2016, 04:38 cyrax0 У меня то же самое, только без семафоров (что плох... Mar 14 2016, 13:00 cyrax0 Посмотрите, пожалуйста, возможно ли в используемой... Mar 21 2016, 14:40
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|