Jump to content

    
Sign in to follow this  
SancheSZ

прием данных из АЦП в ПК по USB

Recommended Posts

Konst_777, опишу проект подробнее.

...

Т.е. обмен оносторонний (АЦП->компьютер), темп обмена задается ПЛИСом.

У меня похожий проект (только передаются 8-разрядные данные АЦП, пачками по 512 байт). Я пробовал два варианта: Slave FIFO (применялась микросхема CY7C680001) и GPIF (это уже на CY7C680013A). Для режима Slave FIFO задал длительность импульса SLWR равной 80 нсек с периодом 160 нсек. При этом получается, что передача 256 16-разрядных слов занимает около 41 мксек. Предельная скорость в районе 12 МБайт/сек. Для меня в общем-то приемлемо, но запаса по скорости не остается. А это плохо.

 

Поэтому я остановился на режиме GPIF. Дело в том, что в этом режиме можно получить заметно бОльшую скорость передачи данных. Мы обсуждали вопрос предельного быстродействия передачи данных с помощью этой микросхемы в Винде вот в этом топике (см. скриншоты постов #49 и #50). Можно достичь предельной скорости порядка 40+ МБайт/сек.

 

На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск.

Только нужно тщательно организовать прием данных. Во-первых, по всей видимости однозначно следует принимать данные в отдельном потоке (IMHO, тут вообще без вариантов). Во-вторых, для сброса данных на диск следует вдумчиво организовать буферирование принятых данных (возможно, следует сделать два/четыре здоровых буфера в несколько сотен килобайт, или даже порядка мегабайтов).

 

Вот собственно вопрос в том как все это организовать: какие и сколько сигналов нужно подать на FX2, какой режим применять и тд...

Для режима Slave FIFO нужно использовать SLWR, адрес (номер) FIFO и, наверное, этого достаточно. Для режима GPIF в общем-то все то же самое, только используются линии CTLx. Например я использую CTL0 в качестве сигнала RD#, а CTL1 в качестве OE#. Для квитирования (проверки готовности) можно использовать линии RDYx. Но я поступил проще: применил линию порта ввода микросхемы CY7C680013A, которая опрашивает готовность и программно запускает очередной цикл считывания блока данных. Передача одного блока (512 байт) ПЛИС->CY7C680013A занимает что-то порядка 8.5 мксек (я выбрал частоту интерфейса 30 MHz, т.к. мне этого достаточно за глаза. Но можно и 48 MHz, тогда скорость пропорционально возрастет). В моем проекте блоки следуют один за другим с периодом от ~35 до ~300 мксек. Если у тебя данные идут непрерывным потоком, то, наверное, следует все же применить линию RDYx. Но в любом случае получить скорость 10-15 МБайт/сек можно лёгко.

Share this post


Link to post
Share on other sites
Если все же об аппаратном, то как все таки оно организовано, да еще и с сохранением таких скоростей??? (двухпортовая ОЗУ в разрыв между АЦп и cypress???)

Между АЦП и FX2LP как правило ставят FPGA. Подключите к FPGA динамическую память и получите FIFO такого объема, какого захотите. Мало? Подключите к FPGA жесткий диск. И все это будет FIFO. То есть, способ организации данных по типу Первый зашел, Первый вышел.

 

Konst_777, опишу проект подробнее...

Похоже, что jur уже ответил на Ваши вопросы.

Share this post


Link to post
Share on other sites

Вот, нашел то, что надо. :)

 

http://lea.hamradio.si/~s57uuu/uuusb/simplead.png

 

Человек подключает два 8-разрядных АЦП.

Подробнее: http://lea.hamradio.si/~s57uuu/uuusb/index.htm

 

Использует Slave FIFO в асинхронном варианте (только SLWR).

 

Там внизу есть раздел Software и соответствующая ссылка, по которой описывается програмная сторона вопроса - правда под Linux.

 

 

Насколько я понимаю программирование контроллера сводится к задаию значений некоторых регистров?

 

И еще: как я понял код загружается в RAM контроллера по USB, после чего девайс перезагружается. Вот собственно каким образом код загружается? Это должна делать моя программа? Нужен ли в таком случае EEPROM?

Share this post


Link to post
Share on other sites
Вот, нашел то, что надо. :)

