Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F429 + Ethernet PHY DP83484
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
VHEMaster
Доброго времени суток! Недавно стал владельцем Ethernet PHY модуля на базе чипа DP83848.
Пытаюсь подружить его с STM32F429ZI, но проблема в том, что он не может нормально получать данные..
Т.е. если он получит 15-20 пакетов, то всё. Всякая связь с контроллером по Ethernet пропадает. Даже нет ответов на PING.
Я так понимаю, объём полезных данных в TCP пакете равен 536 байт. С пакетами, у которых этот объём занят полностью, такая-же проблема. Т.е. не важно, получает ли он те 15-20 пакетов, в которых инф-и на 1 байт, либо на все 536 байт. Всё равно он повисает. Как я проверял. Я сделал на контроллере сервер, который отправляет клиенту некую строку, а принятые данные выводит в UART. Так вот, как правило после 16-го пакета (или символа, введённого через telnet) связь тут же обрывается. Отладчик показал, что контроллер не уходит в исключение, а основной поток работает дальше.
Архив с проектом: http://rghost.ru/7vtTz7bYC
Вот скриншот: http://s018.radikal.ru/i519/1602/53/66fd8ee63bae.png
Кстати, точно такая-же беда и в режиме клиента, когда он подключается к какому-либо HTTP серверу и начинает брать данные.
kolobok0
Цитата(VHEMaster @ Feb 4 2016, 18:26) *
...Я так понимаю, объём полезных данных в TCP пакете равен 536 байт....


не правильно понимаете.
в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.
и второе. вы можете без проблем сформировать с успехом! IP пакет в 65535 байт, передать его по сети, и даже принять его! И даже без взведения флага
запрета дефрагментирования. Т.е. сам протокол IP это позволяет. Для бОльшей продуктивности, обычно все хопы имеют дефолтное ограничение в
1500 байт на уровне IP. Т.е. если Вы зашлёте максимум - то он тупо будет порезан на указанную размерность.

возвращаясь к баранам.
Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти.
Роющаяся собака - где то там sm.gif

(круглый)
VHEMaster
Цитата(kolobok0 @ Feb 4 2016, 18:11) *
Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти.


В каком файле примерно искать?.. Можете помочь с этим?

UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?....
adnega
Цитата(VHEMaster @ Feb 4 2016, 19:16) *
UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?....

Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК.
scifi
Цитата(adnega @ Feb 4 2016, 20:47) *
Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК.

Всё, расходимся.
Это универсальный ответ.
laughing.gif
adnega
Цитата(scifi @ Feb 4 2016, 21:34) *
Всё, расходимся.
Это универсальный ответ.
laughing.gif

У меня бывало машина состояний передачи останавливалась. Лечу так:
Код
while(ETH->DMASR & ETH_DMASR_TBUS)
{
    ETH->DMASR    = ETH_DMASR_TBUS;
    ETH->DMATPDR  = 0;
}

Но у ТС, вроде, прием ломается.
В любом случае - начинаем с ETH->DMASR.
zltigo
QUOTE (kolobok0 @ Feb 4 2016, 18:11) *
в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.

Запредельный бред.


mantech
Цитата(zltigo @ Feb 4 2016, 21:58) *
в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.

Запредельный бред.


Опа! Каждый день узнаю что-то новое biggrin.gif

Цитата(VHEMaster @ Feb 4 2016, 18:26) *
Т.е. если он получит 15-20 пакетов, то всё. Всякая связь с контроллером по Ethernet пропадает. Даже нет ответов на PING.

МК был не стм, но было такое дело, в сетевом контроллере был циклический буфер на 10 или 20 пакетов, переключение буферов автоматом, но когда все заполнено, нужно было перевести адрес на 1й буфер, чтоб процесс повторялся, так для этого нужно было использовать прерывание, а я про него забыл, и тоже, принимал эти 10-20 пакетов, потом кранты - ничего не принимает!
Может не ваш случай, но вспомнилось похожее...
VHEMaster
Цитата(adnega @ Feb 4 2016, 20:51) *
Лечу так:
Код
while(ETH->DMASR & ETH_DMASR_TBUS)
{
    ETH->DMASR    = ETH_DMASR_TBUS;
    ETH->DMATPDR  = 0;
}


А в какой именно момент нужно вставлять этот фрагмент?
adnega
Цитата(VHEMaster @ Feb 4 2016, 23:19) *
А в какой именно момент нужно вставлять этот фрагмент?

Когда пакет нужно отправить. Все куда надо заносим, а после этого выполняем этот фрагмент.
VHEMaster
Проблема решилась. Дело в том, что я лез туда, куда не нужно было. Вместо tcp.h я начал использовать sockets.h и всё стало работать хорошо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.