|
Ввод данных в компьютер., Бинарный поток. |
|
|
|
 |
Ответов
(1 - 54)
|
Jul 24 2012, 13:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(iosifk @ Jul 24 2012, 14:45)  а 2232 в режиме SPI? А там в поток командные слова не придётся вставлять как у FT1248? Цитата(SNR @ Jul 19 2012, 13:15)  Итак есть некое устройство которое на выходе имеет три провода: DATA, CLK ну и естественно GND. Меандр тактирования CLK может идти c максимальной частотой 5,6МГц. Подскажите, чем мне эти данные ввести в комп, чтоб потом записать в бинарный файл. Может есть готовые модули, или собрать - не проблема или хоть подскажите в направлении чего "копать". Загонял через USB 2Мбита. AT91SAM7S64. Двойной буферизации по 16х2КБ хватило. Винда. Главное, если выберете USB - максимальный размер буфера, ибо винда будет считывать когда ей вздумается, особенно на нетбуках и др. мобильных устройствах.
|
|
|
|
|
Jul 27 2012, 10:43
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(SNR @ Jul 19 2012, 13:15)  Здравствуйте! Тема для меня новая , поэтому попрошу особо не пинать. До этого все более с радиочастотными трактами занимался.
Итак есть некое устройство которое на выходе имеет три провода: DATA, CLK ну и естественно GND. Меандр тактирования CLK может идти c максимальной частотой 5,6МГц. Подскажите, чем мне эти данные ввести в комп, чтоб потом записать в бинарный файл. Может есть готовые модули, или собрать - не проблема или хоть подскажите в направлении чего "копать".
Большое спасибо! Если скорости хорошие нужны, можно подцепить к микроконтроллеру ОЗУ, считать сколько нужно в него и по нужному протоколу/интерфейсу, затем спокойно все перегнать в ПК, используя обычный USART/RS232. Любой нормальный терминал поддерживает запись бинарного файла.
--------------------
Magic Friend
|
|
|
|
|
Jul 28 2012, 19:39
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Цитата(iosifk @ Jul 28 2012, 21:09)  Вообще, поскольку зашла речь про ОЗУ и микроконтроллер, то надо рассмотреть и третий вариант. Микроконтроллер с Ethernet... Думал тоже над этим, да вот боюсь что не справлюсь с Ethernet. А какие самые ходовые микроконтроллеры с Ethernet. Может тоже заказать тестовую платку? Спасибо!
|
|
|
|
|
Aug 7 2012, 06:53
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Остановился на CY7C68013A. Подкорректировал для него пришивку (режим Slave Fifo, асинхронный, 16 бит, запись по положительному стробу SLWR, точка одна - EP2, тип обмена - Bulk с пакетами 512 байт). Преобразование из последовательного в паралельный будет на ПЛИС (сейчас сделал просто генератор последовательных чисел которые подаются на 16 битный паралельный вход, для теста.) С помощью стандартной USB Console проверяю - все в порядке, данные идут, байты увеличиваются как и положено (см. рис). Собственно, теперь вопрос за компьютерной программой, которая будет непрерывно считывать и записывать этот поток на компьютер. Тут сложнее так, как программировал очень давно на C++ Builder 6 и то не сложные вещи . Знаю что нужно использовать CyAPI. Может кто поделится примером, или старым исходником, буду очень признателен. С ув. Олег
Сообщение отредактировал SNR - Aug 7 2012, 06:55
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 7 2012, 17:47
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 7 2012, 09:53)  ...Может кто поделится примером, или старым исходником, буду очень признателен... Так ведь, после установки SuiteUSB 3.4.7 в папке " \CyAPI\examples" есть примеры для CyAPI.lib.
|
|
|
|
|
Aug 8 2012, 14:38
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Накрапал примитивную программу в Билдере 6. Читаю и записывваю в файл так: void __fastcall TForm1::Button1Click(TObject *Sender) { LONG len = 512*64; unsigned char* InBuf = new unsigned char[len]; USBDevice->BulkInEndPt->SetXferSize(1000000); USBDevice->BulkInEndPt->TimeOut=1000; while (iStart) { if(USBDevice->BulkInEndPt) USBDevice->BulkInEndPt->XferData(InBuf,len); FileWrite(FileHandle, InBuf, len); Application->ProcessMessages(); } } Выявилась интересная особенность - в начале записи, записавши первые 2047 байт идет какой-то сдвиг и данные изменяются, но потом все нормализуется ( См. рис ). Я так понимаю что это как-то связано с буфером точки EP2. Как устранить этот сдвиг? Мне важно данные получать без этого разрыва в начале. Спасибо!
Сообщение отредактировал SNR - Aug 8 2012, 14:40
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 8 2012, 19:41
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Вам нужно получить определенный объем данных (какой?) и затем обработать данные (записать в файл) или нужно непрерывно получать и обрабатывать данные, как это делает Ваша программа? Цитата(SNR @ Aug 8 2012, 17:38)  if(USBDevice->BulkInEndPt) USBDevice->BulkInEndPt->XferData(InBuf,len); Целесообразнее проверять существует ли указатель на BulkInEndPt в начале функции Button1Click(). Записывать данные в файл нужно только тогда, когда чтение данных через USB было завершено успешно. Вообще же, лучше выполнять цикл while (iStart) в отдельном потоке.
|
|
|
|
|
Aug 8 2012, 21:38
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(SNR @ Aug 7 2012, 12:53)  Остановился на CY7C68013A. а почему не ftdi всё-таки? у FT232H или FT220X есть spi slave. да и вообще можно с максимальной частотой 24..40МГц тупо цифровать состояние всех линий: и данных и клока. вот готовое устройство за 9$ с доставкой (внутри тот же CY7C68013A), а потом в компе уже программно разгребать где там перепад клока и какие в этот момент были данные, не очень красиво, зато дешево и сердито. пара ссылок еще, вдруг поможет: http://sourceforge.net/projects/sigrok/http://sourceforge.net/projects/saleaelogicjj/
|
|
|
|
|
Aug 9 2012, 10:34
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 9 2012, 09:37)  ...А вот <<Записывать данные в файл нужно только тогда, когда чтение данных через USB было завершено успешно. как это реализовать? Раздел " 12.22 XferData( )" файла " CyAPI.pdf" (страница 67): Цитата XferData performs synchronous (i.e. blocking) IO operations. It does not return until the transaction completes or the endpoint's TimeOut has elapsed. Returns true if the transaction successfully completes before TimeOut has elapsed. Note that the len parameter is a reference, meaning that the method can modify its value. The number of bytes actually transferred is passed back in len. То есть, еще нужно анализировать какое количество байт возвращает XferData(): Код while (iStart) { LONG bytes_readed = len; if(USBDevice->BulkInEndPt->XferData(InBuf,bytes_readed)) FileWrite(FileHandle, InBuf, bytes_readed); Application->ProcessMessages(); }
|
|
|
|
|
Aug 10 2012, 10:06
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Сделал в отдельном потоке, считываю по вишеописаному коду. Скорость входных данных 1300 КБайт/сек - проверил прогой Streamer. Пишу в файл тестовые кадры с периодом 8192 бита, потом просматриваю бинарным просмотрщиком. Иногда наблюдаются розрывы потока (См. рис). Как с этим бороться? скорость то потока совсем небольшая и уже разрывы. Увеличивать буферы? сейчас стоит USBDevice->BulkInEndPt->SetXferSize(1000000); USBDevice->BulkInEndPt->TimeOut=1000; Спасибо!
Сообщение отредактировал SNR - Aug 10 2012, 10:40
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 10 2012, 13:11
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 10 2012, 13:06)  ...Иногда наблюдаются розрывы потока (См. рис). Как с этим бороться?...Увеличивать буферы?... Так и должно быть, поскольку Вы используете блокирующее чтение данных через USB. При этом, увеличение размера буфера драйвера свыше числа байт, которое считывается функцией XferData() бесполезно. Можно попытаться назначить потоку отдельный процессор (ядро процессора). Но, правильный подход - использовать не блокирующее чтение (overlapped). Давайте вспомним, что обмен через USB всегда инициируется хост-контроллером ПЭВМ. То есть, устройство USB не сможет передать данные ПЭВМ, пока хост-контроллер не запросит эти данные. Рассмотрим, что происходит при выполнении следующего кода в отдельном потоке, назовем его readUSB_thread: Код while (iStart) { LONG bytes_readed = len;
if(USBDevice->BulkInEndPt->XferData(InBuf,bytes_readed)) FileWrite(FileHandle, InBuf, bytes_readed); } XferData() выдает запрос драйверу CyUsb.sys на чтение len байт. Пока драйвер считывает блок данных через USB разрывов чтения быть не может (не должно  ). Но даже во время чтения блока данных поток readUSB_thread может быть приостановлен (вытеснен другим потоком) на время не менее 10 мс (поправьте меня если я не прав). Если выполнение потока readUSB_thread будет возобновлено до завершения чтения блока данных драйвером, то этот поток вообще не почувствует, что его выполнение прерывалось. После чтения блока данных выполняется запись этих данных на диск. Если время записи данных на диск не превысит времени заполнения FIFO контроллера FX2LP, то потери данных не будет. Но, важно другое. После завершения чтения блока данных через USB может произойти переключение потоков. Остановка потока readUSB_thread даже на 10 мс приведет к переполнению буфера FIFO FX2LP. Вспомним, что для bulk пересылок объем буфера FIFO не превышает 2 Кбайт, то есть для Вашего потока данных FIFO будет переполнено через 1.6 мс. Можно попытаться назначить отдельный процессор для выполнения потока readUSB_thread. Но, Windows может запустить дополнительные потоки и в том процессоре. При использовании не блокирующего чтения можно до выполнения цикла выдать драйверу два запроса на чтение данных. А в самом цикле, после получения очередного блока данных выдавать драйверу следующий запрос. В этом случае уже можно и нужно правильно подобрать размер буфера драйвера (я бы задал 32 Мбайта) и размер блока данных для каждого считывания (по 16 Мбайт). При таких условиях переключение потоков уже не должно приводить к потере данных.
|
|
|
|
|
Aug 13 2012, 15:08
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 12 2012, 23:33)  ...А вот по поводу реализации алгоритма из последнего абзаца... Посмотрите в "CyAPI.pdf" описание и примеры к функциям "12.4 BeginDataXfer()", "12.21 WaitForXfer()", "12.12 FinishDataXfer()". То что Вы делаете, Вы собираетесь использовать "для дома, для семьи" в одном экземпляре или планируете изготавливать для продажи? Если для продажи, то присоединяюсь к совету уважаемого iosifk - Вам нужно использовать Ethernet и TCP/IP. Также, Ваш модуль должен иметь ОЗУ достаточного объема (буферизировать хотя бы 3-4 секунды потока данных). Посмотрите на сайте otladka.com.ua модули SK-STM32F417 и SK-STM32F217.
|
|
|
|
|
Aug 13 2012, 16:54
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Буду разбираться с этими функциями. Нет это хобби, как продолжение темы: http://electronix.ru/forum/index.php?showt...t=0&start=0Купил себе на ебее неисправный спутниковый модем SLM-7650, отремонтировал его и планирую применять для приема спутников ДЗЗ в L- диапазоне.Так вот этот модем имеет последовательный выход данных (DATA и CLK) с максимальной CLK в 20 МГц. Я уже написал на Плис преобразователь из последовательного в параллельный 16 -битный с защелкой данных по положительному фронту сигнала SLWR. Теперь вот дошла очередь до USB и программы для записи. 73!
|
|
|
|
|
Aug 13 2012, 19:56
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 13 2012, 19:54)  ...Нет это хобби... В таком случае можно попытаться использовать USB. А можете выложить принципиальную схему модуля "CY7C68013A + FPGA Altera Max 2 EPM240T100C5" и ссылку на него на eBay? 73!
|
|
|
|
|
Aug 14 2012, 07:29
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Полной схемы на CY7С68013A+EP1C6T144 к сожалению нет. Это я на работе, в старых загашниках нашел эту плату, когда-то кто-то на ней что-то лепил. Та блок схема что выше - я по распиновке восстановил.
Набросал код для приема с использованием Overlap:
//-----------------Поток для записи данных на диск --------------------------
void __fastcall TWriteThread::Execute() {
OVERLAPPED inOvLap; inOvLap.hEvent = CreateEvent(NULL, false, false,"CYUSB_IN");
char inBuf[512]; ZeroMemory(inBuf, 512); ULONG length = 512;
while (!Terminated) //основной цикл чтения данных из USB {
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
// CloseHandle(inOvLap.hEvent);
FileWrite(FileHandle, inBuf, length); //пишем у файл данные
count=count+length; //увеличиваем счетчик принятых байт. }
}
Результат пока тот же, поток рвется, даже на маленькой скорости( подавал на вход СLK и DATA со скоростью 9,8МГц, то есть на выходе 16 -битные данные будут защелкиваться с частотой 9,8/16 = 612,5 кГц).
73!
Сообщение отредактировал SNR - Aug 14 2012, 07:33
|
|
|
|
|
Aug 14 2012, 07:53
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 14 2012, 10:29)  Полной схемы на CY7С68013A+EP1C6T144 к сожалению нет. Это я на работе, в старых загашниках нашел эту плату, когда-то кто-то на ней что-то лепил. Та блок схема что выше - я по распиновке восстановил... То есть, все таки CY7С68013A+EP1C6T144 на одном модуле. Тогда зачем Вам зоопарк из двух модулей? Используйте этот модуль. EP1C6 можно загрузить по JTAG через FX2LP (CY7С68013A). Цитата(SNR @ Aug 14 2012, 10:29)  Набросал код для приема с использованием Overlap:... Выложите исходники программы (проект). Я внесу изменения.
|
|
|
|
|
Aug 15 2012, 05:45
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 14 2012, 11:31)  Вот весь проект: Вчера увлекся переделкой Вашего проекта. В результате программа вообще перестала работать В проекте, который выкладываю, сделаны минимальные изменения. Давайте вначале проверим, есть ли потери данных при приеме. А уже потом будем добиваться восстановления работоспособности при сбоях обмена через USB.
|
|
|
|
|
Aug 15 2012, 19:23
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Дома более пристально изучил принятую структуру и оказалось что куда-то теряются четыре строчки. Т.е. принимаем четыре нормально, потом четыре пропуск, потом опять четыре принимаем и т.д. Длина строки 8192 бита. То есть 4*8192=32768 бит исчезают через раз. 73!
Сообщение отредактировал SNR - Aug 15 2012, 19:24
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 16 2012, 07:47
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 15 2012, 22:23)  Дома более пристально изучил принятую структуру и оказалось что куда-то теряются четыре строчки... В void __fastcall TWriteThread::Execute() перед строками: UCHAR *inContext_1 = USBDevice->BulkInEndPt->BeginDataXfer(inBuf_1, BUFFER_LENGTH, &inOvLap_1); UCHAR *inContext_2 = USBDevice->BulkInEndPt->BeginDataXfer(inBuf_2, BUFFER_LENGTH, &inOvLap_2);добавьте строку: USBDevice->BulkInEndPt->SetXferSize(BUFFER_LENGTH);Иначе, по умолчанию XferSize=4096 байт и принимаемые данные поочередно пишутся в inBuf_1 и inBuf_2 по 4 килобайта.
|
|
|
|
|
Aug 16 2012, 20:20
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 16 2012, 22:06)  Попутно возник вопрос по таймауту в функции WaitForXfer(&inOvLap_1,TIMEOUT) Если я правильно понял, это время в миллисекундах когда драйвер ждет прихода данных из-вне, и если данные не приходят, то ничего не отдает. Да правильно. Цитата(SNR @ Aug 16 2012, 22:06)  ...И чтоб записывать такие низкоскоростные потоки я так понимаю нужно менять и таймаут и размер буфера. Как это корректно подобрать или методом проб? Ну да, вообщем то, методом проб. Цитата(SNR @ Aug 16 2012, 22:06)  И корректно ли я закрываю работу ЮСБ устройтва или еще что-то надо дополнительно? Да, корректно. "Close( ) is called automatically by the ~CCyUSBDevice( ) destructor. It is also called automatically by the Open ( ) method, if a handle to the driver is already open."
|
|
|
|
|
Aug 17 2012, 08:37
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
День добрый! Вчера до поздней ночи тестил - на высоких скоростях проблем нет. А вот попробовал загнать CLK = 200 kHz, то есть данные защелкиваются с частотой 200/16= 12,5kHz , тут работает не совсем корректно. Естественно пока наберется 2 мб для записи , проходит длительное время и не понятно программа пишет или стоит ( т.е. тут надо какую-то придумывать визуальную фичу по которой бы видно было что все ок). Также выяснилось что после нажатия СТОП и закрытия программы она остается "висеть" и с помощью диспетчера не снимается. Только надо передернуть кабель. Повторюсь что это для низких частот.
Ну да ладно, думаю сделаю на форме чекбокс с помощю которого буду менять размер буфера на 10240 (выяснил экспериментально что пишет нормально, без разрывов при низких скоростях), но не получилось, при компиляции пишет что "невозможно изменить константу", менять из чекбокса хотел это: static const ULONG BUFFER_LENGTH = 1048576*2;
Спасибо!
|
|
|
|
|
Aug 17 2012, 09:53
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SNR @ Aug 17 2012, 11:37)  ... при компиляции пишет что "невозможно изменить константу", менять из чекбокса хотел это: static const ULONG BUFFER_LENGTH = 1048576*2; Добавьте в Unit2.cpp переменную, например: static LONG blockLength = BUFFER_LENGTH;и замените BUFFER_LENGTH на blockLength во всех вызовах BeginDataXfer() и SetXferSize(). Константу TIMEOUT преобразуйте в переменную timeout, то есть объявление: static const ULONG TIMEOUT = 20000;замените на: static ULONG timeout = 20000;На форму добавьте два компонента класса TCSpinEdit (вкладка Samples панели компонентов CBuilder) для задания значений blockLength и timeout .
|
|
|
|
|
Aug 17 2012, 19:34
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
Все доделал, теперь работает отлично. Большое спасибо за помощь Konst_777. Я думаю Вы не будете против, если я сюда выкладу все материалы. Может кто-то тоже будет идти этим путем и пригодится. В архиве прошивка для CY7C68013A, драйвер, проект FPGA, и софт для записи на комп. Итак краткое описание: Запись бинарного последовательного потока в файл. FPGA + контроллер СY7C68013A. Основная задача FPGA из последовательного потока сделать параллельный 16-битный и по положительному фронту SLWR записать в CY7C68013A. Далее посредством CY7C68013A вводим в комп и записываем на жесткий диск. 73! С ув. Олег
|
|
|
|
|
Aug 28 2012, 20:58
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171

