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

 
 
> 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
iosifk
сообщение May 14 2018, 14:41
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

Для справки. Термина "Функционал" в русском техническом языке нет вообще...
И вот, чисто по жизни, есть вопрос. "Температура" - она что так быстро меняется? Это что температура плазмы или газовой струи в ракетном сопле? Какова масса объекта, у которого измеряют температуру?
А сам датчик, какая у него постоянная времени по температуре? Ну пусть десятая доля секунды... Тогда у Вас что, имеются тысячи датчиков, если в задании "1000 ethernet пакетов в секунду"... Или же это сказано так, для балды? Но ведь сказано, что "блок" находится "рядом", т.е не далее 300 метров, потому как не факт, что такие кадры пройдут по сетевому оборудованию...
Вот...


--------------------
www.iosifk.narod.ru
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
|- - jcxz   Цитата(remixx @ May 14 2018, 06:36) Вообщ...   May 14 2018, 14:33
||- - haker_fox   QUOTE (jcxz @ May 14 2018, 22:33) Ну если...   May 15 2018, 01:59
||- - XVR   Цитата(jcxz @ May 14 2018, 17:33) Да ладн...   May 15 2018, 08:24
||- - jcxz   Цитата(XVR @ May 15 2018, 11:24) Любой, у...   May 15 2018, 09:09
||- - 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
- - 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 Текстовая версия Сейчас: 21st July 2025 - 19:54
Рейтинг@Mail.ru


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