Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: пропажа пакетов на USB
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sagittarius
Здравствуйте.

Есть AT91SAM7SE512. Одна из endpoint сконфигурена на прием как bulk, 64 байта. От PC из верхнего софта посылаются пакеты по 2кбайта, которые где то внутри виндов бьются по 64 байта и сваливаются в микроконтроллер. Скорость обмена примерно 200кб/сек на прием и столько же на передачу. Проблема в том, что иногда какой ни будь из этих кусков по 64 байта пропадает.
Собственно вопрос - это нормальная ситуация или чего то в программе надо/можно подправить?

Спасибо.
sergeeff
Цитата(Sagittarius @ Mar 11 2009, 21:18) *
Здравствуйте.

Есть AT91SAM7SE512. Одна из endpoint сконфигурена на прием как bulk, 64 байта. От PC из верхнего софта посылаются пакеты по 2кбайта, которые где то внутри виндов бьются по 64 байта и сваливаются в микроконтроллер. Скорость обмена примерно 200кб/сек на прием и столько же на передачу. Проблема в том, что иногда какой ни будь из этих кусков по 64 байта пропадает.
Собственно вопрос - это нормальная ситуация или чего то в программе надо/можно подправить?

Спасибо.


Чего-то в программе поправить нужно.
galjoen
Цитата(Sagittarius @ Mar 11 2009, 20:18) *

Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие...
А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме.
Или приём разрешается до того, как буфер прочитан.
Sagittarius
Цитата(galjoen @ Mar 11 2009, 20:41) *
Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие...
А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме.
Или приём разрешается до того, как буфер прочитан.

прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании.
А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как laughing.gif
Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить.
galjoen
Цитата(Sagittarius @ Mar 11 2009, 21:17) *
прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании.
А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как laughing.gif
Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить.

Видимо в вашем случае отправкой ACK управлять невозможно - такое железо. Я с ним не работал. Но MassStorage сделал, и ни разу пакеты не терял. Хорошо бы сниффером посмотреть был-ли этот пакет действительно послан, но 2..10 миллионов... Могу предположить, что с чередованием DATA0/1 что-то не то. У вас это проверяется? Я о том, что при приходе 2х пакетом с одинаковым маркером DATA подряд жел-но сравнить данные (и длину конечно) в них между собой. Если разные - пакет был пропущен. В этом случае обычно STALL хосту слать надо в ответ на следующий маркер.
aaarrr
Управлять ACK, разумеется, можно - для этого достаточно просто не читать данные из буфера. По поводу глюка могу только предположить, что у Вас каким-то образом сбрасывается чужой AT91C_UDP_RX_DATA_BKx в редких случаях. Выложите код чтения буфера - посмотрим.
Sagittarius
Цитата(aaarrr @ Mar 11 2009, 21:51) *
Управлять ACK, разумеется, можно - для этого достаточно просто не читать данные из буфера. По поводу глюка могу только предположить, что у Вас каким-то образом сбрасывается чужой AT91C_UDP_RX_DATA_BKx в редких случаях. Выложите код чтения буфера - посмотрим.

э ... про AT91C_UDP_RX_DATA_BKx ... спасибо за мысль, есть один аттавизм от первых экспериментов с USB - чистка регистров после чтения принятых данных.
а с ACK - я так понимаю что если в процессе передачи произошел сбой и чего то там внутри USB device не сошлось то пакет наверх даже не выйдет, а если выйдет так правильный? и тогда его нет смысла не вычитывать.
aaarrr
Я, наверное, не совсем понятно выразил свою мысль: если у Вас в буфере уже есть пакет, то он однозначно правильный, и модуль UDP уже дал ACK хосту. Но до тех пор, пока программа этот буфер не вычитает, хосту будут идти NAK'и на последующие попытки передачи. Таким способом можно только управлять потоком.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.