Перейти к содержанию
    

STM32F429 + Ethernet PHY DP83484

Доброго времени суток! Недавно стал владельцем 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 серверу и начинает брать данные.

Изменено пользователем VHEMaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Я так понимаю, объём полезных данных в TCP пакете равен 536 байт....

 

не правильно понимаете.

в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.

и второе. вы можете без проблем сформировать с успехом! IP пакет в 65535 байт, передать его по сети, и даже принять его! И даже без взведения флага

запрета дефрагментирования. Т.е. сам протокол IP это позволяет. Для бОльшей продуктивности, обычно все хопы имеют дефолтное ограничение в

1500 байт на уровне IP. Т.е. если Вы зашлёте максимум - то он тупо будет порезан на указанную размерность.

 

возвращаясь к баранам.

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

Роющаяся собака - где то там :)

 

(круглый)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?....

Изменено пользователем VHEMaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?....

Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК.

Всё, расходимся.

Это универсальный ответ.

:laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, расходимся.

Это универсальный ответ.

:laughing:

У меня бывало машина состояний передачи останавливалась. Лечу так:

while(ETH->DMASR & ETH_DMASR_TBUS)
{
    ETH->DMASR    = ETH_DMASR_TBUS;
    ETH->DMATPDR  = 0;
}

Но у ТС, вроде, прием ломается.

В любом случае - начинаем с ETH->DMASR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.

 

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

 

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

 

Т.е. если он получит 15-20 пакетов, то всё. Всякая связь с контроллером по Ethernet пропадает. Даже нет ответов на PING.

МК был не стм, но было такое дело, в сетевом контроллере был циклический буфер на 10 или 20 пакетов, переключение буферов автоматом, но когда все заполнено, нужно было перевести адрес на 1й буфер, чтоб процесс повторялся, так для этого нужно было использовать прерывание, а я про него забыл, и тоже, принимал эти 10-20 пакетов, потом кранты - ничего не принимает!

Может не ваш случай, но вспомнилось похожее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лечу так:

while(ETH->DMASR & ETH_DMASR_TBUS)
{
    ETH->DMASR    = ETH_DMASR_TBUS;
    ETH->DMATPDR  = 0;
}

 

А в какой именно момент нужно вставлять этот фрагмент?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в какой именно момент нужно вставлять этот фрагмент?

Когда пакет нужно отправить. Все куда надо заносим, а после этого выполняем этот фрагмент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема решилась. Дело в том, что я лез туда, куда не нужно было. Вместо tcp.h я начал использовать sockets.h и всё стало работать хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...