Jump to content

    
Sign in to follow this  
SancheSZ

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

Recommended Posts

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

 

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

Из другого потока - без проблем :) Каждый эндпоинт в устройстве живет своей жизнью ;)

Share this post


Link to post
Share on other sites
...

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

...

 

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

CY7C68013A в 56 выводном корпусе не имеет последовательных портов, которые являются штатным средством отладки от Cypress. Как Вы будете отлаживать firmware?

 

"Archive.rar" содержит исполняемые файлы. После распаковки проверьте, что папка "Archive" не содержит вирусы.

Из папки "Archive\GPIF Designer_demo" запустите "GPIF Designer_demo.htm". Надеюсь, что эта демонстрация частично ответит на Ваши вопросы.

Папка "\Archive\Firmware" содержит исходники для firmware. Папка "\Archive\Software" содержит исходники для тестовой программы (*.exe в "\Archive\Software\Debug"). В папке "\Archive\Driver\SuiteUSB.NET 2.0" есть "CyUSB.inf", который потребуется при установке драйвера, после загрузки firmware.

Archive.rar

Share this post


Link to post
Share on other sites
У нас используются подобные системы на основе CY7C68013A и внешней FIFO. Скорость приема данных составляет более 40 Мбайт/с - это с доработанным драйвером, с родным будет где-то в районе ~20.

Так что никаких проблем в этом нет.

 

Здраствуйте! Можете поделится каким образом Вы дорабатывали драйвер и в каком режиме CY7C68013A работает(bulk, изохрон, ...)?

 

Помогите выбрать микроконтроллер для следующей задачи:

 

необходимо по сигналу готовности данных принимать принимать данные из 8-10 разрядного АЦП с частотой порядка 10 Мегавыборок в секунду и без какой-либо обработки отправлять их в комп по USB, где приложение будет тупо этот поток сбрасывать на диск. Таким образом необходимая скорость передачи данных 10-15 МБ\сек.

 

Сам приматриваюсь к Cypress FX2.

 

Возможно ли на нем реализовать подобный обмен?

 

http://www.kernelchip.ru/WoodmanUSB.php

 

http://www.ftdichip.com/

Share this post


Link to post
Share on other sites
Здраствуйте! Можете поделится каким образом Вы дорабатывали драйвер и в каком режиме CY7C68013A работает(bulk, изохрон, ...)?

 

Повторюсь - не я дорабатывал драйвер и точных данных по нему у меня нет. Кое-что я уже написал в предыдущих постах.

Share this post


Link to post
Share on other sites
Из папки "Archive\GPIF Designer_demo" запустите "GPIF Designer_demo.htm". Надеюсь, что эта демонстрация частично ответит на Ваши вопросы.

 

Konst_777, огромное спасибо за презентацию, пример прошивки и приложения для компа!

Спаял тут свою тестовую платку, все это удалось запустить. Без примера было бы очень сложно начинать с 0.

 

Сейчас для тестовых целей ацп тактирую обственным генератором на 4,194 МГц, на вход просто посадил резистивный делитель с переменным резистором, модифицировал Ваш пример для ПК и по таймеру читаю по 512 байт (меньше - виснет) и вывожу на экран значения из АЦП.

 

Это так, тоб убедиться что ацп работает и контроллер действительно читает данные с него.

 

GPIF примеры с IFCLK и CTL0 поэтому функционируют абсолютно одинаково.

 

Однако в моей задаче (считывание данных с ПЗС матрицы) ситуация такова, что данные необходимо считывать не через равные промежутки времени (т.е. разные паузы между пикселями в строке, между строками между кадрами). АЦП как я понимаю требуется татовый сигнал со скважностью 50%.

 

Поэтому задумка такая: тактировать АЦП допустим 20 МГц всегда, а на контроллер на RDY0 подавать сигнал со схемы управления (которая также будет вырабатывать пачку сигналов управления для матрицы и тактовую АЦП). Т.е. требуется чтобы данные с АЦП передавались в ЮСБ только при активном RDY0.

 

Можно ли разрулить такое с помощью GPIF? Я вот пробовал модифицировать опять же Ваш пример с IFCLK (в принципе мне ни IFCLK ни CTL0 не нужен). Акивировал там линию RDY0, в Desigion Point поставил условие не IntReady = 1, а RDY0. Экспортировал в С файл, перекомпилил. Запутил прогу с таймером. Соединял проводком, RDY0 с землей и с питанием. Ожидал, что поток данных заткнется. Но этого не произошло. О безисходности пробовал переносить диаграмму из FIFORead в SingleRead (кстати чем они отличаются :) ), но так данные не идут вообще (видимо надо менят код прошивки).

 

Буду благодарен за любую помощь. Просто пока нет полного понимания приципов GPIF.

 

 

