|
STM32F107RCT6 + KSZ8721 (ethernet) |
|
|
|
May 11 2018, 04:24
|
Участник

Группа: Участник
Сообщений: 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; }
|
|
|
|
|
 |
Ответов
|
May 11 2018, 05:38
|

Познающий...
     
Группа: Свой
Сообщений: 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?
--------------------
Выбор.
|
|
|
|
|
May 14 2018, 03:36
|
Участник

Группа: Участник
Сообщений: 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? Функционал устроства верный  . Это мой дипломный проект, по сути представляет из себя некий измерительный блок, который оцифровывает показания датчика температуры и передает их по ethernet. Вообще задача сформулирована следующим образом: необходимо передать 1000 ethernet пакетов с определенной структурой в секунду. В каждом пакете должны содержаться: значение измеренной температуры, время, дата и еще несколько параметров. Сам блок подключается к компьютеру, к нему никаких обращений не требуется, т.е. она просто гонит данные и все. Читаю про TCP/IP стек, но теория без практики воспринимается сложно. Пытаюсь найти примеры с реализацией lwip. Пробовал пинговать плату при обычной инициализации ethernet (без lwip), результата нет.
Сообщение отредактировал remixx - May 14 2018, 03:37
|
|
|
|
|
May 14 2018, 14:33
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(remixx @ May 14 2018, 06:36)  Вообще задача сформулирована следующим образом: необходимо передать 1000 ethernet пакетов с определенной структурой в секунду. Ну если препод хотел сказать именно то, что написал, то Вам остаётся только посочувствовать. Уже знаете как будете из под винды добираться до уровня ETHERNET-фреймов?  Это будет посложнее, чем полное изучение TCP-стека. Совет: срочно бежать к преподу и переформулировать задачу на "передачу через UDP" или через TCP-сокет. А ещё лучше: "через любой сетевой протокол работающий поверх ETHERNET". Даже если препод не понимает разницы между ETHERNET-кадрами и TCP/UDP-кадрами, то достаточно в приёмной комиссии оказаться одному человеку, кто понимает и можете смело ставить крест на защите. Если бы я был в комиссии, а Вы с таким ТЗ притащили проект сделанный на TCP/UDP, то я бы завалил.  Цитата(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-стека?
|
|
|
|
|
May 15 2018, 09:09
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|