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

 
 
> STM32F107RCT6 + KSZ8721 (ethernet)
remixx
сообщение May 11 2018, 04:24
Сообщение #1


Участник
*

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



Пытаюсь запустить эзернет на МК. В качестве внешнего PHY использую KSZ8721. Задача следующая: сформировать пакет определенной структуры (т.е. условно 20-28 байт параметр1, 29-36 байт параметр2, 37-50 параметр3 и т.д.), записать в эти параметры значения с АЦП и передать определенное количество пакетов в секунду.
Подключение MII, режим full duplex.
Собственно в связи с вышеизложенным следующие вопросы:
1. Каким образом можно сформировать произвольную структуру пакета?
2. Будет ли достаточно для данных целей обычной инициализации эзернета в кубе и передачи пакетов функцией HAL_ETH_TransmitFrame()? Код функции представлен ниже.
Код
/**
  * @brief  Sends an Ethernet frame.
  * @param  heth: pointer to a ETH_HandleTypeDef structure that contains
  *         the configuration information for ETHERNET module
  * @param  FrameLength: Amount of data to be sent
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ETH_TransmitFrame(ETH_HandleTypeDef *heth, uint32_t FrameLength)
{
  uint32_t bufcount = 0U, size = 0U, i = 0U;
  
  /* Process Locked */
  __HAL_LOCK(heth);
  
  /* Set the ETH peripheral state to BUSY */
  heth->State = HAL_ETH_STATE_BUSY;
  
  if (FrameLength == 0U)
  {
    /* Set ETH HAL state to READY */
    heth->State = HAL_ETH_STATE_READY;
    
    /* Process Unlocked */
    __HAL_UNLOCK(heth);
    
    return  HAL_ERROR;                                    
  }  
  
  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  if(((heth->TxDesc)->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
  {  
    /* OWN bit set */
    heth->State = HAL_ETH_STATE_BUSY_TX;
    
    /* Process Unlocked */
    __HAL_UNLOCK(heth);
    
    return HAL_ERROR;
  }
  
  /* Get the number of needed Tx buffers for the current frame */
  if (FrameLength > ETH_TX_BUF_SIZE)
  {
    bufcount = FrameLength/ETH_TX_BUF_SIZE;
    if (FrameLength % ETH_TX_BUF_SIZE)
    {
      bufcount++;
    }
  }
  else
  {  
    bufcount = 1U;
  }
  if (bufcount == 1U)
  {
    /* Set LAST and FIRST segment */
    heth->TxDesc->Status |=ETH_DMATXDESC_FS|ETH_DMATXDESC_LS;
    /* Set frame size */
    heth->TxDesc->ControlBufferSize = (FrameLength & ETH_DMATXDESC_TBS1);
    /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
    heth->TxDesc->Status |= ETH_DMATXDESC_OWN;
    /* Point to next descriptor */
    heth->TxDesc= (ETH_DMADescTypeDef *)(heth->TxDesc->Buffer2NextDescAddr);
  }
  else
  {
    for (i=0U; i< bufcount; i++)
    {
      /* Clear FIRST and LAST segment bits */
      heth->TxDesc->Status &= ~(ETH_DMATXDESC_FS | ETH_DMATXDESC_LS);
      
      if (i == 0U)
      {
        /* Setting the first segment bit */
        heth->TxDesc->Status |= ETH_DMATXDESC_FS;  
      }
      
      /* Program size */
      heth->TxDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATXDESC_TBS1);
      
      if (i == (bufcount-1U))
      {
        /* Setting the last segment bit */
        heth->TxDesc->Status |= ETH_DMATXDESC_LS;
        size = FrameLength - (bufcount-1U)*ETH_TX_BUF_SIZE;
        heth->TxDesc->ControlBufferSize = (size & ETH_DMATXDESC_TBS1);
      }
      
      /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
      heth->TxDesc->Status |= ETH_DMATXDESC_OWN;
      /* point to next descriptor */
      heth->TxDesc = (ETH_DMADescTypeDef *)(heth->TxDesc->Buffer2NextDescAddr);
    }
  }
  
  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  if (((heth->Instance)->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
  {
    /* Clear TBUS ETHERNET DMA flag */
    (heth->Instance)->DMASR = ETH_DMASR_TBUS;
    /* Resume DMA transmission*/
    (heth->Instance)->DMATPDR = 0U;
  }
  
  /* Set ETH HAL State to Ready */
  heth->State = HAL_ETH_STATE_READY;
  
  /* Process Unlocked */
  __HAL_UNLOCK(heth);
  
  /* Return function status */
  return HAL_OK;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение May 11 2018, 05:38
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Я не знаю куб, но вопрос: вы хотите данные гнать на канальном уровне? Т.е. TCP/IP или UDP вам не нужен?

QUOTE (remixx @ May 11 2018, 12:24) *
2. Будет ли достаточно для данных целей обычной инициализации эзернета в кубе и передачи пакетов функцией HAL_ETH_TransmitFrame()? Код функции представлен ниже.

Это низкоуровневая функция передачи ETHERNET-фрейма через среду (витую пару в вашем случае). Конечно, можно гнать данные на этом уровне, но как вы будете доставлять их адресату? Или как кто-то будет запрашивать их у вашей железки? Ведь адресация в таком случае будет возможно только по mac-адресу. А в локальных сетях принято использовать что-то повыше уровнем, например IPv4. Значит вам нужен TCP/IP стек, пусть и не полный. Всё зависит от ваших требований? Чего вы хотите? Что за прибор, куда будет подключаться, кто будет обмениваться с ним данными?

Рекомендую познакомиться хотя бы бегло с 7-уровневой моделью OSI. Затем почитать про TCP/IP стеки. Я использовал lwip. Прикручиватеся не совсем просто, если нет опыта. У меня ушло недели полторы на адаптацию драйвера MAC+PHY, и портирование стека на свою платформу (LPC4337 + внешний фиттер).

P.S. Судя по вашим постам на форуме, вы методично и последовательно ваяете что-то измерительное с выходом в сеть)))

