Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CY7C680015A
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
spashok2
Помогите пожалуйста вот в каком вопросе.
Суть проблемы: есть 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();


Заранее списибо. Буду благодарен за любые идеи и помощь.
alexkok
Цитата(spashok2 @ Nov 19 2007, 18:05) *
Вопрос почему такая пауза?
Я так понимаю 2-я буферизация сделана для того чтобы пока часть буфера передается, вторая часть - заполняется. При этом размер FIFO 512 байт дожлен передаться (при High Speed 60Mb/s) примерно за 8 мкс. Ну не 100 же мкс! При этом заполнение FIFO - 512 байт - происходит примерно за 30 мкс.

Все очень просто - поскольку длительность микрофрейма 125мкс и только двойная буферизация - то после передачи двух буферов хост видит что готовых к передаче данных больше нет и прекращает опрашивать этот ендпойнт.
После этого следует пауза до начала следующего микрофрейма. Как раз около 100мкс и получается.
spashok2
спасибо за подсказку.
Сегодня у меня возникла примерна та же идея.
Попробую это учесть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.