Еще вопрос: что за файл UsbIF.cpp (класс CUsbIF). Понятно, что он содержит функции для общения с FX2. Cypress же дает библиотеку CyUSB.lib. Это и есть данная библиотека в виде исходника или может быть Ваша собственая разработка? Просто гуг по данному имени файла (и Н файла тоже) дал крайне мало результатов.

Edited by SancheSZ

Share this post


Link to post
Share on other sites
...Поэтому задумка такая: тактировать АЦП допустим 20 МГц всегда, а на контроллер на RDY0 подавать сигнал со схемы управления (которая также будет вырабатывать пачку сигналов управления для матрицы и тактовую АЦП). Т.е. требуется чтобы данные с АЦП передавались в ЮСБ только при активном RDY0.

 

Можно ли разрулить такое с помощью GPIF?...

Для такого включения RDY0 является асинхронным по отношению к IFCLK. FX2LP будет реагировать на RDY0 с задержкой в два такта IFCLK (Примечание 21 на странице 41 "fx2lp_datasheet.pdf"). Если 20 МГц - это частота пикселов то, даже для IFCLK=48 МГц нельзя использовать GPIF в асинхронном режиме без дополнительной буферизации строк ПЗС матрицы. Ну и, мне до сих пор не удалось даже в синхронном режиме GPIF достичь скорости обмена более 31 МБайта в секунду с драйвером cyusb.sys.

 

По-моему, я слишком увлек Вас своим высказыванием:

... А с помощью GPIF можно организовать обмен с, практически, любым АЦП и без дополнительных устройств.

Наверное, нужно вернутся к режиму Synchronous Slave FIFO.

 

 

...Я вот пробовал модифицировать опять же Ваш пример с IFCLK (в принципе мне ни IFCLK ни CTL0 не нужен). Акивировал там линию RDY0, в Desigion Point поставил условие не IntReady = 1, а RDY0. Экспортировал в С файл, перекомпилил. Запутил прогу с таймером. Соединял проводком, RDY0 с землей и с питанием. Ожидал, что поток данных заткнется. Но этого не произошло...

Выложите Ваш файл *.gpf для GPIF Designer-а. Может быть Вы используете безусловный переход вместо условного?

 

... пробовал переносить диаграмму из FIFORead в SingleRead (кстати чем они отличаются :) )...

FX2LP способен хранить одновременно 4 временных диаграммы. Считается, что две из них будут использоваться для чтения/записи одного байта/слова (Single-Read/Single-Write), а еще две - для чтения/записи массива байтов/слов (FIFO-Read/FIFO-Write). Реально, можно использовать любую временную диаграмму для любого варианта обмена или даже все четыре временных диаграммы для какого-либо одного варианта обмена. Регистр GPIFWFSELECT служит для выбора одной из четырех временных диаграмм для требуемого варианта обмена. В GPIF Designer-е значение регистра GPIFWFSELECT задается с помощью меню Tools->Map Waweforms to WFSELECT.

 

Еще вопрос: что за файл UsbIF.cpp (класс CUsbIF).

Класс CUsbIF был написан, чтобы общаться с драйвером cyusb.sys через интерфейс DeviceIoControl(). Какое-то время я должен был продолжать разработку в IDE Dev-C++. Там не было возможности воспользоваться CyAPI.lib.

Share this post


Link to post
Share on other sites

Есть задача: необходимо непрерывно пересылать данные с АЦП AD9235BRU/BCP-20Msps на компьютер через интерфейс USB, какое-либо управление переферией отсутствует. Главная задача контроллера -максимально быстро передать данные без подтверждения. Просмотрел форум и нашел впринципе подходящий МК CY7c68013, но есть вопрос: Сможет ли он передавать данные с необходимой скоростью и какой при этом необходим буфер между АЦП и МК, возможно ли это реализовать со стандартной прошивкой? Желательно иметь минимальный обвес.

Зарание спасибо.

Share this post


Link to post
Share on other sites
Есть задача: необходимо непрерывно пересылать данные с АЦП AD9235BRU/BCP-20Msps на компьютер через интерфейс USB, какое-либо управление переферией отсутствует. Главная задача контроллера -максимально быстро передать данные без подтверждения. Просмотрел форум и нашел впринципе подходящий МК CY7c68013, но есть вопрос: Сможет ли он передавать данные с необходимой скоростью и какой при этом необходим буфер между АЦП и МК, возможно ли это реализовать со стандартной прошивкой? Желательно иметь минимальный обвес.

Зарание спасибо.

