Всем привет, есть вопрос, не могу победить.
Хочу сделать захват аналоговых данных, очень высокоскоростной.
из ADC[DSP] в -> FTDI -> PC
Использую FT2232H: FIFO Sync 245 mode, полная скорость не работает.
Из обещанных даташитов 40МБайт/с, только куски на скорости 8МБайт/с.
А точнее:
Есть DSP TMS320F28027, на ней я реализовал АЦП который выдает данные в цикле для FTDI FT2232H.
И как мне кажется тут у меня нет вопросов. За исключением того, нужно ли строго отвечать сигналом WR или я могу его его постоянно держать как 0. На практике не видит ни какой разницы...
Суть глюка описываю ниже.
То есть на стороне DSP, проводится вся инициализация, согласно временной диаграмме в даташите (page 27)
тоже описано в "FTDI App Note 130".
Назначаю пины, и жду когда TXE==0. Как только он 0 то выставляю WR=0 и начинаю по циклу измерять встроенным на стороне DSP АЦП и выставлять данные на 8 битный "параллельный порт".
На сколько я понял с документации, а точнее обратное там не написано нигде. То как я понял, до тех пор пока от меня исходит WR=0, FTDI забирает данные. Но она также может в любой момент поднять свой TXE в 1. Я это наблюдаю на осциллографе, что она когда ей вздумается, без всякой детерминированности прерывает на какое то время TXE в 1, и потом опять в 0.
Вот тут начинается второй интересный момент, а точнее второй вопрос.
вот так примерно выглядит форма TXE
---_--_--_--_--_-------------_----_-_------_---------------------------_--_--_------_--_---------
вот тут все что лог."1" это по сути пропуск в измеряемом аналоговом стриме. то есть - бордак полный.
как я понимаю то TXE должен быть либо постоянно 0, на протяжении запрошенного количества байт на считывание
----__________________________________________________________________------
либо вот такой.
----____-____-____-____-____-____-____-____-____-____-____-____-____-____-------
Как я понимаю, это уже все вопросы должны быть к программе что на стороне PC.
На стороне PC я частично базировался на коде, http://dangerousprototypes.com/forum/viewt...f=19&t=1495. А точнее, инициализацию сделал точно как у них и скопипастил их функции по приему данных в цикле с сохранением в файл.
Пробовал переделать, аллочить отдельно память и писать в неё и по завершению всей процедуры писать на HDD. Разницы вообще не заметил. Глюк все также проявляется.
Если верить той дискуссии, они забирают данные достаточно близко к скорости 40МБайт/с (естественно если верить написанному).
И код я уже жаде ихний подставлял, думая что проблема в моем коде. Всё тоже самое.
Особенность, захват данных в начале идёт без пропусков, и потом начинаются данные пропускаться.
Выглядит как будто FTDI сперва данные помещала в пустой буффр полного размера, и потом только в его 1/4 часть. Если отслеживать в программе сигнал, то визуально это так.
Проверяю просто
Подаю на АЦП синус и смотрю его потом в программе на компе. Он с вырезанными кусками от пропусков.
Потом делаю подобие ЛЧМ и тоже самое проверяю. Вижу ту же самую картину с пропусками.
Подскажите - как мне это победить, хочу чтоб данные отдавались ровно и детерминировано.
Тоесть, чтоб я запросил к примеру 50МБайт и их все забрал, а не не-детерминированными кусочками.