P.S.S. Логический анализатор вам и здесь может понадобиться. У вас kszшка-то хоть ответила по MDC?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
remixx
сообщение May 14 2018, 03:36
Сообщение #3


Участник
*

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



Цитата(haker_fox @ May 11 2018, 05:38) *
Я не знаю куб, но вопрос: вы хотите данные гнать на канальном уровне? Т.е. TCP/IP или UDP вам не нужен?


Это низкоуровневая функция передачи ETHERNET-фрейма через среду (витую пару в вашем случае). Конечно, можно гнать данные на этом уровне, но как вы будете доставлять их адресату? Или как кто-то будет запрашивать их у вашей железки? Ведь адресация в таком случае будет возможно только по mac-адресу. А в локальных сетях принято использовать что-то повыше уровнем, например IPv4. Значит вам нужен TCP/IP стек, пусть и не полный. Всё зависит от ваших требований? Чего вы хотите? Что за прибор, куда будет подключаться, кто будет обмениваться с ним данными?

Рекомендую познакомиться хотя бы бегло с 7-уровневой моделью OSI. Затем почитать про TCP/IP стеки. Я использовал lwip. Прикручиватеся не совсем просто, если нет опыта. У меня ушло недели полторы на адаптацию драйвера MAC+PHY, и портирование стека на свою платформу (LPC4337 + внешний фиттер).

P.S. Судя по вашим постам на форуме, вы методично и последовательно ваяете что-то измерительное с выходом в сеть)))

P.S.S. Логический анализатор вам и здесь может понадобиться. У вас kszшка-то хоть ответила по MDC?

Функционал устроства верный biggrin.gif. Это мой дипломный проект, по сути представляет из себя некий измерительный блок, который оцифровывает показания датчика температуры и передает их по ethernet.
Вообще задача сформулирована следующим образом: необходимо передать 1000 ethernet пакетов с определенной структурой в секунду. В каждом пакете должны содержаться: значение измеренной температуры, время, дата и еще несколько параметров. Сам блок подключается к компьютеру, к нему никаких обращений не требуется, т.е. она просто гонит данные и все.

Читаю про TCP/IP стек, но теория без практики воспринимается сложно. Пытаюсь найти примеры с реализацией lwip.
Пробовал пинговать плату при обычной инициализации ethernet (без lwip), результата нет.

Сообщение отредактировал remixx - May 14 2018, 03:37
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 14 2018, 14:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(remixx @ May 14 2018, 06:36) *
Вообще задача сформулирована следующим образом: необходимо передать 1000 ethernet пакетов с определенной структурой в секунду.

Ну если препод хотел сказать именно то, что написал, то Вам остаётся только посочувствовать. laughing.gif
Уже знаете как будете из под винды добираться до уровня ETHERNET-фреймов? biggrin.gif Это будет посложнее, чем полное изучение TCP-стека.
Совет: срочно бежать к преподу и переформулировать задачу на "передачу через UDP" или через TCP-сокет. А ещё лучше: "через любой сетевой протокол работающий поверх ETHERNET".
Даже если препод не понимает разницы между ETHERNET-кадрами и TCP/UDP-кадрами, то достаточно в приёмной комиссии оказаться одному человеку, кто понимает и можете смело ставить крест на защите. Если бы я был в комиссии, а Вы с таким ТЗ притащили проект сделанный на TCP/UDP, то я бы завалил. biggrin.gif

Цитата(remixx @ May 11 2018, 07:24) *
2. Будет ли достаточно для данных целей обычной инициализации эзернета в кубе и передачи пакетов функцией HAL_ETH_TransmitFrame()? Код функции представлен ниже.

