Utyff 0 24 января, 2014 Опубликовано 24 января, 2014 · Жалоба Я переделал стандартный пример VirtualComport_Loopback на работу с USB double buffer. Но скорость передачи не изменилась ~550 кб/сек. Нормального примера на Endpoint_IN Double buffer я не смог найти. Кто имел опыт с double buffer, подскажите что не так делаю? Изменил три файла. В usb_conf.h добавил один буфер и сдвинул остальные ///// usb_conf.h //#define ENDP1_TXADDR (0xC0) #define ENDP1_BUF0ADDR (0xC0) #define ENDP1_BUF1ADDR (0x100) #define ENDP2_TXADDR (0x140) #define ENDP3_RXADDR (0x150) В usb_prop.c заменил инициализацию EP1 ///// usb_prop.c /* Initialize Endpoint 1 SetEPType(ENDP1, EP_BULK); SetEPTxAddr(ENDP1, ENDP1_TXADDR); SetEPTxStatus(ENDP1, EP_TX_NAK); SetEPRxStatus(ENDP1, EP_RX_DIS);*/ /* Initialize Endpoint 1 (TX) (IN) (EP1_IN)*/ SetEPType(ENDP1, EP_BULK); SetEPDoubleBuff(ENDP1); SetEPDblBuffAddr(ENDP1, ENDP1_BUF0ADDR, ENDP1_BUF1ADDR); SetEPDblBuffCount(ENDP1, EP_DBUF_IN, Device_Property.MaxPacketSize); // 0x40 ClearDTOG_TX(ENDP1); // USB PERIPHERAL ClearDTOG_RX(ENDP1); // SW_BUF for APPLICATION ToggleDTOG_RX(ENDP1); // NOT TX ie SW_BUF SetEPTxStatus(ENDP1, EP_TX_NAK); SetEPRxStatus(ENDP1, EP_RX_DIS); // NOT TX DISABLE В hw_config.c переписал CDC_Send_DATA. ////// hw_config.c /*uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length) { //if max buffer is Not reached if(Send_length <= VIRTUAL_COM_PORT_DATA_SIZE) { packet_sent = 0; //Sent flag // send packet to PMA UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length); SetEPTxCount(ENDP1, Send_length); SetEPTxValid(ENDP1); } else { return 0; } return 1; } */ uint32_t CDC_Send_DATA(uint8_t* ptrBuffer, uint8_t Send_length) { if(Send_length > VIRTUAL_COM_PORT_DATA_SIZE) return 0; if (GetENDPOINT(ENDP1) & EP_DTOG_RX) // NOT TX ie SW_BUF { UserToPMABufferCopy(ptrBuffer, ENDP1_BUF0ADDR, Send_length); SetEPDblBuf0Count(ENDP1, EP_DBUF_IN, Send_length); } else { UserToPMABufferCopy(ptrBuffer, ENDP1_BUF1ADDR, Send_length); SetEPDblBuf1Count(ENDP1, EP_DBUF_IN, Send_length); } FreeUserBuffer(ENDP1, EP_DBUF_IN); // Toggles EP_DTOG_RX / SW_BUF SetEPTxValid(ENDP1); packet_sent = 0; return 1; } В main.c заменил главный цикл что бы он постоянно отправлял данные #define BUF_SIZE 64 uint8_t Send_Buf[BUF_SIZE], j=0, i; for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++; while (1) { if (bDeviceState == CONFIGURED) { if ( packet_sent == 1 ) { CDC_Send_DATA( (unsigned char*)Send_Buf, BUF_SIZE ); for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++; } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба Я переделал стандартный пример VirtualComport_Loopback на работу с USB double buffer. Но скорость передачи не изменилась ~550 кб/сек. Нормального примера на Endpoint_IN Double buffer я не смог найти. Кто имел опыт с double buffer, подскажите что не так делаю? Позволю себе включить телепатические способности :-) Очевидно автор хотел поднять скорость обмена? На сколько я помню классс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду. Если умножить 64К на 8 то получиться около 550 кб/сек. И количество буферов не поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Utyff 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба На сколько я помню класс устройств CDC имеет ограничение на скорость передачи 64КБ в секунду. Если умножить 64К на 8 то получиться около 550 кб/сек. И количество буферов не поможет. По моему ты что-то путаешь. FT232 стабильно тянет больше 2 мбит/сек (256 кбайт/с) У меня скорость 580 кбайт/сек или 4,6 мбит/сек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться