Перейти к содержанию
    

CY7C680015A

Помогите пожалуйста вот в каком вопросе.

Суть проблемы: есть 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();

 

 

Заранее списибо. Буду благодарен за любые идеи и помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос почему такая пауза?

Я так понимаю 2-я буферизация сделана для того чтобы пока часть буфера передается, вторая часть - заполняется. При этом размер FIFO 512 байт дожлен передаться (при High Speed 60Mb/s) примерно за 8 мкс. Ну не 100 же мкс! При этом заполнение FIFO - 512 байт - происходит примерно за 30 мкс.

Все очень просто - поскольку длительность микрофрейма 125мкс и только двойная буферизация - то после передачи двух буферов хост видит что готовых к передаче данных больше нет и прекращает опрашивать этот ендпойнт.

После этого следует пауза до начала следующего микрофрейма. Как раз около 100мкс и получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за подсказку.

Сегодня у меня возникла примерна та же идея.

Попробую это учесть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...