|
|
  |
STM32F429 + Ethernet PHY DP83484 |
|
|
|
Feb 4 2016, 15:26
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191

|
Доброго времени суток! Недавно стал владельцем 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 - Feb 4 2016, 15:28
|
|
|
|
|
Feb 4 2016, 16:11
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(VHEMaster @ Feb 4 2016, 18:26)  ...Я так понимаю, объём полезных данных в TCP пакете равен 536 байт.... не правильно понимаете. в TCP.... нет пакетов, от слова совсем. Это потоковый протокол. и второе. вы можете без проблем сформировать с успехом! IP пакет в 65535 байт, передать его по сети, и даже принять его! И даже без взведения флага запрета дефрагментирования. Т.е. сам протокол IP это позволяет. Для бОльшей продуктивности, обычно все хопы имеют дефолтное ограничение в 1500 байт на уровне IP. Т.е. если Вы зашлёте максимум - то он тупо будет порезан на указанную размерность. возвращаясь к баранам. Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти. Роющаяся собака - где то там  (круглый)
|
|
|
|
|
Feb 4 2016, 16:16
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191

|
Цитата(kolobok0 @ Feb 4 2016, 18:11)  Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти. В каком файле примерно искать?.. Можете помочь с этим? UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?....
Сообщение отредактировал VHEMaster - Feb 4 2016, 16:31
|
|
|
|
|
Feb 4 2016, 18:51
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(scifi @ Feb 4 2016, 21:34)  Всё, расходимся. Это универсальный ответ.  У меня бывало машина состояний передачи останавливалась. Лечу так: Код while(ETH->DMASR & ETH_DMASR_TBUS) { ETH->DMASR = ETH_DMASR_TBUS; ETH->DMATPDR = 0; } Но у ТС, вроде, прием ломается. В любом случае - начинаем с ETH->DMASR.
|
|
|
|
|
Feb 4 2016, 19:52
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(zltigo @ Feb 4 2016, 21:58)  в TCP.... нет пакетов, от слова совсем. Это потоковый протокол.
Запредельный бред. Опа! Каждый день узнаю что-то новое  Цитата(VHEMaster @ Feb 4 2016, 18:26)  Т.е. если он получит 15-20 пакетов, то всё. Всякая связь с контроллером по Ethernet пропадает. Даже нет ответов на PING. МК был не стм, но было такое дело, в сетевом контроллере был циклический буфер на 10 или 20 пакетов, переключение буферов автоматом, но когда все заполнено, нужно было перевести адрес на 1й буфер, чтоб процесс повторялся, так для этого нужно было использовать прерывание, а я про него забыл, и тоже, принимал эти 10-20 пакетов, потом кранты - ничего не принимает! Может не ваш случай, но вспомнилось похожее...
|
|
|
|
|
Feb 4 2016, 20:19
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191

|
Цитата(adnega @ Feb 4 2016, 20:51)  Лечу так: Код while(ETH->DMASR & ETH_DMASR_TBUS) { ETH->DMASR = ETH_DMASR_TBUS; ETH->DMATPDR = 0; } А в какой именно момент нужно вставлять этот фрагмент?
|
|
|
|
|
Feb 4 2016, 23:45
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 28-08-15
Пользователь №: 88 191

|
Проблема решилась. Дело в том, что я лез туда, куда не нужно было. Вместо tcp.h я начал использовать sockets.h и всё стало работать хорошо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|