Ой, боюсь то, что не надо :( . Вряд ли Вы получите работающий модуль.

 

Человек подключает два 8-разрядных АЦП.

Это его проблемы.

 

Использует Slave FIFO в асинхронном варианте (только SLWR).

И, соответственно, скорость обмена до 15 Мбайт/сек, а Вам нужно 20 Мбайт/сек.

 

Насколько я понимаю программирование контроллера сводится к задаию значений некоторых регистров?

Но datasheet и EZ-USB® Technical Reference Manual все равно прочитать нужно.

 

И еще: как я понял код загружается в RAM контроллера по USB, после чего девайс перезагружается. Вот собственно каким образом код загружается? Это должна делать моя программа? Нужен ли в таком случае EEPROM?

Если Вы будете подключать к компьютеру одновременно только одно устройство с VID=04B4 и PID=8613 ("Cypress EZ-USB FX2LP - EEPROM missing"), то можно не устанавливать EEPROM на плату. Драйвер CyUSB.sys может загружать скипт, содержащий программу для FX2LP из файла на диске. Эта возможность описана в документе "CyUSB.chm" раздел "Modifying CyUSB.INF" подраздел "4. Execute a saved script of commands at driver load time".

Но, все равно, на Вашем модуле должна быть EEPROM, правильно подключенная к контроллеру FX2LP (Э3 и PCB должны содержать EEPROM). Иначе Вы рискуете оказаться перед необходимостью повторной разработки модуля.

Share this post


Link to post
Share on other sites
И, соответственно, скорость обмена до 15 Мбайт/сек, а Вам нужно 20 Мбайт/сек.

 

Это понятно. Возможно мне и этой скорости хватит, а простота реализации подкупает :).

 

На самом деле буду очень благодарен, если расскажете, что таке GPIF, с чем его едят, чем он лучше и почему быстрее...

 

Знаю, что есть GPIF Designer, даже запускал его, но в чем суть не понял. Можно ли соорудить такой простой протокол, как в той ссылке, что я давал в предыдущем посте? Т.е. чтоб по некому сигналу (там он назван clk) в FIFO загружались новые 16 бит данных? Но чтобы работало быстрее, чем в том примере.

 

Если Вы будете подключать к компьютеру одновременно только одно устройство с VID=04B4 и PID=8613 ("Cypress EZ-USB FX2LP - EEPROM missing"), то можно не устанавливать EEPROM на плату.

 

Но, все равно, на Вашем модуле должна быть EEPROM, правильно подключенная к контроллеру FX2LP (Э3 и PCB должны содержать EEPROM). Иначе Вы рискуете оказаться перед необходимостью повторной разработки модуля.

 

Эти 2 высказываия немного протеворечат друг другу. Да, я осознаю, что без EEPROM я не смогуподключить 2 таких контроллера одновременно. Но в принципе, работать будет, если просто поставить вместо EEPROM подтягивающие резисторы? Т.е. кроме идентификации устройтва стандартными кодами и необходимости грузить прошивку с компа других ограничений не будет?

 

 

Еще такой вопрос... Есть у меня платка тут одна со 128-pin cy7c86013 распаянным. Хотел с ней поигратся (типа завести с помощью сайпресовской панели прмер bulkloop). Тык вот, устройство (EEPROM missing - там резисторы вместо него) нормально подключается к компу, ставлю драйвер cyUSB, панель его видит. Загружаю пример bulkloop.hex в конроллер, вроде загружается (ну там видно как много текста бежит). Но после загрузки нажимаю GetPipeInfo - ничего не выводит... С чем может быть это связано? У меня есть схема этой платы, но выложить ее не могу. Много пинов контроллера заведены на ПЛИС, конфигурация в которой затерта неизвестно чем (и чего там должно быть у меня нету). Может ли прична быть в ПЛИС, т.е. какие критичные для контроллера пины нужно проверить?

Share this post


Link to post
Share on other sites
На самом деле буду очень благодарен, если расскажете, что таке GPIF, с чем его едят, чем он лучше и почему быстрее...

 

Знаю, что есть GPIF Designer, даже запускал его, но в чем суть не понял. Можно ли соорудить такой простой протокол, как в той ссылке, что я давал в предыдущем посте? Т.е. чтоб по некому сигналу (там он назван clk) в FIFO загружались новые 16 бит данных? Но чтобы работало быстрее, чем в том примере.

Выберите АЦП и рассмотрим на конкретном примере. Вот только, на этой неделе у меня не будет времени. Но может быть еще кто-нибудь даст ответы на Ваши вопросы и критические замечания на мои ответы. :)

 

Эти 2 высказываия немного протеворечат друг другу. Да, я осознаю, что без EEPROM я не смогуподключить 2 таких контроллера одновременно. Но в принципе, работать будет, если просто поставить вместо EEPROM подтягивающие резисторы? Т.е. кроме идентификации устройтва стандартными кодами и необходимости грузить прошивку с компа других ограничений не будет?

Работать будет, других ограничений не будет.

 

