реклама на сайте
подробности

 
 
> Непонятки с UDP у SAM7S64
sgrig
сообщение May 24 2007, 07:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 все работает как часы, поэтому обсуждать правильность реализации протокола, видимо, не имеет смысла.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
YKonstantin
сообщение May 28 2007, 17:38
Сообщение #2


Участник
*

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



Цитата(sgrig @ May 24 2007, 10:35) *
3) первые 8 байт дескриптора загружаю в FIFO и поднимаю TXPKTRDY
6) очередную порцию дескриптора загружаю в FIFO и поднимаю TXPKTRDY


А какой размер второго пакета?
Случайно не 8, и к тому же это последний пакет?
Go to the top of the page
 
+Quote Post
sgrig
сообщение May 29 2007, 03:36
Сообщение #3


Участник
*

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



Цитата(YKonstantin @ May 29 2007, 00:38) *
А какой размер второго пакета?
Случайно не 8, и к тому же это последний пакет?

Нет, эту фишку я тоже знаю. Там действительно косяк с прерыванием.
Go to the top of the page
 
+Quote Post
YKonstantin
сообщение May 29 2007, 05:26
Сообщение #4


Участник
*

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



А вот еще вариант : может слишком долго в прерывании сидите после отправки данных?
Я к тому, что перед выходом из обработчика надо сбросить флаг в AIC, а если до этого пришло следующее прерывание то вы его получается принудительно сбросите ...
Go to the top of the page
 
+Quote Post
sgrig
сообщение May 29 2007, 07:47
Сообщение #5


Участник
*

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



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

Как я писАл ранее, кроме TX_COMP и STALLSENT, от других флагов прерывания идут.
Go to the top of the page
 
+Quote Post
YKonstantin
сообщение May 29 2007, 07:57
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
sgrig
сообщение May 29 2007, 08:35
Сообщение #7


Участник
*

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



Цитата(YKonstantin @ May 29 2007, 14:57) *
Я говорил о такой ситуации :

- вошли в первое прерывание от TX_COMP
- отправили второй пакет
- достаточно долго чем-то занимались
- пришло второе прерывание от TX_COMP (но мы еще обрабатываем первое)
- наконец-то решили выйти из обработчика прерывания
- записали в AIC_EOICR (тем самым игнорируя второе прерывание от TX_COMP [оно небось по фронту])
- вышли из первого прерывания

Итог : второго прерывания как бы и небыло ...

Еще "в догонку" : в свое время лажанулся - разрешал прерывание от контрольной точки ДО ее конфигурирования. Как результат : прерываний от приемника не получал ...


При отправке статуса (пакета нулевой длины) из прерывания вываливаюсь сразу же после установки флага TXPKTRDY - прерывания от TXCOMP нет. Сам же флаг устанавливается - проверял поллингом. С механизмом прерываний тоже все вроде бы правильно - остальные то идут.
Прерывание, естественно, открывается в последнюю очередь.
А у Вас "подкачка" в прерывании получилась?
Go to the top of the page
 
+Quote Post
YKonstantin
сообщение May 29 2007, 09:02
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 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) от приема во второй буфер.
Go to the top of the page
 
+Quote Post
sgrig
сообщение May 29 2007, 11:37
Сообщение #9


Участник
*

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



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

То есть TXCOMP и STALLSENT также поллингуете (ждете в цикле)?
Go to the top of the page
 
+Quote Post
YKonstantin
сообщение May 29 2007, 11:51
Сообщение #10


Участник
*

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



Цитата(sgrig @ May 29 2007, 14:37) *
То есть TXCOMP и STALLSENT также поллингуете (ждете в цикле)?


Да.
Собственно ф-ции посылки без изменения взяты из CDC-шного примера.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016