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

 
 
> вопрос по USB, AT91SAM7-X256
Понедельник
сообщение Oct 3 2007, 11:25
Сообщение #1


Частый гость
**

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



проинициализировал UDP, запускаю программу, втыкаю шнур USB, пока работаю не по прерываниям, в вайле проверяю флаг RXSETUP, после его установки считываю RXBYTECNT байт (8) из ФИФО, вот они
0x80
0x06
0x00
0x01
0x00
0x00
0x40
0x00
считаю полученный фрейм запросом хоста дескриптора устройства, т.к. размер дескриптора больше макс. размера буфера для нулевой конечной точки, разбиваю дескриптор на 3 части (8 8 2 байта) , записываю первые 8 байт в ФИФО, устанавливаю флаг TXPKTRDY, сбрасываю TXCOMP, жду пока TXPKTRDY == 0, отправляю в ФИФО след. 8 байт, потом оставшиеся 2 байта , вот мой дескриптор :
//! \brief Device descriptor
#define USB_DEVICE_DESCRIPTOR 0x01
//! \brief Interface power descriptor
#define USB_ENDPOINT0_MAXPACKETSIZE 8
//! idVendor - ATMEL Vendor ID
#define USB_VENDOR_ATMEL 0x03EB
//! bcdUSB field - USB 2.0 specification code
#define USB2_00 0x0200
#define USB1_10 0x0110
static const S_usb_device_descriptor sDeviceDescriptor = {

sizeof(S_usb_device_descriptor), // Size of this descriptor in bytes
USB_DEVICE_DESCRIPTOR, // DEVICE Descriptor Type
USB1_10, // USB Specification 2.0
0x00, // Class is specified in the interface descriptor.
0x00, // Subclass is specified in the interface descriptor.
0x00, // Protocol is specified in the interface descriptor.
USB_ENDPOINT0_MAXPACKETSIZE, // Maximum packet size for endpoint zero
USB_VENDOR_ATMEL, // Vendor ID "ATMEL"
0x1234, // Product ID
0x0001, // Device release number
0x01, // Index 1: manufacturer string
0x02, // Index 2: product string
0x03, // Index 3: serial number string
0x01 // One possible configurations
};
система пишет, что обнаружено неизвестное устройство, в диспетчере DEVid = 0000 VENDORid=0000?
винды повторяют посылку запроса дескриптора еще 3 раза, т.е. принимаются пакеты правильно, проблема с отправкой. Намекните, чего я не так делаю ? Спасибо

Сообщение отредактировал Понедельник - Oct 3 2007, 11:27
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Oct 3 2007, 11:52
Сообщение #2


Гуру
******

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



Цитата(Понедельник @ Oct 3 2007, 15:25) *
записываю первые 8 байт в ФИФО, устанавливаю флаг TXPKTRDY, сбрасываю TXCOMP, жду пока TXPKTRDY == 0, отправляю в ФИФО след. 8 байт, потом оставшиеся 2 байта

По-моему, логика при обработке запроса получается такая:
1. Установить DIR и сбросить RXSETUP
2. Записать 8 байт пакета
3. УстановитьTXPKTRDY
4. Дождаться TXCOMP
5. Записать следующую порцию данных
6. Установить DIR и TXPKTRDY и сбросить TXCOMP
П.п. 4-6 повторяются для оставшихся данных.
Go to the top of the page
 
+Quote Post
Понедельник
сообщение Oct 3 2007, 12:38
Сообщение #3


Частый гость
**

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



Цитата(aaarrr @ Oct 3 2007, 15:52) *
По-моему, логика при обработке запроса получается такая:
1. Установить DIR и сбросить RXSETUP
2. Записать 8 байт пакета
3. УстановитьTXPKTRDY
4. Дождаться TXCOMP
5. Записать следующую порцию данных
6. Установить DIR и TXPKTRDY и сбросить TXCOMP
П.п. 4-6 повторяются для оставшихся данных.

переписал, как вы советовали, теперь зависает на проверке TXCOMP перед отправкой последних 2 байт
Go to the top of the page
 
+Quote Post
KAlex
сообщение Oct 3 2007, 12:59
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(Понедельник @ Oct 3 2007, 16:38) *
переписал, как вы советовали, теперь зависает на проверке TXCOMP перед отправкой последних 2 байт

Вот кусок, у меня работает.
//*----------------------------------------------------------------------------
//* \fn AT91F_USB_SendData
//* \brief Send Data through the control endpoint
//*----------------------------------------------------------------------------
__arm static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, u_int length){
u_int cpt = 0;
AT91_REG csr;
do { cpt = MIN(length, 8);
length -= cpt;
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXPKTRDY)
if ( pUdp->UDP_ISR & AT91C_UDP_RXSUSP ) return;
while (cpt--) pUdp->UDP_FDR[0] = *pData++;
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}
pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
do {
csr = pUdp->UDP_CSR[0];
// Data IN stage has been stopped by a status OUT
if (csr & AT91C_UDP_RX_DATA_BK0) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0);
return;
}
} while ( !(csr & AT91C_UDP_TXCOMP) );
} while (length);
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}
}
Go to the top of the page
 
+Quote Post



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

 


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


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