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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Контроллер повисает после перезапуска приложения, если при этом происходила передача данных по USB от контроллера приложению, at91sam7s
Bulat
сообщение Jun 25 2010, 08:55
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Проблему локализовал.
Если во время приема девайсом данных от некого источника и передачи их по USB на ПК мы перезагружаем приложение, то приложение повторно балгополучно открывает девайс и производит в него запись команд, но девайс не отвечает. Дело в том, что при перезагрузке приложения в FIFO UDP контролера остаются несчитанные данные, а при запуске приложения сначала запрашивается серийный номер девайса, но так как у нас в FIFO в этот момент неизвестно что и неизвестно какого размера, то происходит сбой - readfile считывает неизвестно что.
Поэтому я хочу при закрытии приложения, по комнаде "Turn Off" сбрасывать конечную точку IN с помощью регистра UDP_RSTEP, но перед этим необходимо послать хосту Stall и дождаться подтверждения. Привожу код команды "Turn Off":
Код
__ramfunc void Turn_off()
{
  
   AT91C_BASE_SYS->PIOA_IDR = 0xffffffff;

   //посылаем Stall хосту и ждем подтверждения
   pUdp->UDP_CSR[0] |= AT91C_UDP_FORCESTALL;
   while(!(pUdp->UDP_CSR[0] & AT91C_UDP_ISOERROR));
   pUdp->UDP_CSR[0] &= ~(AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR);
   while (pUdp->UDP_CSR[0] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR));
  
   //Сброс конечной точки
   AT91C_BASE_UDP->UDP_RSTEP |= AT91C_UDP_EPINT1;
   AT91C_BASE_UDP->UDP_RSTEP &= ~AT91C_UDP_EPINT1;


Видимо я что-то упустил, так как в таком виде проблему решить всерано не удалось.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 09:14
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Состояние STALL Bulk-точки нельзя снимать просто так в произвольный момент времени, это должен делать хост командой Clear Feature. Выполнять сброс точки следует именно по этой команде.

Цитата(Bulat @ Jun 25 2010, 12:55) *
Видимо я что-то упустил, так как в таком виде проблему решить всерано не удалось.

Т.е. при считывании серийного номера readfile все равно возвращает мусор?
Go to the top of the page
 
+Quote Post
Bulat
сообщение Jun 25 2010, 09:24
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(aaarrr @ Jun 25 2010, 15:14) *
Состояние STALL Bulk-точки нельзя снимать просто так в произвольный момент времени, это должен делать хост командой Clear Feature. Выполнять сброс точки следует именно по этой команде.

Тогда когда мне делать сброс конечной точки. Какой-то флаг ждать?

Цитата(aaarrr @ Jun 25 2010, 15:14) *
Т.е. при считывании серийного номера readfile все равно возвращает мусор?

ReadFile(PipeIn, &buf_r, 3, &RealRead, NULL);
То есть, считываю 3 байта, RealRead = 0 и в buf_r мусор.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 09:33
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Jun 25 2010, 13:24) *
Тогда когда мне делать сброс конечной точки. Какой-то флаг ждать?

Ждать запрос CLEAR_FEATURE->HALT для нужной точки. Драйвер, возможно, нужно попросить это сделать.

Цитата(Bulat @ Jun 25 2010, 13:24) *
ReadFile(PipeIn, &buf_r, 3, &RealRead, NULL);
То есть, считываю 3 байта, RealRead = 0 и в buf_r мусор.

Тогда чтения как такового и не было.
Go to the top of the page
 
+Quote Post

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

 


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


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