Цитата(aaarrr @ Oct 3 2007, 16:56)

Странно: последовательность проверил, все работает нормально.
Выложите код, попробуем разобраться.
Да, и выложите дескриптор в удобочитаемом виде, что такое S_usb_device_descriptor для меня, например, осталось загадкой.
typedef struct {
unsigned char bLength; //!< Size of this descriptor in bytes
unsigned char bDescriptorType; //!< DEVICE descriptor type
unsigned short bscUSB; //!< USB specification release number
unsigned char bDeviceClass; //!< Class code
unsigned char bDeviceSubClass; //!< Subclass code
unsigned char bDeviceProtocol; //!< Protocol code
unsigned char bMaxPacketSize0; //!< Control endpoint 0 max. packet size
unsigned short idVendor; //!< Vendor ID
unsigned short idProduct; //!< Product ID
unsigned short bcdDevice; //!< Device release number
unsigned char iManufacturer; //!< Index of manu. string descriptor
unsigned char iProduct; //!< Index of prod. string descriptor
unsigned char iSerialNumber; //!< Index of S.N. string descriptor
unsigned char bNumConfigurations; //!< Number of possible configurations
} S_usb_device_descriptor;
char* point;
point = &sDeviceDescriptor;
while(1)
{
value++;
// *AT91C_UDP_CSR |= 0x8000;
while(!(*AT91C_UDP_CSR & 0x4));
len = ((*AT91C_UDP_CSR) >> 16) & 0xFFFF;
for (i = 0; i < len; i++)
{
buf[value][i] = *AT91C_UDP_FDR;
}
*AT91C_UDP_CSR |= 0x80; //set DIR
Delay(10);
*AT91C_UDP_CSR &= 0xFFFFFFFB; //clear RXSETUP
////////////////////////////////////
for(i = 0; i < 8; i++)
{
*AT91C_UDP_FDR = *(point++);// write data to fifo
}
*AT91C_UDP_CSR |= 0x80; //set DIR
*AT91C_UDP_CSR |= 0x10; //set TXPKTRDY
////////////////////////////////////////////////////////////////
while(!(*AT91C_UDP_CSR & 0x1));// wait finish send
*AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP
Delay(10);
for(i = 0; i < 8; i++)
{
*AT91C_UDP_FDR = *(point++);// write data to fifo
}
*AT91C_UDP_CSR |= 0x80; //set DIR
Delay(10);
*AT91C_UDP_CSR |= 0x10;//set TXPKTRDY
//*AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP
//////////////////////////////
while(!(*AT91C_UDP_CSR & 0x1));// wait finish send
*AT91C_UDP_CSR &= 0xFFFFFFFE;
Delay(10);
for(i = 0; i < 2; i++)
{
*AT91C_UDP_FDR = *(point++);
}
*AT91C_UDP_CSR |= 0x80; //set DIR
Delay(10);
*AT91C_UDP_CSR |= 0x10; //set TXPKTRDY
while(!(*AT91C_UDP_CSR & 0x1));// wait finish send
*AT91C_UDP_CSR &= 0xFFFFFFFE;
}
извините, код пока в таком виде , красоту не наводил, ибо не арбайтен