|
|
  |
прием данных из АЦП в ПК по USB |
|
|
|
Mar 14 2008, 07:45
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(SancheSZ @ Mar 12 2008, 22:02)  Konst_777, опишу проект подробнее. ... Т.е. обмен оносторонний (АЦП->компьютер), темп обмена задается ПЛИСом. У меня похожий проект (только передаются 8-разрядные данные АЦП, пачками по 512 байт). Я пробовал два варианта: Slave FIFO (применялась микросхема CY7C680001) и GPIF (это уже на CY7C680013A). Для режима Slave FIFO задал длительность импульса SLWR равной 80 нсек с периодом 160 нсек. При этом получается, что передача 256 16-разрядных слов занимает около 41 мксек. Предельная скорость в районе 12 МБайт/сек. Для меня в общем-то приемлемо, но запаса по скорости не остается. А это плохо. Поэтому я остановился на режиме GPIF. Дело в том, что в этом режиме можно получить заметно бОльшую скорость передачи данных. Мы обсуждали вопрос предельного быстродействия передачи данных с помощью этой микросхемы в Винде вот в этом топике (см. скриншоты постов #49 и #50). Можно достичь предельной скорости порядка 40+ МБайт/сек. Цитата(SancheSZ @ Mar 12 2008, 22:02)  На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск. Только нужно тщательно организовать прием данных. Во-первых, по всей видимости однозначно следует принимать данные в отдельном потоке (IMHO, тут вообще без вариантов). Во-вторых, для сброса данных на диск следует вдумчиво организовать буферирование принятых данных (возможно, следует сделать два/четыре здоровых буфера в несколько сотен килобайт, или даже порядка мегабайтов). Цитата(SancheSZ @ Mar 12 2008, 22:02)  Вот собственно вопрос в том как все это организовать: какие и сколько сигналов нужно подать на 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 МБайт/сек можно лёгко.
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Mar 14 2008, 19:10
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(AndreyS @ Mar 12 2008, 23:43)  Если все же об аппаратном, то как все таки оно организовано, да еще и с сохранением таких скоростей??? (двухпортовая ОЗУ в разрыв между АЦп и cypress???) Между АЦП и FX2LP как правило ставят FPGA. Подключите к FPGA динамическую память и получите FIFO такого объема, какого захотите. Мало? Подключите к FPGA жесткий диск. И все это будет FIFO. То есть, способ организации данных по типу Первый зашел, Первый вышел. Цитата(SancheSZ @ Mar 13 2008, 00:02)  Konst_777, опишу проект подробнее... Похоже, что jur уже ответил на Ваши вопросы.
|
|
|
|
|
Mar 14 2008, 19:52
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 27-02-08
Пользователь №: 35 422

|
Вот, нашел то, что надо. 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?
|
|
|
|
|
Mar 15 2008, 06:42
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SancheSZ @ Mar 14 2008, 23:52)  Вот, нашел то, что надо.  Ой, боюсь то, что не надо  . Вряд ли Вы получите работающий модуль. Цитата(SancheSZ @ Mar 14 2008, 23:52)  Человек подключает два 8-разрядных АЦП. Это его проблемы. Цитата(SancheSZ @ Mar 14 2008, 23:52)  Использует Slave FIFO в асинхронном варианте (только SLWR). И, соответственно, скорость обмена до 15 Мбайт/сек, а Вам нужно 20 Мбайт/сек. Цитата(SancheSZ @ Mar 14 2008, 23:52)  Насколько я понимаю программирование контроллера сводится к задаию значений некоторых регистров? Но datasheet и EZ-USB® Technical Reference Manual все равно прочитать нужно. Цитата(SancheSZ @ Mar 14 2008, 23:52)  И еще: как я понял код загружается в 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). Иначе Вы рискуете оказаться перед необходимостью повторной разработки модуля.
|
|
|
|
|
Mar 15 2008, 07:19
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 27-02-08
Пользователь №: 35 422

