Jump to content

    

SancheSZ

Участник
  • Content Count

    25
  • Joined

  • Last visited

Community Reputation

0 Обычный

About SancheSZ

  • Rank
    Участник
  1. Все-таки решил отказаться от 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...
  2. Подниму тему... Тут играюсь с асинхронным 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 (или что-то еще надо редактировать?)
  3. Цитата(Konst_777 @ Apr 28 2008, 11:51) Из папки "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. Это и есть данная библиотека в виде исходника или может быть Ваша собственая разработка? Просто гуг по данному имени файла (и Н файла тоже) дал крайне мало результатов.
  4. USB

    Спасибо, вроде бы проблема снята.... Reserved был подключен изначально (забыл написать). Решил зашунтировать электролит по питанию несолькими керамическими кондюками по 0,1 мкф (пвесил в нескольких частях платы, но с учетом моего паучка все они далеко от чипа). Не помогло. Тогда повесил еще один кондюк непосредствеено к дорожкам побиже к чипу на AVCC и AGND. После этого стал определяться как High Speed. Самое забавное, что когда повесил этот кондюк, обнаружил, что AGND на землю я не припаял . В итоге так оно и работает Невероятно - но факт. (конечно припаю позже). На данный момент по крайней мере нормально все определяется в винде. Посмотрим, что будет, когда начну подключать к нему АЦП...
  5. USB

    Здравствуйте! Распаял тут cy7c68013a-56pvxc с минмумом необходимого обвеса: резисторы н VCC вместо EEPROM, кварц с двумя конденсаторами по 20pF, WAKEUP - резистор к VCC, RESET - RC цепь, VCC и AVCC - +3.3V, GND и AGND - земля. Все остальное в воздухе. Питание берется с USB и понижается до 3.3 посредством LM2937 (10 мкф электролит на выходе). Тестером мерил - в норме. Девайс подключается и определяется всегда с первого раза, работает пример bulkloop. Но подключается всегда на FULL SPEED (сразу и после перподключения после загрузки bulkloop). Так показавает USBView, а при подключении (и после загрузки примера) винда орет, что устройство может работать быстрее. Пробовал на разных компах, менял кабель. Пробовал подавать питаие от внешнего БП. Сразу скажу: плата в принципе ужасная (не соответствует требоаниям cypress - представляет из себя просто расходящиеся паучком дорожки (~5 см). Пробовал подпаивать USB кабель (обрезал разъем с одной стороны) непосредствеено кдорожкам D+, D- в непосредствеенной близости от ножек чипа и подключать к компу через него (вместо установленного на плте разъема), тем амым изключив 5-сантиметровые отрезки дорожек на плате. Не помогло. Что можно предпринять еще, кроме передеки PCB? Занятие это требуюее некоторого времени и дорогостоящее. Была взята имеющаяся в наличии плата под данный шаг. P.S.: на FULL speed подсоединяется устойчиво и без споев.
  6. Цитата(Ковылин_Константин @ May 18 2008, 20:10) Если интересно - распишу процессы подробно. Не откажусь. ) А на что его мотать можно? Что можете посовеовать из покупных трансформаторов?
  7. Значится так: при выдергиании аудиошнура из компа (или колонки) шум пркращается. Но помеха походу идет не по земле аудиошнура, а по самому сигнальному проводу. Такой вывод сделал изходя из того, что если на штекере аудиошнура заклеить скотчем земляной контакт (таким образом оставив лишь силовую землю), ничего не меняется, т.е. помха остается. То что я действительно разорвал цепь путем заклеивания проверил так: с заклеенным контактом при отключении силовой земли колонок от БП светодиод на них гаснет, без заклеивания - не гаснет.
  8. Возникло вот такое желание. Задолбал занимающий много места адаптер в пилоте. Сразу скажу, колонки дермовенькие, за качеством не гонюсь. Пробовал тупо подать 12 В (именно столько им нужно) от Molex разъема БП компа. Результат - работает, но хорошослышны помехи - характерный треск (например хоршо озвучивается треск винта головками, его раскучивание при включении, так же при запуске программ и даже если просто на рабочем столе интенсивно пошевелить мышкой). Особенно все это слышно в тишине. Пробовал то же самое, но с 5 В. Как выяснилось этого им тоже вполне достаточно, играю ничуть не тише. Но шум по-прежнему присутствует, хотя звучит он неного по-другому. Под рукой был линейный стабилизатор LM1084 на 5А с задаваемым 2-мя резисторами входным напряжением. Ему нужна некая дельта между входом и выходом, поэтому задал резистоами выход порядка 10 В. По-прежнему шумит. Наилучший результат был при запитывании стабилизатора попрежнему от 12 В, но резисторами задал 5 В на выходе. В этом случае шум получился значительно тише, на низкой громкости вроде даже не достает. Что можно предпринять еще не особо извращаясь? P.S.: БП вроде хороший - Delta Power 500W.
  9. Цитата(Konst_777 @ Mar 17 2008, 22:58) Выберите АЦП и рассмотрим на конкретном примере. Вот только, на этой неделе у меня не будет времени. Но может быть еще кто-нибудь даст ответы на Ваши вопросы и критические замечания на мои ответы. Ну если не сложно, давайте рассмотрим подключение к CY7C68013A-56PVXC АЦП AD9203. Цитата(Konst_777 @ Mar 17 2008, 22:58) Попробуйте этот пример. Он предназначен именно для FX2 (cy7c68013). Если заработает, сравните тексты исходников. Спасибо! Пример нормально завелся. Буду копать исходики.
  10. Цитата(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 - ничего не выводит... С чем может быть это связано? У меня есть схема этой платы, но выложить ее не могу. Много пинов контроллера заведены на ПЛИС, конфигурация в которой затерта неизвестно чем (и чего там должно быть у меня нету). Может ли прична быть в ПЛИС, т.е. какие критичные для контроллера пины нужно проверить?
  11. Вот, нашел то, что надо. 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?
  12. Konst_777, опишу проект подробнее. Значится так. Все затевается для считывания данных с ПЗС матрицы. Матрица будет тактироваться ПЛИСиной (т.е. ПЛИС будет вырабатывать тактовые импульсы вертикального и горизонтального сдвига в ПЗС). С выхода ПЗС аналоговый сигнал идет на абстрактный 10-битный АЦП. Дык вот, хотелось бы завести эти 10 бит на FX2 и подать на FX2 еще какой-нибудь сигнал с ПЛИС, который бы говорил о готовности данных, т.е. давался синхронно с изменением данных на выходе ПЗС (и АЦП соответственно). Т.е. обмен оносторонний (АЦП->компьютер), темп обмена задается ПЛИСом. На компьютере приложение будет в цикле проверять приход новых данных и сбрасывать их на диск. Вот собственно вопрос в том как все это организовать: какие и сколько сигналов нужно подать на FX2, какой режим применять и тд...
  13. Можно ли в режиме Slave FIFO организовать такой обмен: по факту наличия действительных данных на АЦП ме устройство вырабатывает строб, который падаетя на какой-то пин Cypress (какой?). Данные напрямую с АЦП на Cypress. По стробу данные загружаются в FIFO. Т.е. каждая выборка сопровождается стробом. По мере зполнения FIFO Cypress отправляет данные хосту, где программа просто их сбрасывает на диск. Если что-то подобное реализуемо, то это синхронный или асинхроный Slave FIFO?
  14. А какой АЦП подойдет для матрицы? Мжно использовать например AD9203? Вроде по разрядности и по скорости пдходит... На что еще смотреть?
  15. Мне не понятно следующе: допустим мое устройство заполняет буфер FIFIO. После заполнения буфера (так ведь?) происходит отправка данных по USB. Во время этого процесса буфер получается заполнен и не доступен для моего усройства? Ведь отправка данных занимает некотрое время.... И потом, получается что пропускня способность USB (480 Mbit/s) не постоянна во времени, т.к. между передачами будут аузы, пока заполняется буфер, и чтоб обеспечить такую скорость нужно чтобы иковая скорость превышала 480.. Это так, размышления просто мне конечно максимальная скорость не нужна, но хоелось бы понять общие принципы.