Еще такой вопрос... Есть у меня платка тут одна со 128-pin cy7c86013 распаянным. Хотел с ней поигратся (типа завести с помощью сайпресовской панели прмер bulkloop). Тык вот, устройство (EEPROM missing - там резисторы вместо него) нормально подключается к компу, ставлю драйвер cyUSB, панель его видит. Загружаю пример bulkloop.hex в конроллер, вроде загружается (ну там видно как много текста бежит). Но после загрузки нажимаю GetPipeInfo - ничего не выводит... С чем может быть это связано? У меня есть схема этой платы, но выложить ее не могу. Много пинов контроллера заведены на ПЛИС, конфигурация в которой затерта неизвестно чем (и чего там должно быть у меня нету). Может ли прична быть в ПЛИС, т.е. какие критичные для контроллера пины нужно проверить?

Попробуйте этот пример. Он предназначен именно для FX2 (cy7c68013). Если заработает, сравните тексты исходников.

bulkloop_FX2.rar

Share this post


Link to post
Share on other sites
Konst_777, опишу проект подробнее.

 

Значится так. Все затевается для считывания данных с ПЗС матрицы. Матрица будет тактироваться ПЛИСиной (т.е. ПЛИС будет вырабатывать тактовые импульсы вертикального и горизонтального сдвига в ПЗС). С выхода ПЗС аналоговый сигнал идет на абстрактный 10-битный АЦП. Дык вот, хотелось бы завести эти 10 бит на FX2 и подать на FX2 еще какой-нибудь сигнал с ПЛИС, который бы говорил о готовности данных, т.е. давался синхронно с изменением данных на выходе ПЗС (и АЦП соответственно).

 

Т.е. обмен оносторонний (АЦП->компьютер), темп обмена задается ПЛИСом.

 

На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск.

 

Вот собственно вопрос в том как все это организовать: какие и сколько сигналов нужно подать на FX2, какой режим применять и тд...

 

 

если входной сигнал высокой частоты нельзя ли спектр сигнала перенести в область низких частот а потом преобразовать АЦП

Share this post


Link to post
Share on other sites
Выберите АЦП и рассмотрим на конкретном примере. Вот только, на этой неделе у меня не будет времени. Но может быть еще кто-нибудь даст ответы на Ваши вопросы и критические замечания на мои ответы. :)

 

Ну если не сложно, давайте рассмотрим подключение к CY7C68013A-56PVXC АЦП AD9203.

 

Попробуйте этот пример. Он предназначен именно для FX2 (cy7c68013). Если заработает, сравните тексты исходников.

 

Спасибо! Пример нормально завелся. Буду копать исходики.

Share this post


Link to post
Share on other sites
На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск.

 

У меня такой вопрос: каким образом c компьютера можно проверять заполнены ли IN буферы в микросхеме CY7C68013?

Share this post


Link to post
Share on other sites

Решил сделать так: в буфер EP6 записываю статус FIFOFULL для буфера EP8 и обновляю этот статус после каждого прочтения буфера EP6. Через буфер EP8 передаю сами данные.

 

Не знаю есть ли другой способ. Наверное, можно использовать биты STALL.

Share this post


Link to post
Share on other sites
У меня такой вопрос: каким образом c компьютера можно проверять заполнены ли IN буферы в микросхеме CY7C68013?

А зачем оно Вам надо??? Сделайте съем данных с FX2 в отдельном потоке и крутите в цикле, таймаут выберите соответствующий Вашему потоку данных...

Share this post


Link to post
Share on other sites
А зачем оно Вам надо??? Сделайте съем данных с FX2 в отдельном потоке и крутите в цикле, таймаут выберите соответствующий Вашему потоку данных...

 

Спасибо за ответ. Я не знал, что так можно сделать.

Хотя, похоже, буду делать, как описал, т.к. данные на выходе устройства могут вообще не появиться.

Share this post


Link to post
Share on other sites
Спасибо за ответ. Я не знал, что так можно сделать.

Хотя, похоже, буду делать, как описал, т.к. данные на выходе устройства могут вообще не появиться.

Не делайте этого, ибо - глупость :) Сделайте лучше так, как я предложил. XferData блокирующая функция, она будет ожидать события: или прием указанного количества данных или таймаут, вот и поставьте её в цикле в отдельном потоке! Не надо выдумывать велосипед ;)

Share this post


Link to post
Share on other sites
Не делайте этого, ибо - глупость :) Сделайте лучше так, как я предложил. XferData блокирующая функция, она будет ожидать события: или прием указанного количества данных или таймаут, вот и поставьте её в цикле в отдельном потоке! Не надо выдумывать велосипед ;)

У меня еще такой вопрос. Смогу ли я отсылать с компьютера новые данные, если другой поток в это время пытается получать данные с этого же устройства (устройство данные выдать не может, т.к. их еще нет)?

 

Вроде, сам уже нашел ответ: маленький таймаут надо задать

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this