12 бит АЦП на 20Msps - это 30 Мбайт/сек., при условии, что между АЦП и контроллером будет упаковщик четырех выборок АЦП в три 16-разрядных слова. Возможно использовать только передачу массивов данных (Bulk Transfers). Контроллер сможет передавать данные с такой скоростью. ПЭВМ может принимать данные с такой скоростью. Успеет ли операционная система - вот в чем вопрос. Размер буфера как раз и будет зависеть от способности ОС принимать (и обрабатывать?) непрерывный поток информации. При использовании ДОС и несложной обработке данных буфер может быть и не нужен. При использовании Windows потери данных можно избежать при бесконечном объеме буфера. :)

 

Утром мир кажется не таким мрачным :)

Думаю, что буфера объемом 64 Мбайт будет достаточно. Конечно, если не будет сбоев обмена через USB и не придется восстанавливать обмен.

Edited by Konst_777

Share this post


Link to post
Share on other sites

Спасибо, это действительно очень полезная информация! Маленькое уточнение: речь идет о каком-то конкретном упаковщике, рекомендованом Cypress, или я могу выбрать любой подходящий?

Edited by AutoSerg

Share this post


Link to post
Share on other sites

Подниму тему...

 

Тут играюсь с асинхронным Slave Fifo (AUTOIN, на SLWR генератор 4 МГц) - столкнулся с интересным эффектом.

 

При чтении в хост с EP6 или EP8 все читается нормально (пакеты по 512 байт). Читаю в Borland C++ Builder с помощью BulkInEndPoint->XferData по 512 байт.

 

При использовании EP4 почему-то за один вызов читается только 2 байта (параметр len после вызова = 2), причем похоже на мусор (причем эти 2 байта повторяются помойму через раз от вызова к вызову). Аналогичный результат при чтении просто консолью Cypress.

 

С EP2 - вообще весело: в первый раз читается 512 байт, потом 2 байта, потом еще раз 2, потом уже 512 и далее нормально - как-то так.

 

Вот инициализация МК:

 

void TD_Init(void)             // Called once at startup
{
REVCTL = 0x03; // must set REVCTL.0 and REVCTL.1 to 1
SYNCDELAY;

EP2CFG = 0xE0;   // Valid, IN, BULK, 512 byte, quad buf
SYNCDELAY;
EP4CFG = 0xE0;   // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)
SYNCDELAY;
EP6CFG = 0xE2;  // Valid, IN, BULK, 512 byte, double buf
SYNCDELAY;
EP8CFG = 0xE0;  // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)
SYNCDELAY;

IFCONFIG = 0xCB;
SYNCDELAY;

EP2FIFOCFG = 0x09;   // AUTOIN, 16 bit
SYNCDELAY;
EP4FIFOCFG = 0x09;   // AUTOIN, 16 bit
SYNCDELAY;
EP6FIFOCFG = 0x09;   // AUTOIN, 16 bit
SYNCDELAY;
EP8FIFOCFG = 0x09;   // AUTOIN, 16 bit
SYNCDELAY;

FIFORESET = 0x80;
SYNCDELAY;
FIFORESET = 0x02;
SYNCDELAY;
FIFORESET = 0x04;
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x08;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
}

 

 

В коде видно, что в EPxCFG пишу разные значения - хочу поиграться с буферированием (для EP4, EP8 значения по дефолту, т.к. в них это не настраивается).

 

Однако EP8 работает правильно, EP4 - нет, хотя настроены абсолютно одинаково...

 

Номер EP меняю в dscr.a51 (меняется в одной строчке) и перемычками на плате.

PKTEND пробовал и к земле, и к питанию привязывать...

 

P.S.: вопрос в догонку. Как добавить ендпоинтов в dscr.a51? Пробовал просто скопировать секцию для bulk EP ниже, изменить номер EP и увеличить счетчик ендпоинтов на 1. Но после ренумерации контроллер не определяется EZ Control Panel...

 

 

----------- далее автоматически скленный следующий пост ------------

 

Все, кажется разобрался...

 

Наверное я нарушил правила выбора конфигурации ендпоинтов из даташита.

Там одну из 12 выбрать можно, а моя конфигурация требовала 10*512 байт fifo памяти, хотя на чипе доступоно только 8*512 :)

 

Возник правда новый вопрос. Допустим сконфигурировал я EP2 на 1024 байта, quad-buffered путем записи в EP2CFG (имею на это право по документации). Но это использует всю память, и EP4, 6, 8 я использовать не могу. Собственно как отказаться от других EP? Достаточно ли просто не писать их в dscr.a51? Просто в других EPxCFG поидее прописаны дефолтные значения... - не приведет ли это к тому, что память и под них будет выделяться? Не надо ли что-то еще делать, напрмер бит VALID = 0?

 

P.S.: рано радовался. Переписал инициализацию так:

 

EP2CFG = 0xE0; // Valid, IN, BULK, 512 byte, quad buf

SYNCDELAY;