|
В составе модема все работает отлично. Вот полученные изображения в эти выходные: один с спутника Метоп-А, другой с геостационара Электро-Л1 Олег.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 28 2012, 09:41
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Если не секрет, какую максимальную скорость получили?
|
|
|
|
|
Sep 28 2012, 16:13
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(andrew smirnov @ Sep 28 2012, 12:41)  Если не секрет, какую максимальную скорость получили? Цитата(SNR @ Aug 16 2012, 22:06)  ...Тестировал на домашнем компьютере, на разных скоростях (СLK от 3 до 24.5 МГц)... То есть, для данного применения достаточной была скорость обмена 4 Мбайта в секунду.
|
|
|
|
|
Sep 28 2012, 16:51
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(Konst_777 @ Sep 28 2012, 20:13)  То есть, для данного применения достаточной была скорость обмена 4 Мбайта в секунду. Интересуюсь не из праздного любопытства - стоит задача по вводу сигнала как раз со спутникового модема, но за основу взят отладочный модуль ftdi um232h. Пока темный лес - я скорее программист, чем схемотехник... Не подскажете, какую микросхемку можно использовать для преобразования из последовательного кода в параллельный на 8 бит и формировать управляющий сигнал при заполнении регистра, чтобы передать их в um232h (сдвиговый регистр и делитель частоты, так сказать, в одном флаконе)? Хотелось бы выжать из этой микросхемки максимум...
Сообщение отредактировал andrew smirnov - Sep 28 2012, 16:55
|
|
|
|
|
Sep 29 2012, 07:01
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(_pv @ Sep 29 2012, 01:40)  у ft232h есть режимы последовательного интерфейса. а если скорости до 20-30МГц то можно тупо параллельным интерфесом сэмплить и клоки и данные на максимально частоте а потом программно разбирать. Да нет, хотелось бы получить значение, близкое к теоретическому максимуму для ft232h. Да и программно разбирать клоки и данные - не лучшее занятие. После ввода сигнал еще обрабатывать программно.
|
|
|
|
|
Sep 29 2012, 08:23
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(andrew smirnov @ Sep 29 2012, 14:01)  Да нет, хотелось бы получить значение, близкое к теоретическому максимуму для ft232h. Да и программно разбирать клоки и данные - не лучшее занятие. После ввода сигнал еще обрабатывать программно. а что же это за последовательный интерфейс такой на ~300мбит? если сделать что-то вроде Код #define CLK_BIT 0x01 #define DATA_BIT 0x02
int bitCnt = 0; int b1, b2 = 0; char data[100500]; while(1){ b1 = GetByteFromFT232H(); if ((b1 & (b1 ^ b2)) & CLK_BIT){ if (b1 & DATA_BIT) data[bitCnt>>3] |= (1 << (bitCnt & 0x07)); // (1 << (7 - (bitCnt & 0x07))) если байт вносят ногами вперед. bitCnt++; } b2 = b1; } по сравнению с обработкой данных не сильно много процессорного времени займёт. хотя по скорости в режиме FT1248 или MPSSE быстрее получится. FT1248 вроде как spi slave можно заставить работать до 30МГц. в MPSSE только как мастер. Цитата Не подскажете, какую микросхемку можно использовать для преобразования из последовательного кода в параллельный на 8 бит и формировать управляющий сигнал при заполнении регистра. мелкую cpld
|
|
|
|
|
Sep 29 2012, 10:47
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(_pv @ Sep 29 2012, 12:23)  а что же это за последовательный интерфейс такой на ~300мбит? если сделать что-то вроде Код #define CLK_BIT 0x01 #define DATA_BIT 0x02
int bitCnt = 0; int b1, b2 = 0; char data[100500]; while(1){ b1 = GetByteFromFT232H(); if ((b1 & (b1 ^ b2)) & CLK_BIT){ if (b1 & DATA_BIT) data[bitCnt>>3] |= (1 << (bitCnt & 0x07)); // (1 << (7 - (bitCnt & 0x07))) если байт вносят ногами вперед. bitCnt++; } b2 = b1; } по сравнению с обработкой данных не сильно много процессорного времени займёт. хотя по скорости в режиме FT1248 или MPSSE быстрее получится. FT1248 вроде как spi slave можно заставить работать до 30МГц. в MPSSE только как мастер. мелкую cpldнужно знать частоту следования клоков, как я понял. а это величина не постоянная и заранее не известная. последовательный интерфейс на 300 мбит? есть стандарт спутниковой связи DVB-S2 - там скорость примерно 30МГц*5 (размерность модуляции - АФМ32) - т.е., за вычетом декодера (например 9/10), скорость потока составит порядка 135 МБит/с. Демодулятор выдает в последовательном виде. Перспективный стандарт DVB NS3 обеспечивает скорость передачи до 365 МБит/с. Хотелось бы быть к нему готовым  . Ну, а пока хватит и заявленных 200 МБит/с, если получится. а насчет CPLD - я думал, что простой логики должно хватить? или я не прав? вопрос только в скорострельности...
Сообщение отредактировал andrew smirnov - Sep 29 2012, 10:16
|
|
|
|
|
Sep 29 2012, 17:10
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(andrew smirnov @ Sep 29 2012, 17:47)  нужно знать частоту следования клоков, как я понял. а это величина не постоянная и заранее не известная. нет, ((b1 & (b1 ^ b2)) & CLK_BIT) выделяет положительный фронт и по нему защёлкивает данные. Цитата(andrew smirnov @ Sep 29 2012, 17:47)  Перспективный стандарт DVB NS3 обеспечивает скорость передачи до 365 МБит/с. Хотелось бы быть к нему готовым . Ну, а пока хватит и заявленных 200 МБит/с, если получится. я к тому что это, скорее всего, не cmos 3.3V на таких скоростях. и 365Мбит/с с ft232h пожалуй не получится. Цитата(andrew smirnov @ Sep 29 2012, 17:47)  а насчет CPLD - я думал, что простой логики должно хватить? или я не прав? вопрос только в скорострельности... хватит, только понадобится сдвиговый регистр, счётчик на 8, пара триггеров, может инвертор, даже такую простую логику как правило проще в одном корпусе мелкой cpld иметь. а скорострельности логики какой-нибудь LVC/AUC серии должно хватить.
|
|
|
|
|
Oct 5 2012, 07:44
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Так, просьба не пинать - схемотехника была когда-то давно в институте. Начнем с начала. Есть желание ввести сигнал (за скоростью пока не гонимся, дальше разберемся) от источника в PC через USB. Сигнал представляет собой данные в последовательном виде, непрерывные. Данные идут в сопровождении тактовой. Итого имеем две линии. Сигнал в линии представляет собой последовательность прямоугольных импульсов. Уровень "0" - где-то в районе 0 Вольт, уровень "1" - где-то 5 Вольт (вроде TTL, если я ничего не путаю). Есть отладочный модуль FTDI - FT2232H mini module (есть еще одноканальный вариант - FT232H). Сигнал и тактовая подаются по кабелю длиной до 5 метров (пока реально используем 1,5 метра). На выходе источника сигнала - прямоугольные импульсы. На выходе кабеля - импульсы теряют свою форму, дробятся. Плюс появляется "двойник" сигнала - что-то похожее на сигнал, сдвинутое по времени. Сделан вывод о необходимости согласования нагрузки на выходе линии - включили между сигнальной жилой и землей сопротивление порядка 50 Ом. Сигнал на выходе кабеля стал похож на исходный. Теперь пытаемся подключить это на вход FT2232H в режиме синхронного FIFO по следующей схеме (почти так, как советовали выше): сигнальные жилы такта и данных - на входы данных первого канал (биты 0 и 1 буфера); сигнал записи берем от встроенного генератора на 60 МГц. Землю от входных линий цепляем на землю платы. Плата по питаю в режиме Bus-powered. Ничего не получается. В схемотехнике не силен, поэтому, если кто-то может ткнуть, где почитать или просто подсказать, как подключить - помогите, пожалуйста.
|
|
|
|
|
Oct 5 2012, 09:50
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(andrew smirnov @ Oct 5 2012, 13:44)  Начнем с начала ... Теперь пытаемся подключить это на вход FT2232H в режиме синхронного FIFO по следующей схеме (почти так, как советовали выше): сигнальные жилы такта и данных - на входы данных первого канал (биты 0 и 1 буфера); сигнал записи берем от встроенного генератора на 60 МГц. Ничего не получается. самого главного - тактовую частоту приходящих данных не сказали. ft[2]232 не может в усб непрерывно передать поток 60МБайт/с. посмотрите на сигнал TXE#, он показывает когда у ft внутренний буфер закончился. поделите 60МГц пополам тогда возможно получится, при этом, частота последовательного интерфейса должна быть еще более чем в два раза меньше. либо попробуйте режим FT1248 - это как раз spi slave. до 30МГц. а по хорошему надо взять какой-нибудь быстрый сдвиговый регистр, вроде 74[F/AHC][594/595], и из пары 74ххх74 или еще одного сдвигового регистра и пары лог вентилей сделать счётчик на 8 чтобы он на один такт CLKOUT дергал WR по заполнению сдвигового регистра. ну или мелкую cpld.
|
|
|
|
|
Oct 5 2012, 10:11
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(_pv @ Oct 5 2012, 13:50)  самого главного - тактовую частоту приходящих данных не сказали. ft[2]232 не может в усб непрерывно передать поток 60МБайт/с. посмотрите на сигнал TXE#, он показывает когда у ft внутренний буфер закончился. поделите 60МГц пополам тогда возможно получится, при этом, частота последовательного интерфейса должна быть еще более чем в два раза меньше. либо попробуйте режим FT1248 - это как раз spi slave. до 30МГц. а по хорошему надо взять какой-нибудь быстрый сдвиговый регистр, вроде 74[F/AHC][594/595], и из пары 74ххх74 или еще одного сдвигового регистра и пары лог вентилей сделать счётчик на 8 чтобы он на один такт CLKOUT дергал WR по заполнению сдвигового регистра. ну или мелкую cpld. за микруху спасибо, поищем. вопрос в другом - правильно ли я подключаю (нужно ли еще где-нибудь что-нибудь навесить, емкость, например, сопротивление) с точки зрения схемотехники, чтобы заработало. а то модуль не всегда определяется системой. тактовая частота приходящих данных задается на источнике сигнала (аппаратный имитатор). скорость может быть от 32 кбит/с до 10 мбит/с. есть еще вариант на 40 мбит/с, но пока даже 1 мбит/с не получили. не могу понять, как ее подключать. в даташитах ничего не нашел...
Сообщение отредактировал andrew smirnov - Oct 5 2012, 10:12
|
|
|
|
|
Oct 5 2012, 10:35
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(andrew smirnov @ Oct 5 2012, 16:11)  вопрос в другом - правильно ли я подключаю (нужно ли еще где-нибудь что-нибудь навесить, емкость, например, сопротивление) с точки зрения схемотехники, чтобы заработало. а то модуль не всегда определяется системой. тактовая частота приходящих данных задается на источнике сигнала (аппаратный имитатор). скорость может быть от 32 кбит/с до 10 мбит/с. если это готовый модуль всё что надо там уже есть. а подключаете неправильно, нельзя в синхронном режиме гнать непрерывно поток 60МБайт/с и уж тем более таким образом: Цитата сигнал записи берем от встроенного генератора на 60 МГц для начала попробуйте в асинхронном режиме фифо, клоки последовательно интерфейса на WR, только с нужной полярностью, данные на D0, до 8 МГц должно работать. каждый бит - один байт. зы про режим FT1248 наврал, никакой это не spi slave, ему там команды еще надо в поток данных подмешивать. а режим Fast Serial Interface, хоть и slave и до 50МГц, требует старт/стоповых битов. то есть чесловеческого режима spi slave у ft232h похоже нету.
|
|
|
|
|
Oct 5 2012, 11:56
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(_pv @ Oct 5 2012, 14:35)  ... клоки последовательно интерфейса на WR, только с нужной полярностью ... что Вы имеете ввиду под нужной полярностью?  есть жила и земля (обмотка). Подаю клоки с жилы
|
|
|
|
|
Oct 5 2012, 13:23
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(andrew smirnov @ Oct 5 2012, 17:56)  что Вы имеете ввиду под нужной полярностью?  есть жила и земля (обмотка). Подаю клоки с жилы не электричекую, а в смысле логических уровней. в асинхронном режиме фифо, данные защелкиваются по отрицательному фронту на WR, то есть по переходу 1 -> 0. в Вашем последовательном интерфейсе они скорее всего в этот момент как раз изменяются на линии данных. то есть если не инвертировать клоки данные будут захватываться в момент перехода от одного бита к другому, что не есть хорошо.
|
|
|
|
|
Oct 6 2012, 07:24
|
Группа: Новичок
Сообщений: 8
Регистрация: 28-09-12
Пользователь №: 73 719

|
Цитата(_pv @ Oct 5 2012, 17:23)  не электричекую, а в смысле логических уровней. в асинхронном режиме фифо, данные защелкиваются по отрицательному фронту на WR, то есть по переходу 1 -> 0. в Вашем последовательном интерфейсе они скорее всего в этот момент как раз изменяются на линии данных. то есть если не инвертировать клоки данные будут захватываться в момент перехода от одного бита к другому, что не есть хорошо. а, в этом смысле. да нет, есть возможность инвертировать сигналы тактов и данных. работаем в режиме инверсии тактов. данные - прямые.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|