|
Цитата(Konst_777 @ Mar 15 2008, 09:42)  И, соответственно, скорость обмена до 15 Мбайт/сек, а Вам нужно 20 Мбайт/сек. Это понятно. Возможно мне и этой скорости хватит, а простота реализации подкупает  . На самом деле буду очень благодарен, если расскажете, что таке GPIF, с чем его едят, чем он лучше и почему быстрее... Знаю, что есть GPIF Designer, даже запускал его, но в чем суть не понял. Можно ли соорудить такой простой протокол, как в той ссылке, что я давал в предыдущем посте? Т.е. чтоб по некому сигналу (там он назван clk) в FIFO загружались новые 16 бит данных? Но чтобы работало быстрее, чем в том примере. Цитата(Konst_777 @ Mar 15 2008, 09:42)  Если Вы будете подключать к компьютеру одновременно только одно устройство с 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 - ничего не выводит... С чем может быть это связано? У меня есть схема этой платы, но выложить ее не могу. Много пинов контроллера заведены на ПЛИС, конфигурация в которой затерта неизвестно чем (и чего там должно быть у меня нету). Может ли прична быть в ПЛИС, т.е. какие критичные для контроллера пины нужно проверить?
|
|
|
|
|
Mar 17 2008, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(SancheSZ @ Mar 15 2008, 11:19)  На самом деле буду очень благодарен, если расскажете, что таке GPIF, с чем его едят, чем он лучше и почему быстрее...
Знаю, что есть GPIF Designer, даже запускал его, но в чем суть не понял. Можно ли соорудить такой простой протокол, как в той ссылке, что я давал в предыдущем посте? Т.е. чтоб по некому сигналу (там он назван clk) в FIFO загружались новые 16 бит данных? Но чтобы работало быстрее, чем в том примере. Выберите АЦП и рассмотрим на конкретном примере. Вот только, на этой неделе у меня не будет времени. Но может быть еще кто-нибудь даст ответы на Ваши вопросы и критические замечания на мои ответы. Цитата(SancheSZ @ Mar 15 2008, 11:19)  Эти 2 высказываия немного протеворечат друг другу. Да, я осознаю, что без EEPROM я не смогуподключить 2 таких контроллера одновременно. Но в принципе, работать будет, если просто поставить вместо EEPROM подтягивающие резисторы? Т.е. кроме идентификации устройтва стандартными кодами и необходимости грузить прошивку с компа других ограничений не будет? Работать будет, других ограничений не будет. Цитата(SancheSZ @ Mar 15 2008, 11:19)  Еще такой вопрос... Есть у меня платка тут одна со 128-pin cy7c86013 распаянным. Хотел с ней поигратся (типа завести с помощью сайпресовской панели прмер bulkloop). Тык вот, устройство (EEPROM missing - там резисторы вместо него) нормально подключается к компу, ставлю драйвер cyUSB, панель его видит. Загружаю пример bulkloop.hex в конроллер, вроде загружается (ну там видно как много текста бежит). Но после загрузки нажимаю GetPipeInfo - ничего не выводит... С чем может быть это связано? У меня есть схема этой платы, но выложить ее не могу. Много пинов контроллера заведены на ПЛИС, конфигурация в которой затерта неизвестно чем (и чего там должно быть у меня нету). Может ли прична быть в ПЛИС, т.е. какие критичные для контроллера пины нужно проверить? Попробуйте этот пример. Он предназначен именно для FX2 ( cy7c68013). Если заработает, сравните тексты исходников.
|
|
|
|
|
Mar 19 2008, 07:31
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 8-01-08
Пользователь №: 33 893

|
Цитата(SancheSZ @ Mar 12 2008, 23:02)  Konst_777, опишу проект подробнее.
Значится так. Все затевается для считывания данных с ПЗС матрицы. Матрица будет тактироваться ПЛИСиной (т.е. ПЛИС будет вырабатывать тактовые импульсы вертикального и горизонтального сдвига в ПЗС). С выхода ПЗС аналоговый сигнал идет на абстрактный 10-битный АЦП. Дык вот, хотелось бы завести эти 10 бит на FX2 и подать на FX2 еще какой-нибудь сигнал с ПЛИС, который бы говорил о готовности данных, т.е. давался синхронно с изменением данных на выходе ПЗС (и АЦП соответственно).
Т.е. обмен оносторонний (АЦП->компьютер), темп обмена задается ПЛИСом.
На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск.
Вот собственно вопрос в том как все это организовать: какие и сколько сигналов нужно подать на FX2, какой режим применять и тд... если входной сигнал высокой частоты нельзя ли спектр сигнала перенести в область низких частот а потом преобразовать АЦП
|
|
|
|
|
Apr 15 2008, 06:30
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 27-02-08
Пользователь №: 35 422

|
Цитата(Konst_777 @ Mar 17 2008, 22:58)  Выберите АЦП и рассмотрим на конкретном примере. Вот только, на этой неделе у меня не будет времени. Но может быть еще кто-нибудь даст ответы на Ваши вопросы и критические замечания на мои ответы.  Ну если не сложно, давайте рассмотрим подключение к CY7C68013A-56PVXC АЦП AD9203. Цитата(Konst_777 @ Mar 17 2008, 22:58)  Попробуйте этот пример. Он предназначен именно для FX2 (cy7c68013). Если заработает, сравните тексты исходников. Спасибо! Пример нормально завелся. Буду копать исходики.
|
|
|
|
|
Apr 16 2008, 05:35
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Цитата(SancheSZ @ Mar 12 2008, 23:02)  На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск. У меня такой вопрос: каким образом c компьютера можно проверять заполнены ли IN буферы в микросхеме CY7C68013?
|
|
|
|
|
Apr 17 2008, 09:20
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Цитата(-Al- @ Apr 17 2008, 11:58)  А зачем оно Вам надо??? Сделайте съем данных с FX2 в отдельном потоке и крутите в цикле, таймаут выберите соответствующий Вашему потоку данных... Спасибо за ответ. Я не знал, что так можно сделать. Хотя, похоже, буду делать, как описал, т.к. данные на выходе устройства могут вообще не появиться.
|
|
|
|
|
Apr 17 2008, 10:53
|

Местный
  
Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894

|
Цитата(-=HermiT=- @ Apr 17 2008, 13:20)  Спасибо за ответ. Я не знал, что так можно сделать. Хотя, похоже, буду делать, как описал, т.к. данные на выходе устройства могут вообще не появиться. Не делайте этого, ибо - глупость  Сделайте лучше так, как я предложил. XferData блокирующая функция, она будет ожидать события: или прием указанного количества данных или таймаут, вот и поставьте её в цикле в отдельном потоке! Не надо выдумывать велосипед ;)
|
|
|
|
|
Apr 18 2008, 08:06
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Цитата(-Al- @ Apr 17 2008, 13:53)  Не делайте этого, ибо - глупость  Сделайте лучше так, как я предложил. XferData блокирующая функция, она будет ожидать события: или прием указанного количества данных или таймаут, вот и поставьте её в цикле в отдельном потоке! Не надо выдумывать велосипед ;) У меня еще такой вопрос. Смогу ли я отсылать с компьютера новые данные, если другой поток в это время пытается получать данные с этого же устройства (устройство данные выдать не может, т.к. их еще нет)? Вроде, сам уже нашел ответ: маленький таймаут надо задать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|