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

 
 
> 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
Ответов
remixx
сообщение May 15 2018, 05:58
Сообщение #2


Участник
*

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



Мне действительно интересно этим заниматься, в будущем планирую работать в сфере, где требуется представление о программировании хотя бы на таком уровне. Опыта без практики не получить.
Задача сама по себе не связана с реальным применением, просто некий теоретический вариант, для реализации которого требуется работа с основной перефирией МК, что и является главной целью в данной работе.
Пары не прогуливал biggrin.gif , большинство курсов в основном были связаны с элементной базой, принципом работы ИМС, их проектированием и т.п.
На единственном курсе, связанным с программированием, мы по-этапно выводили символ нажатой кнопки на ЖКИ в течение 3-х лаб, писалось все на ассемблере. Поэтому "уровень" соответствующий.
Вообще специальность называется микроэлектроника, поэтому прямой связи с программированием и уж тем более работой с сетями нету.
Собственно вот с таким "багажом" я и подошел к работе над вышеупомянутой задачей), поэтому возникает куча вопросов на каждом шагу.

Ну ладно, это небольшое лирическое отступление biggrin.gif

По теме:
под пакетом преподаватель имел ввиду фрейм (IEEE 802.3), структуру представил ниже.

Прикрепленное изображение


То есть насколько я понял, преамбула, header mac, длина и LLC формируются автоматически при отправке, с указанными значениями при инициализации, а в блок данных (data unit), необходимо завести требуемые значения измерений. Думаю это удобно сделать через struct, пример:

Код
struct Data {
int32_t temperature;
uint8_t time;
uint8_t date;
}

Перед каждой отправкой приравниваю переменные к полученным значениям измерений и отправляю их.
После чего некая задержка, ну из первого что пришло в голову 1 сек / 1000 = 1 мс, соответственно её и беру.
И снова измерение, формирование фрейма, отправка. И так 1000 раз.

По вашим советам стал искать информацию, как осуществить передачу, используя lwip.
Наткнулся вот на такой пример. С помощью куба он инициализирует ethernet и подключает lwip. В коде добавляет функции для udp и отправляет тестовый фрейм.
Вроде бы это то что нужно)

Кстати для анализа полученных пакетов использую wireshark.

Сообщение отредактировал remixx - May 15 2018, 06:16
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 15 2018, 06:19
Сообщение #3


Гуру
******

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



Цитата(remixx @ May 15 2018, 08:58) *
Перед каждой отправкой приравниваю переменные к полученным значениям измерений и отправляю их.
После чего некая задержка, ну из первого что пришло в голову 1 сек / 1000 = 1 мс, соответственно её и беру.

Тупых "задержек" быть не должно. Не знаю как там работает куб или lwip (не пользовал никогда), но в любом случае формировать следующий кадр для отправки нужно только после получения уведомления о завершении отправки предыдущего кадра.
Например простейший алгоритм: завести цикл (прерывание) работающий с частотой 1 кГц, при каждом проходе цикла проверять стоит ли флаг завершения отправки предыдущего ETHERNET-кадра и только если стоит - формировать следующий кадр.
Ещё лучше добавить FIFO кадров на несколько позиций и писать в него если в FIFO есть место (и стартовать передачу, если предыдущее завершение отправки произошло при пустом FIFO). В обработчике события "завершения отправки кадра" ETHERNET-драйвера отправлять следующий кадр из FIFO ели там есть хотя-бы один кадр.

Цитата(remixx @ May 15 2018, 08:58) *
И снова измерение, формирование фрейма, отправка. И так 1000 раз.

Измерение должно идти независимо от отправки. В своей задаче RTOS или ISR. Измерение и передача в сеть должны быть связаны через механизм FIFO. Иначе не получите ожидаемой частоты (вообще никакой стабильной частоты преобразования не получите - она будет плавать).

Цитата(remixx @ May 15 2018, 08:58) *
По вашим советам стал искать информацию, как осуществить передачу, используя lwip.
С помощью куба он подключает lwip. В коде добавляет функции для udp и отправляет тестовый фрейм.

Определитесь уже что Вам всё-таки нужно - описанные выше Вами ETHERNET-кадры или всё-же UDP?

Цитата(remixx @ May 15 2018, 08:58) *
Кстати для анализа полученных пакетов использую wireshark.

Если на защите достаточно будет показать приём в шарке, то наверное можно и так.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- remixx   STM32F107RCT6 + KSZ8721 (ethernet)   May 11 2018, 04:24
- - haker_fox   Я не знаю куб, но вопрос: вы хотите данные гнать н...   May 11 2018, 05:38
|- - remixx   Цитата(haker_fox @ May 11 2018, 05:38) Я ...   May 14 2018, 03:36
|- - 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
|- - iosifk   Цитата(remixx @ May 14 2018, 06:36) Функц...   May 14 2018, 14:41
- - XVR   Если вам нужно просто передать пакеты, то можно сд...   May 14 2018, 11:51
|- - 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 Текстовая версия Сейчас: 30th June 2025 - 01:16
Рейтинг@Mail.ru


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