Делая один проект смастерил утилитку, которая показывала скорость передачи данных по интерфесу USB. Допилил немного ее и получилась программулина, которую и выкладываю на свет. Мож кому и пригодится.
Интерфес простой. Нужно ввести в соответсвующие поля VID и PID, таймауты приема и передачи и сколько байт необходимо передавать в одной транзакции.
Принцип работы простой.
1. Ищем устройство.
2. Находим.
3. Открываем PIPE00.
4. Пытаемся открыть PIPE01. Если не открывается, то используем PIPE00 и для чтения и для записи. Если открылся, то считаем PIPE00 - канал чтения из устройства, канал PIPE01 - запись в устройство.
5. По команде оператора создаем поток с бесконечным циклом записи-чтения оговоренного количества байт.
6. В каждом прогоне счетчик принятых байт увеличивается. Ну и с интервалом 500 мс происходит вычисление средней скорости передачи данных по каналу.
Таким образом можно работать с практически любым USB устройством имеющим две конечные точки для передачи данных.
Сам тестировал только на AT91SAM7S64 с Windows драйвером usbser.sys
При установлении пакета данных в 10000 байт скорость получилась около 475.000 CPS (char per second)
В тестируемом МК соответственно должна быть написана программа, которая принимает-отправляет данные.
У меня она выглядит так:
CODE
/* Transmit/Receive buffers */
#define BUF_SIZE 1024
static volatile UINT8 g_Buf[BUF_SIZE];
/*
main procedure
*/
int main(void)
{
INT i, cnt = 0;
BOARD_Init(); /* Init device */
DBG_OUT("main: init OK!\r\n");
/* Main loop */
while(1)
{
if(cnt > 0)
{
i = USB_Write(g_Buf, cnt);
cnt -= i;
}
else
cnt = USB_Read(g_Buf, BUF_SIZE);
}
}
#define BUF_SIZE 1024
static volatile UINT8 g_Buf[BUF_SIZE];
/*
main procedure
*/
int main(void)
{
INT i, cnt = 0;
BOARD_Init(); /* Init device */
DBG_OUT("main: init OK!\r\n");
/* Main loop */
while(1)
{
if(cnt > 0)
{
i = USB_Write(g_Buf, cnt);
cnt -= i;
}
else
cnt = USB_Read(g_Buf, BUF_SIZE);
}
}