Помогите пожалуйста вот в каком вопросе.
Суть проблемы: есть USB устройство на основе CY7C680015A (полный аналог CY7C680013A кроме 2 выводов). Оно передает данные в компьютер через КТ 4 типа bulk. Параметры точки: 2-я буферизация, размер FIFO 512 байт, High-Speed. На компьютере стоит операционная система Win XP SP2.
К устройству подключена NAND флешка с которой считываются 2048 байт.
Используется GPIF, типа FIFO RD, т.е. данные читаются в FIFO 4 КТ. FIFO работает в режиме AUTOIN,
т.е. при появлении в нем 512 байт, буфер автоматически отправляется хосту. Так вот при считывании с флешки 1024 байта в контроллере поднимается флаг FIFO FULL, стоит примерно 100 мкс, при этом соотвественно GPIF останвливается, после этого убирается и GPIF дочитывает 1024 байта. подобная картина повторяется при каждом последующем чтении.
Вопрос почему такая пауза?
Я так понимаю 2-я буферизация сделана для того чтобы пока часть буфера передается, вторая часть - заполняется. При этом размер FIFO 512 байт дожлен передаться (при High Speed 60Mb/s) примерно за 8 мкс. Ну не 100 же мкс! При этом заполнение FIFO - 512 байт - происходит примерно за 30 мкс.
При этом в данном месте работает с одной стороны GPIF, а я программа просто ждет его завершения,
а с другой стороны - драйвер нижнего уровня, которому я послала запрос на чтение 2048 байт.
Ни там, ни там нет не выполняется мой код. Кто сталкивался с подобной проблемой, подскажите пожалуйста.
Хочц заметить что данные передается верно. Волнует именно проблема скорости.
ЗАранее привожу фрагменты соотвесвующего кода устройства и драйвера:
устройство:
GPIFTCB1 = 0x08; // Setup GPIF count high
GPIFTCB0 = 0x00; // GPIF low count
GPIFTRIG = 0x04 | cEP4; // Arm EP4
_nop_();
while(!gpifIdle()){;};
дравер(ф-ция чтения):
URB pUrb = m_ep4In.BuildBulkTransfer(
pBuffer, // Where is data coming from?
2048, // How much data to read?
TRUE, // direction (TRUE = IN)
NULL, // Link to next URB
TRUE // Allow a short transfer
);
if (pUrb == NULL)
{
I.Information() = 0;
return STATUS_INSUFFICIENT_RESOURCES;
}
//чтение
status = m_ep4In.SubmitUrb(I, pUrb, NULL, NULL, 0);
// Plug and Play accounting
DecrementOutstandingRequestCount();
Заранее списибо. Буду благодарен за любые идеи и помощь.