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

Потоковое считывание flash через USB

Добрый день.

Столкнулся с проблемой, возможно кто сталкивался с подобным.

При считывании Flash(k9k8g) через USB(FT245) теряется информация частями(кратными 256 байт).

На компьютере с USB 3.0 или новыми драйверами FTDI скорость считывания выше 1 000 000 байт в секунду и проблем с потерей информации нет.

На более старых ПК, где стоят драйвера для FTDI какой нить старой версии(например 2.4.16), информация теряется.

Причем на некоторых компьютерах это всего 5 массивов по 256 или 512 байт, а на некоторых отсутствует вплоть до 20% информации

 

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


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

А как Вы флешку к FT245 подключили? Возможно в этом и кроется проблема. И какая именно FT245? Они с разными суффиксами вроде бывают.

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


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

Флешка и FTDI еще подключены к контроллеру. Который подает команды на вывод информации и проверяет флаги готовности Flash и FTDI.

Т.е. судя по даташиту FTDI у нее размер буфера как раз 256 байт. Думаю я как раз теряю периодически ее буфер.

Но в программе я постоянно отслеживаю флаг TXE, который отвечает за переполнение буфера и его передачу по USB к ПК.

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


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

Флешка и FTDI еще подключены к контроллеру. Который подает команды на вывод информации и проверяет флаги готовности Flash и FTDI.

Очевидно, что следует искать баг именно в Вашем ПО на контроллере. Интерфейс у FT245 примитивный.

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


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

Флешка и FTDI еще подключены к контроллеру. Который подает команды на вывод информации и проверяет флаги готовности Flash и FTDI.

Т.е. судя по даташиту FTDI у нее размер буфера как раз 256 байт. Думаю я как раз теряю периодически ее буфер.

Но в программе я постоянно отслеживаю флаг TXE, который отвечает за переполнение буфера и его передачу по USB к ПК.

А каким софтом и как Вы определяете наличие факта передачи с FT245 на PC ?

Проверьте, возможно потеря и не в FT245 а в верхнем уровне.

 

 

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


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

Сейчас провёл ряд тестов с FT245RL. Тестировал передачу с устройства (evalboard, работа с FT245 через GPIO) на PC с VCP-дровами.

Все тесты проходят нормально только если в потоке нет байтов == 0. Передавал блоки рандомных данных размером до 32МБ, на стороне PC проверял CRC - всё ок.

Если же в потоке есть нулевые байты, то начинается странное: на PC принимается больше данных, чем было отправлено :wacko:

На 32000000 переданных байт появляется 40-50 байт лишних.

Для теста использовал стороннее ПО на PC - возможно это оно глючит. По уму надо написать свою утилиту приёма на PC, чтобы точно протестить. Вряд-ли это проблема FT245, но всё-же... Если исключить нули из потока, то однозначно всё работает прекрасно.

Скорость передачи блока 32МБ получилась = ~883660 Б/сек.

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


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

. . . .

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

. . . .

может собака порылась на участке "заливки" данных в FT245 - задержки стробов относительно установки данных итп.

"Нулевой эффект" - выход при 0x00 за допустимый предел.

 

Ну я бы еще кабель проверил - как владелец второго "проездного" :)

 

 

 

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


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

может собака порылась на участке "заливки" данных в FT245 - задержки стробов относительно установки данных итп.

Т.е. - Вы считаете, что при передаче 01 или 02 и т.п. нет задержки, а при передаче 00 - есть???

Ниже привожу передающий код. Покажите где здесь порылась задержка:

void FtTx(void const *src, int len)
{
 u8 const *s = (u8 const *)src;
 PoutM(PORT(PIN_FT245_D0), 255 << PIN(PIN_FT245_D0)); //переключение пинов D0...D7 на вывод
 for (; --len >= 0; ) {
   int c = *s++;
   PsetM(PORT(PIN_FT245_D0), c << PIN(PIN_FT245_D0));           //установка единиц на линиях D0...D7
   PclrM(PORT(PIN_FT245_D0), (c ^ 255) << PIN(PIN_FT245_D0)); //установка нулей на линиях D0...D7
   while (Pdat(PIN_FT245_TXE));  //ждём 0 на PIN_FT245_TXE
   Pset(PIN_FT245_WR);
   FtDelayNs(25);          //задержка, нс
   Pclr(PIN_FT245_WR);
   FtDelayNs(26);
 }
}

//макрос PORT() возвращает 1-ю компоненту номера пина (порт пина);
//макрос PIN() возвращает 2-ю компоненту номера пина (разряд пина);
#define PIN_FT245_WR    3, 22
#define PIN_FT245_TXE   4, 24
#define PIN_FT245_RD    1, 2
#define PIN_FT245_RXF   4, 31
#define PIN_FT245_D0    1, 20
#define PIN_FT245_D1    1, 21
#define PIN_FT245_D2    1, 22
#define PIN_FT245_D3    1, 23
#define PIN_FT245_D4    1, 24
#define PIN_FT245_D5    1, 25
#define PIN_FT245_D6    1, 26
#define PIN_FT245_D7    1, 27

 

Ну я бы еще кабель проверил - как владелец второго "проездного" :)

Какой кабель? USB? Если в кадре есть нули, то такие кадры как-то по другому передаются по этому кабелю??? :wacko:

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


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

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

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

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

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

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

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

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

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

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