Jump to content

    
aleshanoff

USB интерфейс с помощью CY7C68013A.

Recommended Posts

У меня стоит задача организовать обмен данными через 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

post-86484-1440497824_thumb.jpg

Edited by aleshanoff

Share this post


Link to post
Share on other sites
Возникли следующие вопросы:

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.

 

 

Share this post


Link to post
Share on other sites
3) Сначала хорошо изучить документацию. В сети некоторые главы есть на русском. Прошивка в чип заливается через фирменную утилитку CyConsole. А вообще контроллер сам умеет прошиваться через внешнюю EEPROM при включении питания. Прошивка в EEPROM заливается опять таки, через CyConsole.

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

 

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

 

Не могли бы вы подробнее рассказать о том, как писать прошивку? Где посмотреть заготовку?

Share this post


Link to post
Share on other sites
В примерах куча файлов - какой зачеми куда его вставлять - непонятно

Тот шаблон, который использовал я, содержал в себе две функции 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. Это должно быть как раз то, что нужно. С этой аппликухи я делал свой проект. Там и документация и шаблоны имеются. Она, правда, поновее чем та, которую скачивал я. Но смысл тот же.

Share this post


Link to post
Share on other sites
посмотрите здесь 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 by aleshanoff

Share this post


Link to post
Share on other sites

После 5 часового чтения форумов, даташитов и прочего. Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС. За основу хочу взять следующий пример в Auto mode как master. Там есть файл gpif.c . Подскажите, пожалуйста, как его модифицировать, чтобы все заработало?

AN63787.zip

Share this post


Link to post
Share on other sites
Решил остановиться на режиме GPIF, чтобы не загружать ПЛИС.

Ну так ПЛИС и существует для того, чтобы ее загружали... :)

Теперь по существу из своего опыта:

С CY7C68013A все замечательно работает, быстро передаются данные.

Но! Проблема в драйверах.

Если раньше можно было обойтись самописными драйверами, то теперь неподписанный драйвер не установишь в Win 7 и старше.

Даже для виртуального COM порта в Win 8 inf файл должен быть подписан.

Если для собственного использования проверку подписи еще можно отключить, то для продажи устройств на сторону такой способ не годится.

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

Поэтому, намучавшись с драйверами, для себя я решил использовать для связи по USB чипы FTDI. К ним поставляется драйвер.

А Cypress - для "стандартных" устройств, для которых в Windows не требуются драйвера.

 

 

Share this post


Link to post
Share on other sites
Просмотрел файл 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 by dima32rus

Share this post


Link to post
Share on other sites
https://github.com/makestuff/libfpgalink/wiki/FPGALink никто не пробовал? как раз для связки кипреса со спартаном годится. там и драйвер для любой винды лехко собирается

Share this post


Link to post
Share on other sites
там и драйвер для любой винды лехко собирается

То, что драйвер легко собирается, не значит, что его не нужно подписывать :crying:

Edited by alevnew

Share this post


Link to post
Share on other sites
То, что драйвер легко собирается, не значит, что его не нужно подписывать :crying:

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

 

http://sourceforge.net/projects/libusb-win32/ качаем отсюда

Share this post


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

 

Как у Вас с языком С?

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

с Языком С еще хуже чем с английским))) но если Родина прикажет - выучим и разберемся)))

 

Share this post


Link to post
Share on other sites
ну дык и подпишите, там есть утилитка специально для этого. хоть своим именем его обзовите

http://sourceforge.net/projects/libusb-win32/ качаем отсюда

Да, действительно генерит inf и подписывает своими подписью-сертификатом и устанавливает этот сертификат в систему.

А при установке этого сертификата в Win 8 проблемы не возникают?

 

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.