|
|
  |
пропажа пакетов на USB |
|
|
|
Mar 11 2009, 17:41
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Sagittarius @ Mar 11 2009, 20:18)  Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие... А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме. Или приём разрешается до того, как буфер прочитан.
|
|
|
|
|
Mar 11 2009, 18:17
|
Местный
  
Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659

|
Цитата(galjoen @ Mar 11 2009, 20:41)  Программу на базе примера делали? Если так, то ничего удивительного. Примеры они такие... А вообще, скорее всего у вас ACK в ответ на битый пакет от хоста шлётся. Как в изохронном режиме. Или приём разрешается до того, как буфер прочитан. прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании. А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить.
|
|
|
|
|
Mar 11 2009, 18:43
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Sagittarius @ Mar 11 2009, 21:17)  прогу сам писал, просто сделал класс USB который теперь таскаю из проекта в проект правя дескрипторы: стандартная клава, CDC, свой драйвер. Вся работа на прерывании. А как управлять отсылкой ACK? при вызове прерывания я смотрю что пришли данные и в правильный банк, вычитываю, сбрасываю флаг прихода данных (AT91C_UDP_RX_DATA_BKx) и собственно все. В ручную ACK-ом шевелить даже не знаю как Так как ожидается приход не одного пакета в 64 байта а кучи данных в 2к то есть таймаут и проверка на целостность, и иногда какой то из пакетов теряется (приблизительно 1 на 2-10 миллиона в тестах с максимальной нагрузкой). Сейчас это решено на уровне софта в МК и PC через повторы, но причину хочу найти и устранить. Видимо в вашем случае отправкой ACK управлять невозможно - такое железо. Я с ним не работал. Но MassStorage сделал, и ни разу пакеты не терял. Хорошо бы сниффером посмотреть был-ли этот пакет действительно послан, но 2..10 миллионов... Могу предположить, что с чередованием DATA0/1 что-то не то. У вас это проверяется? Я о том, что при приходе 2х пакетом с одинаковым маркером DATA подряд жел-но сравнить данные (и длину конечно) в них между собой. Если разные - пакет был пропущен. В этом случае обычно STALL хосту слать надо в ответ на следующий маркер.
|
|
|
|
|
Mar 11 2009, 20:21
|
Местный
  
Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659

|
Цитата(aaarrr @ Mar 11 2009, 21:51)  Управлять ACK, разумеется, можно - для этого достаточно просто не читать данные из буфера. По поводу глюка могу только предположить, что у Вас каким-то образом сбрасывается чужой AT91C_UDP_RX_DATA_BKx в редких случаях. Выложите код чтения буфера - посмотрим. э ... про AT91C_UDP_RX_DATA_BKx ... спасибо за мысль, есть один аттавизм от первых экспериментов с USB - чистка регистров после чтения принятых данных. а с ACK - я так понимаю что если в процессе передачи произошел сбой и чего то там внутри USB device не сошлось то пакет наверх даже не выйдет, а если выйдет так правильный? и тогда его нет смысла не вычитывать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|