|
Непонятки с UDP у SAM7S64 |
|
|
|
May 24 2007, 07:35
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Зашел в тупик, бьюсь не первый день. Может, что подскажете?
Делаю HID-устройство на SAM7S64. Обслуживаю прерывание от EP0 стандартно: получаю запрос, разгребаю его и отправляю в ответ дескриптор или репорт. Для справки: размер EP0 равен 8 байтам, а дескрипторы и репорты могут быть больше.
Суть проблемы: Если перед загрузкой в FIFO очередной порции данных флаг TXCOMP опрашиваю поллингом в цикле (так сделано в примере HID mouse от Atmel) - все работает как надо, вопросов нет. Но крутиться в прерывании как-то некрасиво. Если же я начинаю делать "подкачку" данных в прерывании по TXCOMP, то, почему-то, не отправляется уже вторая порция данных.
Например, обрабатывается запрос хоста GET_DESCRIPTOR_DEVICE: 1) по прерыванию от EP0 выгребаю запрос из FIFO 2) формирую дескриптор устройства 3) первые 8 байт дескриптора загружаю в FIFO и поднимаю TXPKTRDY 4) жду прерывания от TXCOMP - и оно приходит 5) сбрасываю TXCOMP 6) очередную порцию дескриптора загружаю в FIFO и поднимаю TXPKTRDY и ничего не передается, хост ждет некоторое время и обрывает транзакцию IN.
Про необходимость правильной реакции на обрыв транзакции знаю. Где могут быть грабли? Любые соображения приму с багодарностью.
PS. Обратите внимание, что в случае поллинга флага TXCOMP все работает как часы, поэтому обсуждать правильность реализации протокола, видимо, не имеет смысла.
|
|
|
|
|
 |
Ответов
|
May 28 2007, 17:38
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 038

|
Цитата(sgrig @ May 24 2007, 10:35)  3) первые 8 байт дескриптора загружаю в FIFO и поднимаю TXPKTRDY 6) очередную порцию дескриптора загружаю в FIFO и поднимаю TXPKTRDY А какой размер второго пакета? Случайно не 8, и к тому же это последний пакет?
|
|
|
|
|
May 29 2007, 03:36
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Цитата(YKonstantin @ May 29 2007, 00:38)  А какой размер второго пакета? Случайно не 8, и к тому же это последний пакет? Нет, эту фишку я тоже знаю. Там действительно косяк с прерыванием.
|
|
|
|
|
May 29 2007, 05:26
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 038

|
А вот еще вариант : может слишком долго в прерывании сидите после отправки данных? Я к тому, что перед выходом из обработчика надо сбросить флаг в AIC, а если до этого пришло следующее прерывание то вы его получается принудительно сбросите ...
|
|
|
|
|
May 29 2007, 07:47
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Цитата(YKonstantin @ May 29 2007, 12:26)  А вот еще вариант : может слишком долго в прерывании сидите после отправки данных? Я к тому, что перед выходом из обработчика надо сбросить флаг в AIC, а если до этого пришло следующее прерывание то вы его получается принудительно сбросите ... Как я писАл ранее, кроме TX_COMP и STALLSENT, от других флагов прерывания идут.
|
|
|
|
|
May 29 2007, 07:57
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 038

|
Цитата(sgrig @ May 29 2007, 10:47)  Как я писАл ранее, кроме TX_COMP и STALLSENT, от других флагов прерывания идут. Я говорил о такой ситуации : - вошли в первое прерывание от TX_COMP - отправили второй пакет - достаточно долго чем-то занимались - пришло второе прерывание от TX_COMP (но мы еще обрабатываем первое) - наконец-то решили выйти из обработчика прерывания - записали в AIC_EOICR (тем самым игнорируя второе прерывание от TX_COMP [оно небось по фронту]) - вышли из первого прерывания Итог : второго прерывания как бы и небыло ... Еще "в догонку" : в свое время лажанулся - разрешал прерывание от контрольной точки ДО ее конфигурирования. Как результат : прерываний от приемника не получал ...
Сообщение отредактировал YKonstantin - May 29 2007, 08:09
|
|
|
|
|
May 29 2007, 08:35
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Цитата(YKonstantin @ May 29 2007, 14:57)  Я говорил о такой ситуации :
- вошли в первое прерывание от TX_COMP - отправили второй пакет - достаточно долго чем-то занимались - пришло второе прерывание от TX_COMP (но мы еще обрабатываем первое) - наконец-то решили выйти из обработчика прерывания - записали в AIC_EOICR (тем самым игнорируя второе прерывание от TX_COMP [оно небось по фронту]) - вышли из первого прерывания
Итог : второго прерывания как бы и небыло ...
Еще "в догонку" : в свое время лажанулся - разрешал прерывание от контрольной точки ДО ее конфигурирования. Как результат : прерываний от приемника не получал ... При отправке статуса (пакета нулевой длины) из прерывания вываливаюсь сразу же после установки флага TXPKTRDY - прерывания от TXCOMP нет. Сам же флаг устанавливается - проверял поллингом. С механизмом прерываний тоже все вроде бы правильно - остальные то идут. Прерывание, естественно, открывается в последнюю очередь. А у Вас "подкачка" в прерывании получилась?
|
|
|
|
|
May 29 2007, 09:02
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 038