Думаю что не будет. Ибо как докажете, что что-то вообще передаётся?
А значит: на стороне приёмной стороны нужно писать что-то, что будет принимать эти пакеты и отображать инфу из них.

Цитата(remixx @ May 14 2018, 06:36) *
Сам блок подключается к компьютеру, к нему никаких обращений не требуется, т.е. она просто гонит данные и все.

И как доказать, что компьютер эти данные принимает?

Цитата(XVR @ May 14 2018, 14:51) *
никакого стека (даже lwip) для этого не понадобится.

Да ладно!? А какой МК умеет передавать UDP-кадры самостоятельно, без TCP/IP-стека?
Go to the top of the page
 
+Quote Post
XVR
сообщение May 15 2018, 08:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(jcxz @ May 14 2018, 17:33) *
Да ладно!? А какой МК умеет передавать UDP-кадры самостоятельно, без TCP/IP-стека?
Любой, у которого есть MAC. Минимальный UDP протокол простой как бревно - формируем образ Eth фрейма с UDP Payload в памяти (в виде структуры) и отправляем это в качестве Eth пакета наружу. Это всё. lwip для этого не нужен.

Если нужна полная поддержка IP стека (включая ICMP и ARP, а так же что угодно на приём), то тут уже как минимум lwip потребуется.

Go to the top of the page
 
+Quote Post
jcxz
сообщение May 15 2018, 09:09
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(XVR @ May 15 2018, 11:24) *
Любой, у которого есть MAC. Минимальный UDP протокол простой как бревно - формируем образ Eth фрейма с UDP Payload в памяти (в виде структуры) и отправляем это в качестве Eth пакета наружу. Это всё. lwip для этого не нужен.

Чтобы засрать широковещательными UDP всю сеть?

Цитата(XVR @ May 15 2018, 11:24) *
Если нужна полная поддержка IP стека (включая ICMP и ARP, а так же что угодно на приём), то тут уже как минимум lwip потребуется.

Как минимум lwip избыточен. Есть гораздо более лёгкие стеки. Даже в примерах IAR-а имелись.

Цитата(haker_fox @ May 15 2018, 09:42) *
Но поищите в сети проекты связки stm + lwip. Наверно можно как-то вытащить исходники драйверов mac, и подкорректировать их под себя.

Лучше взять примеры из IAR для работы с Ethernet.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- remixx   STM32F107RCT6 + KSZ8721 (ethernet)   May 11 2018, 04:24
|- - haker_fox   QUOTE (remixx @ May 14 2018, 11:36) еобхо...   May 14 2018, 06:33
||- - haker_fox   QUOTE (jcxz @ May 14 2018, 22:33) Ну если...   May 15 2018, 01:59
||- - XVR   Цитата(jcxz @ May 15 2018, 12:09) Чтобы з...   May 15 2018, 11:46
||- - jcxz   Цитата(XVR @ May 15 2018, 14:46) А кто за...   May 15 2018, 12:56
||- - haker_fox   QUOTE (jcxz @ May 15 2018, 20:56) Вы пред...   May 15 2018, 14:23
|||- - jcxz   Цитата(haker_fox @ May 15 2018, 17:23) Пр...   May 15 2018, 15:49
||- - XVR   Цитата(jcxz @ May 15 2018, 15:56) Вы пред...   May 16 2018, 04:07
|- - iosifk   Цитата(remixx @ May 14 2018, 06:36) Функц...   May 14 2018, 14:41
- - XVR   Если вам нужно просто передать пакеты, то можно сд...   May 14 2018, 11:51
- - remixx   Мне действительно интересно этим заниматься, в буд...   May 15 2018, 05:58
|- - jcxz   Цитата(remixx @ May 15 2018, 08:58) Перед...   May 15 2018, 06:19
|- - haker_fox   QUOTE (remixx @ May 15 2018, 13:58) Мне д...   May 15 2018, 06:42
- - mcheb   Посмотрите здесь https://github.com/ntruchsess/ard...   May 15 2018, 08:42
- - Alex11   ЦитатаМне кажется можно статично вбить ip-адреса ж...   May 15 2018, 16:26
|- - haker_fox   QUOTE (Alex11 @ May 16 2018, 00:26) Работ...   May 15 2018, 23:41
- - remixx   В указанном примере как раз таки MAC и ip адреса в...   May 16 2018, 06:59
|- - jcxz   Цитата(remixx @ May 16 2018, 09:59) По со...   May 17 2018, 06:35
- - haker_fox   Я бы рекомендовал не использовать ось. Я не знаю в...   May 16 2018, 07:52
|- - remixx   Цитата(haker_fox @ May 16 2018, 07:52) Я ...   May 17 2018, 02:35
- - remixx   В рбщем поговорил с преподавателем, решили т.к. вр...   May 22 2018, 16:42
- - haker_fox   QUOTE (remixx @ May 23 2018, 00:42) Но во...   May 23 2018, 00:28


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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 22:30
Рейтинг@Mail.ru


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