Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB интерфейс с помощью CY7C68013A.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
aleshanoff
У меня стоит задача организовать обмен данными через 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
dima32rus
Цитата(aleshanoff @ Aug 25 2015, 13:17) *
Возникли следующие вопросы:
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.

aleshanoff
Цитата(dima32rus @ Aug 25 2015, 15:23) *
3) Сначала хорошо изучить документацию. В сети некоторые главы есть на русском. Прошивка в чип заливается через фирменную утилитку CyConsole. А вообще контроллер сам умеет прошиваться через внешнюю EEPROM при включении питания. Прошивка в EEPROM заливается опять таки, через CyConsole.

Изучил, прочитал на русском, полистал на английском. С прошивкой контроллера тоже все ясно. Не ясно со структурой примеров. В примерах куча файлов - какой зачеми куда его вставлять - непонятно,

Цитата(dima32rus @ Aug 25 2015, 15:23) *
2) Для установки регистров контроллера нужно писать прошивку. У Сайпрессов где-то была заготовка, туда свои установки регистров прописываете. Но перед этим нужно хорошо разобраться с контроллером, что и как настраивать. Там свои тонкости. Я всех нюансов сейчас уже не помню, но тогда пришлось довольно долго изучать сам контроллер, прежде чем что-то написать. У меня при включении один раз конфигурировался USB, и далее ПЛИС связывалась с компьютером уже без вмешательства CPU.


Не могли бы вы подробнее рассказать о том, как писать прошивку? Где посмотреть заготовку?
dima32rus
Цитата(aleshanoff @ Aug 25 2015, 14:48) *
В примерах куча файлов - какой зачеми куда его вставлять - непонятно

Тот шаблон, который использовал я, содержал в себе две функции 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. Это должно быть как раз то, что нужно. С этой аппликухи я делал свой проект. Там и документация и шаблоны имеются. Она, правда, поновее чем та, которую скачивал я. Но смысл тот же.
aleshanoff
Цитата(dima32rus @ Aug 25 2015, 16:45) *
посмотрите здесь AN61345 - Designing With EZ-USB® FX2LP™ Slave FIFO Interface. Это должно быть как раз то, что нужно. С этой аппликухи я делал свой проект. Там и документация и шаблоны имеются. Она, правда, поновее чем та, которую скачивал я. Но смысл тот же.

Да, как раз этот пример я и хотел взять за основу. для ПЛИС режим Loopback подойдет. Уже прошил чип из папки FX2LP firmware файлами slave.hex и slave.iic. Определился как Cypress FX2LP StreamerExample Device. Просмотрел файл fw.c , но так и не понял, как его изменить. А если и разберусь, то что делать дальше? Подскажите, пожалуйста, только шапками не закидывайте. Сейчас читаю описание к проекту, но труднова-то идет -всю жизнь немецкий учил.
aleshanoff
После 5 часового чтения форумов, даташитов и прочего. Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. За основу хочу взять следующий пример в Auto mode как master. Там есть файл gpif.c . Подскажите, пожалуйста, как его модифицировать, чтобы все заработало?
alevnew
Цитата(aleshanoff @ Aug 26 2015, 04:16) *
Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС.

Ну так ПЛИС и существует для того, чтобы ее загружали... sm.gif
Теперь по существу из своего опыта:
С CY7C68013A все замечательно работает, быстро передаются данные.
Но! Проблема в драйверах.
Если раньше можно было обойтись самописными драйверами, то теперь неподписанный драйвер не установишь в Win 7 и старше.
Даже для виртуального COM порта в Win 8 inf файл должен быть подписан.
Если для собственного использования проверку подписи еще можно отключить, то для продажи устройств на сторону такой способ не годится.
Ну и для коммеческого использования, по хорошему, также нужен свой PID.
Поэтому, намучавшись с драйверами, для себя я решил использовать для связи по USB чипы FTDI. К ним поставляется драйвер.
А Cypress - для "стандартных" устройств, для которых в Windows не требуются драйвера.

dima32rus
Цитата(aleshanoff @ Aug 25 2015, 21:25) *
Просмотрел файл fw.c , но так и не понял, как его изменить. А если и разберусь, то что делать дальше?

В файле fw.c помимо прочих объявлены две функции, с которыми Вам придется работать.

Код
void TD_Init(void);
void TD_Poll(void);

Определения функций находятся в файле slave.c
TD_Init вызывается однократно и служит для начальной пользовательской инициализации контроллера, т.е. для настройки периферии. В ней нужно прописывать значения в регистры. Выше я привел пример того, как это делается у меня.
TD_Poll вызывается постоянно и служит как бы менеджером пользовательских задач. Хотя никто Вам не запрещает написать свои собственные функции. Как у Вас с языком С?
Пишете код инициализации контроллера, в зависимости от того, что хотите получить. Тут мало просто просмотреть доки. Нужно вникнуть. Я в свое время потратил несколько месяцев на изучение всего этого дела. В самом USB тоже хорошо бы разобраться. Если что, могу подкинуть литературку wink.gif

Цитата(aleshanoff @ Aug 25 2015, 21:25) *
Сейчас читаю описание к проекту, но труднова-то идет -всю жизнь немецкий учил.

Мне мой немецкий тоже доставляет неудобства. Но со временем технические тексты стали читаться более менее. Произношение, конечно, немецкое. Одно "енабле" и "дисабле" чего только стоит)))))

Цитата(aleshanoff @ Aug 26 2015, 02:16) *
После 5 часового чтения форумов, даташитов и прочего. Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. За основу хочу взять следующий пример в Auto mode как master. Там есть файл gpif.c . Подскажите, пожалуйста, как его модифицировать, чтобы все заработало?

Вот здесь подсказать ничего не могу. Сам использовал slaveFIFO.
andreichk
https://github.com/makestuff/libfpgalink/wiki/FPGALink никто не пробовал? как раз для связки кипреса со спартаном годится. там и драйвер для любой винды лехко собирается
alevnew
Цитата(andreichk @ Aug 26 2015, 10:41) *
там и драйвер для любой винды лехко собирается

То, что драйвер легко собирается, не значит, что его не нужно подписывать crying.gif
andreichk
Цитата(alevnew @ Aug 26 2015, 08:22) *
То, что драйвер легко собирается, не значит, что его не нужно подписывать crying.gif

ну дык и подпишите, там есть утилитка специально для этого. хоть своим именем его обзовите

http://sourceforge.net/projects/libusb-win32/ качаем отсюда
aleshanoff
Цитата(dima32rus @ Aug 26 2015, 08:14) *
В файле fw.c помимо прочих объявлены две функции, с которыми Вам придется работать.

Как у Вас с языком С?
Пишете код инициализации контроллера, в зависимости от того, что хотите получить. Тут мало просто просмотреть доки.

с Языком С еще хуже чем с английским))) но если Родина прикажет - выучим и разберемся)))
aleshanoff
И совсем тупой вопрос. файл.c - это Си или С++?
dima32rus
Цитата(aleshanoff @ Aug 26 2015, 13:38) *
И совсем тупой вопрос. файл.c - это Си или С++?

Си. Исходники С++ обычно имеют расширение .срр.
alevnew
Цитата(andreichk @ Aug 26 2015, 12:05) *
ну дык и подпишите, там есть утилитка специально для этого. хоть своим именем его обзовите
http://sourceforge.net/projects/libusb-win32/ качаем отсюда

Да, действительно генерит inf и подписывает своими подписью-сертификатом и устанавливает этот сертификат в систему.
А при установке этого сертификата в Win 8 проблемы не возникают?
andreichk
ну вот и проверьте
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.