|
Цитата(sgrig @ May 29 2007, 11:35)  При отправке статуса (пакета нулевой длины) из прерывания вываливаюсь сразу же после установки флага TXPKTRDY - прерывания от TXCOMP нет. Сам же флаг устанавливается - проверял поллингом. С механизмом прерываний тоже все вроде бы правильно - остальные то идут. Прерывание, естественно, открывается в последнюю очередь. А у Вас "подкачка" в прерывании получилась? Я использую не-HID протокол. Поэтому в контрольной точке жульничаю - отправляю ответы с ожиданием (для пакетов 0-й длины "AT91C_UDP_TXCOMP", а для "штопора" - "AT91C_UDP_ISOERROR"). Для получения данных большого (>8-ми байт) обьема использую прием в "Bulk" точку №1. При этом использую "пинг-понг". Так вот в этом самом случае возникала ситуация, когда я приняв все данные из одного буфера выходил из прерывания не проверив "а не успел ли за это время заполниться второй буфер", и тем самым терял прерывание (мы ведь помним о записи в AIC_EOICR) от приема во второй буфер.
|
|
|
|
|
May 29 2007, 11:37
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Цитата(YKonstantin @ May 29 2007, 16:02)  Я использую не-HID протокол. Поэтому в контрольной точке жульничаю - отправляю ответы с ожиданием (для пакетов 0-й длины "AT91C_UDP_TXCOMP", а для "штопора" - "AT91C_UDP_ISOERROR"). То есть TXCOMP и STALLSENT также поллингуете (ждете в цикле)?
|
|
|
|
|
May 29 2007, 11:51
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 7-11-06
Пользователь №: 22 038

|
Цитата(sgrig @ May 29 2007, 14:37)  То есть TXCOMP и STALLSENT также поллингуете (ждете в цикле)? Да. Собственно ф-ции посылки без изменения взяты из CDC-шного примера.
|
|
|
|
Сообщений в этой теме
sgrig Непонятки с UDP у SAM7S64 May 24 2007, 07:35 KAlex Цитата(sgrig @ May 24 2007, 11:35) 5) сбр... May 24 2007, 08:24 sgrig Цитата(KAlex @ May 24 2007, 15:24) Попроб... May 24 2007, 08:35  KAlex Вот кусок рабочего кода. Никаких прерываний. AT91F... May 24 2007, 09:32   sgrig Цитата(KAlex @ May 24 2007, 16:32) Вот ку... May 24 2007, 12:45 KAlex Цитата(sgrig @ May 24 2007, 11:35) Наприм... May 24 2007, 13:17 sgrig Цитата(KAlex @ May 24 2007, 20:17) О... May 24 2007, 14:40  KAlex Цитата(sgrig @ May 24 2007, 18:40) Ведь T... May 25 2007, 07:41   sgrig Попробовал и это. Не помогло. Пойду напьюсь, может... May 25 2007, 09:52    KAlex Цитата(sgrig @ May 25 2007, 13:52) Попроб... May 25 2007, 10:15     sgrig Цитата(KAlex @ May 25 2007, 17:15)
Тоже... May 25 2007, 10:28      Calculator Цитата(sgrig @ May 25 2007, 16:28) Наприм... May 28 2007, 05:26       sgrig Цитата(Calculator @ May 28 2007, 12:26) Н... May 28 2007, 09:10         sgrig Цитата(YKonstantin @ May 29 2007, 18:51) ... May 29 2007, 12:08 Serg_Sm Подскажите по очень похожему вопросу - в теме реше... Mar 28 2016, 13:58 misyachniy Цитата(Serg_Sm @ Mar 28 2016, 15:58) 1) п... Mar 30 2016, 18:03  Serg_Sm Цитата(misyachniy @ Mar 30 2016, 21:03) Э... Apr 1 2016, 06:31 aaarrr Нет, так нельзя. В приведенной цитате сказано, что... Apr 1 2016, 12:20 Serg_Sm Цитата(aaarrr @ Apr 1 2016, 15:20) Нет, т... Apr 1 2016, 12:33  aaarrr Цитата(Serg_Sm @ Apr 1 2016, 15:33) Указа... Apr 1 2016, 12:55   Serg_Sm Цитата(aaarrr @ Apr 1 2016, 15:55) Это зн... Apr 1 2016, 12:55 Serg_Sm Так все-таки, подскажите - запрос GetDeviceDescrip... Apr 15 2016, 10:29 misyachniy Цитата(Serg_Sm @ Apr 15 2016, 13:29) Так ... Apr 15 2016, 15:38  Serg_Sm Цитата(misyachniy @ Apr 15 2016, 19:38) П... Apr 15 2016, 19:43   misyachniy Цитата(Serg_Sm @ Apr 15 2016, 22:43) RESE... Apr 16 2016, 12:29 Serg_Sm Цитата(misyachniy @ Apr 16 2016, 16:29) В... Apr 18 2016, 06:22 misyachniy Цитата(Serg_Sm @ Apr 18 2016, 09:22) RESE... Apr 18 2016, 17:20  Serg_Sm Цитата(misyachniy @ Apr 18 2016, 20:20) Н... Apr 19 2016, 06:54 Serg_Sm Всё, вроде разобрался)) Теперь работает везде где ... Apr 21 2016, 14:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|