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

STR912 Ethernet - ошибки приема

Здравствуйте! возникла проблема при разработке приложения. Поскольку нужно только ARP, DHCP, IP, UDP решил писать самостоятельно. На уровне ARP запросов заметил проблему: принимаю фрэйм с путаными байтами. WireShark показывает фрэйм с одними данными, а принятая информация отличается. Причём портятся, обычно, одни и те же байты фрэйма. Причём если O - нормальный байт, а X ошибочный, то общийвид фрэйма получается примерно такой:

OOOOOOOOOOOOOOXXOOOOOOOXXXOOOOOXXX (крестики-нолики расставлены схемотично). Первый ошибочный байт возникает в номере протокола в заголовке ARP(вместо 0x0800 получется 0xE5C и иногда разные вариации этого).

Драйвер брал штатный из примера кейла и переделал его под свой phy контроллер.

Кто-нибудь сталкивался с таким? С чем может быть связано такое поведение?

 

P.S. clock на phy контроллер делаю по-средствам PWM таймера 3. т.е. внетреняя частота 100МГц делю на 4 и получаю требуемые 25. Может проблема в джиттере клока?

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


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

У STR912 "хитрые" таймеры. Уже не помню, но считали они с какого-то неочивидного начального значения. Плюс где-то тут была тема, где обсуждалось, что таймеры выдают немного нерасчетную частоту. Тоже не помню чем закончилось. Поищите.

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


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

CRC ещё не смотрел. Частоту я осциллографом смотрел - вполне нормальные 25МГц. Правда там есть требования по стабильности и точности - в этом вопрос, но осциллограф 200МГц полосой не показывает проблем.

FCS - контрольная сумма? ещё не считал :) В настройках mac прочитал, что естьфункция фильтрации в том числе по несовпадению CRC. включил её, поэтому наивно полагал, что пакеты с заведомо правильной CRC. :/ Завтра проверю.

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


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

Поскольку нужно только ARP, DHCP, IP, UDP решил писать самостоятельно.

Может не по теме, но самому писать эти протоколы - неблагодарная задача. Почему бы не взять Lwip? Там всё это есть, а лишнее можно отключить.

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


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

Может не по теме, но самому писать эти протоколы - неблагодарная задача. Почему бы не взять Lwip? Там всё это есть, а лишнее можно отключить.

Думаю от ошибок приёма это не избавит :( Я взял OpenTCP и вытягиваю оттуда нужные мне куски. А протоколы вобщем-то примтивны эти, поэтому и самому реализовать не сложно в применении к Ethernet.

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


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

P.S. clock на phy контроллер делаю по-средствам PWM таймера 3. т.е. внетреняя частота 100МГц делю на 4 и получаю требуемые 25. Может проблема в джиттере клока?

 

Зачем с помощью таймера, если для этих целей предусмотрен специальный вывод.

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


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

CRC ещё не смотрел. Частоту я осциллографом смотрел - вполне нормальные 25МГц. Правда там есть требования по стабильности и точности - в этом вопрос, но осциллограф 200МГц полосой не показывает проблем.

А по глазковой диаграмме? Должно быть +/- 50 ppm

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


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

Зачем с помощью таймера, если для этих целей предусмотрен специальный вывод.

Мне нужно чтобы одновременно работал USB и Ethernet. Если подбираю клок под одно, то не получается сделать другое. Однако, если на USB подать клок на внешний пин, его же поделить на 2 тригером и подать на PLL можно решить проблему наличия единственного клока в системе.

Выход PHY_CLK выдаёт только то, что поступает на вход PLL, поэтому тут вариантов не много. :(

 

А по глазковой диаграмме? Должно быть +/- 50 ppm

На осциллографе 25.0000, что входит в указанные ворота (проверял этот параметр когда читал datasheet на phy контроллер).

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


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

Переконфигурировал штатный пример easyweb из кейла - работает нормально. Значит проблема не аппаратная и не с таймером. Отличие моего драйвера от штатного - использование прерываний. Может быть он не успевает закончить прием фрэйма, а я уже пытаюсь из него что-то вытащить и поэтому натыкаюсь на некую абстрактную информацию? прерывание RX_CURR_DONE обрабатываю...

Какие-нибудь ещё варианты есть?

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

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


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

Более менее разобрался... Сделал правки в программе и всё стало на свои места, кроме одного: в поле protocol type заголовка ARP получаю каждый раз разную ерунду, вместо желаемых 0x800. WireShark всё показывает нормально. однако до и после этого слова инфомрация верная принимается. Ума не приложу, как процессор может портить конкретное слово :/

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


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

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

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


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

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

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

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

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

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

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

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

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

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