aleshanoff 0 Posted August 25, 2015 (edited) · Report post У меня стоит задача организовать обмен данными через USB между компьютером и ПЛИС spartan3e. Была выбрана USB board CY7C68013A на чипе Cypress. С ПЛИС передаются данные с 16 битного датчика , обратно команда на выбор режима обработки (В ПЛИС будет реализовано несколько алгоритмов обрабтки входного сигнала, но данные после обработки останутся также 16 битными). Возникли следующие вопросы: 1) что лучше (легче) использовать для моей задачи SlaveFIFO или GPIF? 2)как устанавливать регистры в нужное состояние? Например, FIFOPINPOLAR и IFCONFIG.x. 3) на сайте Cypress есть множество примеров (напримерhttp://www.cypress.com/documentation/application-notes/an61345-designing-ez-usb-fx2lp-slave-fifo-interface) - как ими пользоваться, чтобы не изобретать велосипед? что и где в них смотреть? Как заливать готовые примеры в чип? Какую прошивку чипа использовать? USB board Edited August 25, 2015 by aleshanoff Quote Ответить с цитированием Share this post Link to post Share on other sites
demon3200 0 Posted August 25, 2015 · Report post Возникли следующие вопросы: 1) что лучше (легче) использовать для моей задачи SlaveFIFO или GPIF? 2)как устанавливать регистры в нужное состояние? Например, FIFOPINPOLAR и IFCONFIG.x. 3) на сайте Cypress есть множество примеров (напримерhttp://www.cypress.com/documentation/application-notes/an61345-designing-ez-usb-fx2lp-slave-fifo-interface) - как ими пользоваться, чтобы не изобретать велосипед? что и где в них смотреть? Как заливать готовые примеры в чип? Какую прошивку чипа использовать? 1) За GPIF не скажу, а вот со SlaveFIFO работать приходилось. Вполне себе удобный интерфейс с 16-разрядной шиной. Тем более у Вас как раз 16 бит нужно передавать. 2) Для установки регистров контроллера нужно писать прошивку. У Сайпрессов где-то была заготовка, туда свои установки регистров прописываете. Но перед этим нужно хорошо разобраться с контроллером, что и как настраивать. Там свои тонкости. Я всех нюансов сейчас уже не помню, но тогда пришлось довольно долго изучать сам контроллер, прежде чем что-то написать. У меня при включении один раз конфигурировался USB, и далее ПЛИС связывалась с компьютером уже без вмешательства CPU. 3) Сначала хорошо изучить документацию. В сети некоторые главы есть на русском. Прошивка в чип заливается через фирменную утилитку CyConsole. А вообще контроллер сам умеет прошиваться через внешнюю EEPROM при включении питания. Прошивка в EEPROM заливается опять таки, через CyConsole. Quote Ответить с цитированием Share this post Link to post Share on other sites
aleshanoff 0 Posted August 25, 2015 · Report post 3) Сначала хорошо изучить документацию. В сети некоторые главы есть на русском. Прошивка в чип заливается через фирменную утилитку CyConsole. А вообще контроллер сам умеет прошиваться через внешнюю EEPROM при включении питания. Прошивка в EEPROM заливается опять таки, через CyConsole. Изучил, прочитал на русском, полистал на английском. С прошивкой контроллера тоже все ясно. Не ясно со структурой примеров. В примерах куча файлов - какой зачеми куда его вставлять - непонятно, 2) Для установки регистров контроллера нужно писать прошивку. У Сайпрессов где-то была заготовка, туда свои установки регистров прописываете. Но перед этим нужно хорошо разобраться с контроллером, что и как настраивать. Там свои тонкости. Я всех нюансов сейчас уже не помню, но тогда пришлось довольно долго изучать сам контроллер, прежде чем что-то написать. У меня при включении один раз конфигурировался USB, и далее ПЛИС связывалась с компьютером уже без вмешательства CPU. Не могли бы вы подробнее рассказать о том, как писать прошивку? Где посмотреть заготовку? Quote Ответить с цитированием Share this post Link to post Share on other sites
demon3200 0 Posted August 25, 2015 · Report post В примерах куча файлов - какой зачеми куда его вставлять - непонятно Тот шаблон, который использовал я, содержал в себе две функции TD_Init и TD_Poll. Первая вызывается один раз при включении контроллера. Там у меня прописывалась инициализация. Вторая находитя в теле цикла while(TRUE) и потому вызывается постоянно - здесь идет обработка пользовательских задач. Вот пример моей функции инициализации: void TD_Init(void) // Called once at startup { REVCTL = 0x01; SYNCDELAY; // set the CPU clock to 48MHz CPUCS = 0x10; SYNCDELAY; // set the slave FIFO interface to 30MHz IFCONFIG = 0xA3; SYNCDELAY; // Registers which require a synchronization delay, see section 15.14 // FIFORESET FIFOPINPOLAR // INPKTEND OUTPKTEND // EPxBCH:L REVCTL // GPIFTCB3 GPIFTCB2 // GPIFTCB1 GPIFTCB0 // EPxFIFOPFH:L EPxAUTOINLENH:L // EPxFIFOCFG EPxGPIFFLGSEL // PINFLAGSxx EPxFIFOIRQ // EPxFIFOIE GPIFIRQ // GPIFIE GPIFADRH:L // UDMACRCH:L EPxGPIFTRIG // GPIFTRIG // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well... // ...these have been replaced by GPIFTC[B3:B0] registers // default: all endpoints have their VALID bit set // default: TYPE1 = 1 and TYPE0 = 0 --> BULK // default: EP2 and EP4 DIR bits are 0 (OUT direction) // default: EP6 and EP8 DIR bits are 1 (IN direction) // default: EP2, EP4, EP6, and EP8 are double buffered // we are just using the default values, yes this is not necessary... EP1OUTCFG = 0xA0; //1010 0000, active, BULK, 1x64 bytes SYNCDELAY; EP1INCFG = 0xA0; //1010 0000, active, BULK, 1x64 bytes SYNCDELAY; // see TRM section 15.14 EP2CFG = 0xE0; // 1110 0000, active, IN, BULK, 4x512 bytes SYNCDELAY; EP4CFG = 0x00; //not active SYNCDELAY; EP6CFG = 0xA2; // 1010 0010, active, OUT, BULK, 2x512 bytes SYNCDELAY; // EP8CFG = 0x00; //not active // SYNCDELAY; EP8CFG = 0xA0; // 1010 0000, active, OUT, BULK, 2x512 bytes SYNCDELAY; FIFORESET = 0x80; SYNCDELAY; FIFORESET = 0x02; SYNCDELAY; FIFORESET = 0x04; SYNCDELAY; FIFORESET = 0x06; SYNCDELAY; FIFORESET = 0x08; SYNCDELAY; FIFORESET = 0x00; SYNCDELAY; EP2FIFOCFG = 0x00; SYNCDELAY; EP4FIFOCFG = 0x00; SYNCDELAY; EP6FIFOCFG = 0x00; SYNCDELAY; EP8FIFOCFG = 0x00; SYNCDELAY; EP2FIFOCFG = 0x0C; // 0000 1100, AUTOIN SYNCDELAY; EP6FIFOCFG = 0x10; // 0001 0000, AUTOOUT SYNCDELAY; EP8FIFOCFG = 0x00; // 0000 0000 SYNCDELAY; PINFLAGSAB = 0x8A; //FLAGA - EP6 EMPTY, FLAGB - EP2 EMPTY SYNCDELAY; PINFLAGSCD = 0xAC; //FLAGC - EP2 FULL, FLAGD - EP6 EMPTY SYNCDELAY; // INPKTEND = 0x00; // SYNCDELAY; // OUTPKTEND = 0x00; // SYNCDELAY; FIFOPINPOLAR = 0x00; // Activ LOW SYNCDELAY; EP2AUTOINLENH = 0x02; EP2AUTOINLENL = 0x00; PORTACFG = 0x80; // FLAGD SYNCDELAY; REVCTL = 0x00; SYNCDELAY; OEA |= 0x01; PA0 = 1; //CLEAR = 0; } Шаблон должен быть на сайте Cypress. aleshanoff, посмотрите здесь AN61345 - Designing With EZ-USB® FX2LP™ Slave FIFO Interface. Это должно быть как раз то, что нужно. С этой аппликухи я делал свой проект. Там и документация и шаблоны имеются. Она, правда, поновее чем та, которую скачивал я. Но смысл тот же. Quote Ответить с цитированием Share this post Link to post Share on other sites
aleshanoff 0 Posted August 25, 2015 (edited) · Report post посмотрите здесь AN61345 - Designing With EZ-USB® FX2LP™ Slave FIFO Interface. Это должно быть как раз то, что нужно. С этой аппликухи я делал свой проект. Там и документация и шаблоны имеются. Она, правда, поновее чем та, которую скачивал я. Но смысл тот же. Да, как раз этот пример я и хотел взять за основу. для ПЛИС режим Loopback подойдет. Уже прошил чип из папки FX2LP firmware файлами slave.hex и slave.iic. Определился как Cypress FX2LP StreamerExample Device. Просмотрел файл fw.c , но так и не понял, как его изменить. А если и разберусь, то что делать дальше? Подскажите, пожалуйста, только шапками не закидывайте. Сейчас читаю описание к проекту, но труднова-то идет -всю жизнь немецкий учил. AN61345___Source_code_1_.zip Edited August 25, 2015 by aleshanoff Quote Ответить с цитированием Share this post Link to post Share on other sites
aleshanoff 0 Posted August 25, 2015 · Report post После 5 часового чтения форумов, даташитов и прочего. Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. За основу хочу взять следующий пример в Auto mode как master. Там есть файл gpif.c . Подскажите, пожалуйста, как его модифицировать, чтобы все заработало? AN63787.zip Quote Ответить с цитированием Share this post Link to post Share on other sites
alevnew 0 Posted August 26, 2015 · Report post Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. Ну так ПЛИС и существует для того, чтобы ее загружали... :) Теперь по существу из своего опыта: С CY7C68013A все замечательно работает, быстро передаются данные. Но! Проблема в драйверах. Если раньше можно было обойтись самописными драйверами, то теперь неподписанный драйвер не установишь в Win 7 и старше. Даже для виртуального COM порта в Win 8 inf файл должен быть подписан. Если для собственного использования проверку подписи еще можно отключить, то для продажи устройств на сторону такой способ не годится. Ну и для коммеческого использования, по хорошему, также нужен свой PID. Поэтому, намучавшись с драйверами, для себя я решил использовать для связи по USB чипы FTDI. К ним поставляется драйвер. А Cypress - для "стандартных" устройств, для которых в Windows не требуются драйвера. Quote Ответить с цитированием Share this post Link to post Share on other sites
demon3200 0 Posted August 26, 2015 (edited) · Report post Просмотрел файл fw.c , но так и не понял, как его изменить. А если и разберусь, то что делать дальше? В файле fw.c помимо прочих объявлены две функции, с которыми Вам придется работать. void TD_Init(void); void TD_Poll(void); Определения функций находятся в файле slave.c TD_Init вызывается однократно и служит для начальной пользовательской инициализации контроллера, т.е. для настройки периферии. В ней нужно прописывать значения в регистры. Выше я привел пример того, как это делается у меня. TD_Poll вызывается постоянно и служит как бы менеджером пользовательских задач. Хотя никто Вам не запрещает написать свои собственные функции. Как у Вас с языком С? Пишете код инициализации контроллера, в зависимости от того, что хотите получить. Тут мало просто просмотреть доки. Нужно вникнуть. Я в свое время потратил несколько месяцев на изучение всего этого дела. В самом USB тоже хорошо бы разобраться. Если что, могу подкинуть литературку ;) Сейчас читаю описание к проекту, но труднова-то идет -всю жизнь немецкий учил. Мне мой немецкий тоже доставляет неудобства. Но со временем технические тексты стали читаться более менее. Произношение, конечно, немецкое. Одно "енабле" и "дисабле" чего только стоит))))) После 5 часового чтения форумов, даташитов и прочего. Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. За основу хочу взять следующий пример в Auto mode как master. Там есть файл gpif.c . Подскажите, пожалуйста, как его модифицировать, чтобы все заработало? Вот здесь подсказать ничего не могу. Сам использовал slaveFIFO. Edited August 26, 2015 by dima32rus Quote Ответить с цитированием Share this post Link to post Share on other sites
andreichk 0 Posted August 26, 2015 · Report post https://github.com/makestuff/libfpgalink/wiki/FPGALink никто не пробовал? как раз для связки кипреса со спартаном годится. там и драйвер для любой винды лехко собирается Quote Ответить с цитированием Share this post Link to post Share on other sites
alevnew 0 Posted August 26, 2015 (edited) · Report post там и драйвер для любой винды лехко собирается То, что драйвер легко собирается, не значит, что его не нужно подписывать :crying: Edited August 26, 2015 by alevnew Quote Ответить с цитированием Share this post Link to post Share on other sites
andreichk 0 Posted August 26, 2015 · Report post То, что драйвер легко собирается, не значит, что его не нужно подписывать :crying: ну дык и подпишите, там есть утилитка специально для этого. хоть своим именем его обзовите http://sourceforge.net/projects/libusb-win32/ качаем отсюда Quote Ответить с цитированием Share this post Link to post Share on other sites
aleshanoff 0 Posted August 26, 2015 · Report post В файле fw.c помимо прочих объявлены две функции, с которыми Вам придется работать. Как у Вас с языком С? Пишете код инициализации контроллера, в зависимости от того, что хотите получить. Тут мало просто просмотреть доки. с Языком С еще хуже чем с английским))) но если Родина прикажет - выучим и разберемся))) Quote Ответить с цитированием Share this post Link to post Share on other sites
aleshanoff 0 Posted August 26, 2015 · Report post И совсем тупой вопрос. файл.c - это Си или С++? Quote Ответить с цитированием Share this post Link to post Share on other sites
demon3200 0 Posted August 26, 2015 · Report post И совсем тупой вопрос. файл.c - это Си или С++? Си. Исходники С++ обычно имеют расширение .срр. Quote Ответить с цитированием Share this post Link to post Share on other sites
alevnew 0 Posted August 26, 2015 · Report post ну дык и подпишите, там есть утилитка специально для этого. хоть своим именем его обзовите http://sourceforge.net/projects/libusb-win32/ качаем отсюда Да, действительно генерит inf и подписывает своими подписью-сертификатом и устанавливает этот сертификат в систему. А при установке этого сертификата в Win 8 проблемы не возникают? Quote Ответить с цитированием Share this post Link to post Share on other sites