реклама на сайте
подробности

 
 
> CY7C680015A, Передача данных (непонятная проблема)
spashok2
сообщение Nov 19 2007, 15:05
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 7-02-05
Пользователь №: 2 475



Помогите пожалуйста вот в каком вопросе.
Суть проблемы: есть 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();


Заранее списибо. Буду благодарен за любые идеи и помощь.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01339 секунд с 7
ELECTRONIX ©2004-2016