EP6CFG = 0xE2; // Valid, IN, BULK, 512 byte, double buf

SYNCDELAY;

EP8CFG = 0xE0; // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)

SYNCDELAY;

 

т.е. убрал EP4. Теперь EP2 с EP4 не должны конфликтовать. В даташите такой конфиг есть. Все равно EP2 глючит как и раньше - читает по 2 байта. Если сделать EP2 double-buffered, то не глючит...

Видимо это подтверждает еще раз мое предположение, что неиспользуемые ендпоинты (EP4) надо как-то отключать... (или дело вообще не в этом). Пробовал у EP4 ставить флаг VALID=0 и пробовал Type писать 00 (invalid) вместо дефолтного Bulk. Не помогло...

 

 

И остается все-таки вторая часть предыдущего вопроса - как добавлять ендпоинты в dscr.h (или что-то еще надо редактировать?)

Edited by SancheSZ

Share this post


Link to post
Share on other sites

Все-таки решил отказаться от Slave FIFO в пользу GPIF и внешнего FIFO на FPGA.

 

Соответственно АЦП складывает данные во внешнее FIFO.

Требуется реализовать посредством GPIF чтение из FIFO и отправку в USB.

 

FIFO имеет флаг EMPTY, чтение из FIFO происходит по положительному фронту сигнала CLK1. Запись в FIFO (это задача не FX2) - по положительному фронту сигнала CLK2.

 

От FX2 требуется непрерывно читать данные из FIFO в USB при отсутствии флага EMPTY. При наличии EMPTY - ждать, пока он пропадет и опять читать. Т.е. как я понимаю нужно нарисовать временную диаграмму FIFO Read в GPIF Designer и при старте FX2 ее запустить.

 

В качестве IFCLK видимо в данном случае целесообразно использовать внутренний IFCLK 48 MHz, для сигнала CLK1 на FIFO - например линию CTL0, для контроля флага EMPTY - например линию RDY0.

 

Просьба знающим людям поправить меня, если я где-то ошибаюсь, и помочь в создании временной диаграммы, реализуюбщей такую задачу, т.к. сам я пока не очень понимаю логику работы GPIF...

Share this post


Link to post
Share on other sites
Есть задача: необходимо непрерывно пересылать данные с АЦП AD9235BRU/BCP-20Msps на компьютер через интерфейс USB, какое-либо управление переферией отсутствует. Главная задача контроллера -максимально быстро передать данные без подтверждения. Просмотрел форум и нашел впринципе подходящий МК CY7c68013, но есть вопрос: Сможет ли он передавать данные с необходимой скоростью и какой при этом необходим буфер между АЦП и МК, возможно ли это реализовать со стандартной прошивкой? Желательно иметь минимальный обвес.

Зарание спасибо.

 

Задача похожая.

Предполагаю работать в режиме SlaveFifo c AutoIN по какому-то EndPoint.

 

Вопрос:

Возможно ли запихивать в FIFO (установив соответствующий адрес) сигнал с частотой повторения порядка 1kHz .

Сигнал SLWR формирую 120ns в "0".

Share this post


Link to post
Share on other sites
Сигнал SLWR формирую 120ns в "0".

То есть, похоже, что собираетесь использовать Asynchronous Slave FIFO Writes.

Возможно ли запихивать в FIFO (установив соответствующий адрес) сигнал с частотой повторения порядка 1kHz .

Без проблем и в асинхронном и в синхронном режиме.

Share this post


Link to post
Share on other sites
То есть, похоже, что собираетесь использовать Asynchronous Slave FIFO Writes.

 

Без проблем и в асинхронном и в синхронном режиме.

 

Да, пока собираюсь Asynchronous Slave FIFO, т.к. скорость пока до 1МГц.

Как я понял, для синхронного частота IFCLK не менее 5 МГц.

Далее предстоит передавать с частотой 10МГц.

В асинхронном более 7-8 МГц не потянет.

А в синхронном потянет? Пока не хочу использовать GPIF.

 

Хочу использовать две кон.точки - одна для приема данных из АЦП с автом.формирования пакета,

а другая в обратную сторону.

 

Никогда не работал с микроконтроллерами :rolleyes:

С файлом PERIPH.C более или менее понятно.

Непонятно пока настройка дискрипторов в DSCR.A51, они ведь должны соответствовать инициализации в PERIPH.C.

Может кто полезную ссылку выложит?

Share this post


Link to post
Share on other sites
Далее предстоит передавать с частотой 10МГц.

В асинхронном более 7-8 МГц не потянет.

А в синхронном потянет? Пока не хочу использовать GPIF.

Потянет. Вообще, режим Synchronous Slave FIFO способен обеспечить более быстрый обмен по USB, по сравнению с Synchronous GPIF.

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