Цитата(Shaienn @ Oct 18 2010, 09:31)

PS не рано ли за USB?
А что еще остается делать? На моей плате только один usb-порт есть и всё.
Так. Используя стандартный Атмеловский пример "USB CDC serial converter" добился того, чтобы при подключении через USB устройство определялось как подключенное к COM-порту. Выдавать данные в гипертерминал получается с помощью готовенькой функции CDCDSerialDriver_Write. Считывать введенные данные получается с помощью готовенькой функции CDCDSerialDriver_Read. Но. Проблема в том, что единожды считав введенную информацию в буфер (например если ввести в гипертерминале символ "q"), буфер остается заполненным и новые символы туда не лезут, а функция CDCDSerialDriver_Write (которая выводит введенную информацию) постоянно выдает символ "q". Я так понимаю после CDCDSerialDriver_Write нужно как-то отчистить буфер. А вот как это сделать я не понимаю.
Вот код функции считывания в буфер:
Код
char USBD_Read( unsigned char bEndpoint,
void *pData,
unsigned int dLength,
TransferCallback fCallback,
void *pArgument )
{
Endpoint *pEndpoint = &(endpoints[bEndpoint]);
Transfer *pTransfer = &(pEndpoint->transfer);
// Return if the endpoint is not in IDLE state
if (pEndpoint->state != UDP_ENDPOINT_IDLE) {
return USBD_STATUS_LOCKED;
}
TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength);
//TRACE_ERROR_WP("Read%d(%d) ", bEndpoint, dLength);
// Endpoint enters Receiving state
pEndpoint->state = UDP_ENDPOINT_RECEIVING;
// Set the transfer descriptor
pTransfer->pData = pData;
pTransfer->remaining = dLength;
pTransfer->buffered = 0;
pTransfer->transferred = 0;
pTransfer->fCallback = fCallback;
pTransfer->pArgument = pArgument;
#ifdef DMA
// Test if endpoint type control
if (AT91C_OTGHS_EPT_TYPE_CTL_EPT == (AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint])) {
#endif
// Control endpoint
// Enable endpoint IT
AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<<SHIFT_INTERUPT<<bEndpoint);
AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_RXOUT;
#ifdef DMA
}
else {
TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength);
// Others endpoints (not control)
if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) {
// Transfer the max
pTransfer->buffered = DMA_MAX_FIFO_SIZE;
}
else {
// Transfer the good size
pTransfer->buffered = pTransfer->remaining;
}
AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMAADDRESS = (unsigned int)(pTransfer->pData);
// Clear unwanted interrupts
AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMASTATUS;
// Enable DMA endpoint interrupt
AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<<SHIFT_DMA<<bEndpoint);
TRACE_DEBUG_WP("\n\r_RR:%d ", pTransfer->remaining );
TRACE_DEBUG_WP("B:%d ", pTransfer->buffered );
TRACE_DEBUG_WP("T:%d ", pTransfer->transferred );
// DMA config
AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = 0; // raz
AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL =
(((pTransfer->buffered<<16)&AT91C_OTGHS_BUFF_LENGTH)
| AT91C_OTGHS_END_TR_EN
| AT91C_OTGHS_END_TR_IT
| AT91C_OTGHS_END_B_EN
| AT91C_OTGHS_END_BUFFIT
| AT91C_OTGHS_CHANN_ENB);
}
#endif
return USBD_STATUS_SUCCESS;
}
Одно слово: нипонятна. Может кто-нибудь сталкивался с таким примером?