VHEMaster 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 (изменено) · Жалоба Доброго времени суток! Недавно стал владельцем 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 серверу и начинает брать данные. Изменено 4 февраля, 2016 пользователем VHEMaster Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба ...Я так понимаю, объём полезных данных в TCP пакете равен 536 байт.... не правильно понимаете. в TCP.... нет пакетов, от слова совсем. Это потоковый протокол. и второе. вы можете без проблем сформировать с успехом! IP пакет в 65535 байт, передать его по сети, и даже принять его! И даже без взведения флага запрета дефрагментирования. Т.е. сам протокол IP это позволяет. Для бОльшей продуктивности, обычно все хопы имеют дефолтное ограничение в 1500 байт на уровне IP. Т.е. если Вы зашлёте максимум - то он тупо будет порезан на указанную размерность. возвращаясь к баранам. Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти. Роющаяся собака - где то там :) (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VHEMaster 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 (изменено) · Жалоба Вам нужно проверить так называемый слой драйвера(то что обрабатывает прерывание от ПДП буфера приёма) и код выделения памяти. В каком файле примерно искать?.. Можете помочь с этим? UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?.... Изменено 4 февраля, 2016 пользователем VHEMaster Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба UPD: методом тыка выяснил, что перестаёт идти прерывание от ETH... Почему?.... Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Вы ждете, что люди вам ответят? - Исчерпывающая информация находится в регистрах МК. Всё, расходимся. Это универсальный ответ. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Всё, расходимся. Это универсальный ответ. :laughing: У меня бывало машина состояний передачи останавливалась. Лечу так: while(ETH->DMASR & ETH_DMASR_TBUS) { ETH->DMASR = ETH_DMASR_TBUS; ETH->DMATPDR = 0; } Но у ТС, вроде, прием ломается. В любом случае - начинаем с ETH->DMASR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба в TCP.... нет пакетов, от слова совсем. Это потоковый протокол. Запредельный бред. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба в TCP.... нет пакетов, от слова совсем. Это потоковый протокол. Запредельный бред. Опа! Каждый день узнаю что-то новое Т.е. если он получит 15-20 пакетов, то всё. Всякая связь с контроллером по Ethernet пропадает. Даже нет ответов на PING. МК был не стм, но было такое дело, в сетевом контроллере был циклический буфер на 10 или 20 пакетов, переключение буферов автоматом, но когда все заполнено, нужно было перевести адрес на 1й буфер, чтоб процесс повторялся, так для этого нужно было использовать прерывание, а я про него забыл, и тоже, принимал эти 10-20 пакетов, потом кранты - ничего не принимает! Может не ваш случай, но вспомнилось похожее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VHEMaster 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Лечу так: while(ETH->DMASR & ETH_DMASR_TBUS) { ETH->DMASR = ETH_DMASR_TBUS; ETH->DMATPDR = 0; } А в какой именно момент нужно вставлять этот фрагмент? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба А в какой именно момент нужно вставлять этот фрагмент? Когда пакет нужно отправить. Все куда надо заносим, а после этого выполняем этот фрагмент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VHEMaster 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Проблема решилась. Дело в том, что я лез туда, куда не нужно было. Вместо tcp.h я начал использовать sockets.h и всё стало работать хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться