spashok2 0 19 ноября, 2007 Опубликовано 19 ноября, 2007 · Жалоба Помогите пожалуйста вот в каком вопросе. Суть проблемы: есть 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 0 20 ноября, 2007 Опубликовано 20 ноября, 2007 · Жалоба Вопрос почему такая пауза? Я так понимаю 2-я буферизация сделана для того чтобы пока часть буфера передается, вторая часть - заполняется. При этом размер FIFO 512 байт дожлен передаться (при High Speed 60Mb/s) примерно за 8 мкс. Ну не 100 же мкс! При этом заполнение FIFO - 512 байт - происходит примерно за 30 мкс. Все очень просто - поскольку длительность микрофрейма 125мкс и только двойная буферизация - то после передачи двух буферов хост видит что готовых к передаче данных больше нет и прекращает опрашивать этот ендпойнт. После этого следует пауза до начала следующего микрофрейма. Как раз около 100мкс и получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spashok2 0 20 ноября, 2007 Опубликовано 20 ноября, 2007 · Жалоба спасибо за подсказку. Сегодня у меня возникла примерна та же идея. Попробую это учесть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться