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

 
 
> Usbser.sys и AT91SAM7x256
antoxa1
сообщение Jan 9 2008, 09:29
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 6-04-06
Пользователь №: 15 889



Есть плата(самоделка) на основе AT91SAM7x256. Из примеров, поставляемых с Keil, из папки Boards\Atmel\AT91SAM7S взят пример для HID устройства. Данный пример, переработан с целью исполнения CDC устройства(изменены дискрипторы и т.д. и т.п).
При подключении к шине USB устройство определяется нормально. В качестве драйвера виртуального COM порта установлен usbser.sys.
Ситуация такая: через HyperTerminal на устройство отправляется байт данных, в ответ на это устройством должен отправляется байт "подтверждения", HyperTerminal принимает этот байт в первый раз нормально..при отправке следующего байта в устройство должно произойти тоже самое, но терминал не получает никаких данных в ответ. Отправка байт в устройство проходит нормально. При этом если работать с устройством через программу BusHound(монитор шины USB) то отправка и последующий приём выполняются корректно.
Вопрос: почему терминал не принимает второй и, соответственно, последующие байты "подтверждения"? Если кто может объяснить как работать с usbser.sys(или виртуальными COMпортами), откликнитесь, пожалуйста.
P.S. мой поиск по данной теме не дал видимых результатов
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dron_Gus
сообщение Jan 9 2008, 17:51
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Данные в конечную точку записывать после примерно такой проверки:

Код
while ( !(pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP) );
pUdp->UDP_CSR[EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP);


Первая строчка - дожидаемся отправки предыдущих данных.

Вторая строчка - сбрасываем флаг отправки

Третья строчка - дожидаемся сброса этого флага (USB и проц работают на разных частотах, поэтому флаг сбрасывается "не сразу")



Ну или полный код отправки пакета (пакет может быть и больше размера конечной точки):

Код
uint AT91F_UDP_Write(AT91PS_HID pHid, const char *pData, uint length)
{
AT91PS_UDP pUdp = pHid->pUdp;
uint cpt = 0;

// Send the first packet
cpt = MIN(length, EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[EP_IN] = *pData++;
pUdp->UDP_CSR[EP_IN] |= AT91C_UDP_TXPKTRDY;

while (length) {
  // Fill the second bank
  cpt = MIN(length, EP_IN_SIZE);
  length -= cpt;
  while (cpt--) pUdp->UDP_FDR[EP_IN] = *pData++;
  // Wait for the the first bank to be sent
                //while ( !(AT91S_UDP_EP[EP_IN].CSR & AT91C_UDP_TXCOMP))
  while ( !(pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP) )
   if ( !AT91F_UDP_IsConfigured(pHid) ) return length;
  pUdp->UDP_CSR[EP_IN] &= ~(AT91C_UDP_TXCOMP);
                //AT91S_UDP_EP[EP_IN].CSR &= ~(AT91C_UDP_TXCOMP);
  while (pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP);
                //while (AT91S_UDP_EP[EP_IN].CSR & AT91C_UDP_TXCOMP);
  pUdp->UDP_CSR[EP_IN] |= AT91C_UDP_TXPKTRDY;
}
// Wait for the end of transfer
return length;
}




З.Ы. Выдрано откуда-то из примеров Atmel.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post



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

 


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


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