Перейти к содержанию
    

CY7C68013 Slave FIFO - BULK - OUT

Добрый день, всем!

 

Проблема следующая: делаю Slave FIFO IN - OUT. Мастером служит Xilinx Spartan-6. Для Slave FIFO - IN все работает замечательно: данные из ПЛИСа успешно доходят до компьютера, но вот со Slave FIFO - OUT какие то проблемы. Флаги не устанавливаются и не меняют своего значения при попытке отправить данные с компьютера. Такое ощущение, что неправильно реализована сама программа кипариса. Есть ли у кого живой пример Slave FIFO - OUT для этого контроллера?

 

Примеры с сайта кипариса уж очень сомнительные, в TRM последовательность инициализации прописана убого. Прошу помощи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

неправильно реализована сама программа кипариса. Есть ли у кого живой пример Slave FIFO - OUT для этого контроллера?

 

"программа кипариса" не участвует в работе Slave FIFO...

 

Вот моя рабочая инициализация:

 

void TD_Init(void)             // Called once at startup
{

 PORTACFG = 0x00;
 OEA = 0x8B;
 IOA = 0x00;

 SYNCDELAY;
 CPUCS = 0x10;
 SYNCDELAY;
 IFCONFIG = 0xA3;

 SYNCDELAY;
 REVCTL = 0x03; // 0x01

 SYNCDELAY;   
 PINFLAGSAB = 0xE8;  // FLAGA = 2_empty, FLAGB=6_FULL
 SYNCDELAY;                    
 PINFLAGSCD = 0xCC;  // FLAGC/D 2_full
 SYNCDELAY;                    
 FIFOPINPOLAR = 0x00;

 SYNCDELAY;
 EP1OUTCFG = 0x00;
 SYNCDELAY;                    
 EP1INCFG = 0x00;
 SYNCDELAY;                    
 EP2CFG = 0xA2;
 SYNCDELAY;                    
 EP4CFG = 0x00;
 SYNCDELAY;                    
 EP6CFG = 0xE2;
 SYNCDELAY;                    
 EP8CFG = 0x00;

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

 // since the defaults are double buffered we must write dummy byte counts twice
 SYNCDELAY;                    
 OUTPKTEND = 0x82;     // arm EP2OUT by writing byte count w/skip.
 SYNCDELAY;                    
 OUTPKTEND = 0x82;     // arm EP2OUT by writing byte count w/skip.

 SYNCDELAY;
 EP2FIFOCFG = 0x11;
 SYNCDELAY;                    
 EP6FIFOCFG = 0x09+0x04;  // 04 - ZeroLenIn

 // enable dual autopointer feature
 AUTOPTRSETUP |= 0x01;

 Rwuen = TRUE;                 // Enable remote-wakeup
}

.......

BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received
{
 if( EZUSB_HIGHSPEED( ) )
 { // FX2 enumerated at high speed
   SYNCDELAY;                  // 
   EP6AUTOINLENH = 0x02;       // set AUTOIN commit length to 512 bytes
   SYNCDELAY;                  // 
   EP6AUTOINLENL = 0x00;
   SYNCDELAY;                  
   enum_high_speed = TRUE;
 }
 else
 { // FX2 enumerated at full speed
   SYNCDELAY;                   
   EP6AUTOINLENH = 0x00;       // set AUTOIN commit length to 64 bytes
   SYNCDELAY;                   
   EP6AUTOINLENL = 0x40;
   SYNCDELAY;                  
   enum_high_speed = FALSE;
 }

  Configuration = SETUPDAT[2];
  return(TRUE);            // Handled by user code
}

...........


 

И не забудьте дернуть ногу "PKTEND" ПЛИС-ой, если отправляемый пакет меньше пакета USB (64 байта в full speed / 512 байт в high), а то он так в FIFO лежать и будет до второго пришествия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините за задержку с ответом: только сегодня смог попробовать ваш вариант решения проблемы.

 

Сразу же скажу, что ваш текст не лишен недостатков:

PINFLAGSCD = 0xCC;

при этом PORTACFG не проинициализирован, а следовательно FlagD - это обычный порт ввода-вывода.

 

Далее при сбросе FIFO:

 

SYNCDELAY;

FIFORESET = 0x80;

SYNCDELAY;

FIFORESET = 0x02;

SYNCDELAY;

FIFORESET = 0x04;

SYNCDELAY;

FIFORESET = 0x06;

SYNCDELAY;

FIFORESET = 0x08;

SYNCDELAY;

FIFORESET = 0x00;

 

Что касается сброса то TRM рекомендует сбрасывать по другому, например так: FIFORESET = 0x82;

 

Теперь, что касается вашего примера: он у меня не работает. Конфигурация устройства у меня немного другая:

Источник IFCLK у меня внешний:

void TD_Init(void)             // Called once at startup
{
  // ports initialization

  PORTACFG = bmFLAGD; 
  SYNCDELAY;

  OEC = 0xFF;  //this is test port, don't connected anything
  SYNCDELAY;                    // 
  IOC = 0x00;
  SYNCDELAY; 

  OEA = 0x01; //PA.0 = PROG
  SYNCDELAY;
  IOA = 0x01; 
  SYNCDELAY;
    
  OEE = 0x91; //PE.0 - FPGA Reset, PE.4 - DOUT, PE.7 - CCLK
  SYNCDELAY;
  IOE = 0x01;
  SYNCDELAY;
    
//core initialization
    
  CPUCS = bmCLKSPD1 | bmCLKOE;  //Setting 48MHz, CLKOE
  SYNCDELAY;
    
  IFCONFIG = bmIFCFG1 | bmIFCFG0; // IFCFG = 11 - Slave FIFO Interface (external master) 
  SYNCDELAY;
    
  REVCTL = bmNOAUTOARM | bmSKIPCOMMIT;
  SYNCDELAY;
    
//PINFLAGS initialization
  PINFLAGSAB = 0x88;
  SYNCDELAY;
  PINFLAGSCD = 0x88;
  SYNCDELAY; 
  FIFOPINPOLAR = 0x00; //standard pin polarity
  SYNCDELAY;
    
//Endpoints config
//EP1 - standard configuration
  EP2CFG = 0xA2; // EP2OUT
  SYNCDELAY;                    
  EP4CFG = 0x00; //EP4 - disabled
  SYNCDELAY;                    
  EP6CFG = 0x00; //EP6 - disabled
  SYNCDELAY;                    
  EP8CFG = 0x00; //EP8 - disabled
  SYNCDELAY;   

  //FIFO reset
  FIFORESET = 0x80;
  SYNCDELAY;
  FIFORESET = 0x82;
  SYNCDELAY;
  FIFORESET = 0x84;
  SYNCDELAY;
  FIFORESET = 0x86;
  SYNCDELAY;
  FIFORESET = 0x88;
  SYNCDELAY;
  FIFORESET = 0x00;
  SYNCDELAY;
    
  // since the defaults are double buffered we must write dummy byte counts twice
  OUTPKTEND = 0x82;     // arm EP2OUT by writing byte count w/skip.
  SYNCDELAY;                    
  OUTPKTEND = 0x82;     // arm EP2OUT by writing byte count w/skip.    
  SYNCDELAY;                    
    
  EP2FIFOCFG = bmAUTOOUT | bmWORDWIDE;
  SYNCDELAY;
    
// enable dual autopointer feature
  AUTOPTRSETUP |= 0x01;
    
  Rwuen = TRUE;                 // Enable remote-wakeup
}

 

Обратите внимание, что все флаги у меня находятся в одном состоянии = EP2EMPTY, при этом результат на флагах у меня разный: флаги A,C,D - установлены, а флаг B - сброшен.

 

Есть ли какие-то идеи как этот код запустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня FLAGD реально используется в схеме как I/O пин. Так что это не недостаток, это фича :)

 

Внутри ПЛИС подключены FLAGA и FLAGB, для индикации, что что-то пришло по OUT, и что еще есть место для передачи по IN

 

FLAGC никому не нужен, идет в ПЛИС, но не используется.

 

Чтобы там TRM не говорил, этот мой код был выстрадан кучей экспериментов, и работает не в одной тысяче изделий именно в таком виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не то чтобы я пытался атаковать с критикой, и конечно я не сомневаюсь в работоспособности вашего кода.

 

И все таки у меня это не работает: мой пример кода приведен выше: может быть я не вижу чего-то очевидного.

 

Идея работы кода такая: сначала я прогружаю кипарис приведенным выше кодом, далее через EP1 я конфигурирую ПЛИС (работает на ура), далее я хочу передать данные в ПЛИС и вот тут затык. Для примера сделаны все флаги фиксироваными и обозначающими EP2Empty, так вот флаги у меня находятся в разных положениях и не перещелкиваются при передаче данных через Control Center.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть пригодится (я так понимаю, что Вы переключаете режим работы с EP1 на EP2, а я ведь сразу в TD_INIT все делаю)... У меня вот такая процедура сброса FIFO уже в процессе работы:

 

причем обнуление EPxFIFOCFG было там критически обязательным. И вообще, помнится, там везде шаг влево, шаг вправо, и нифига не работает... Я как-то шамански свой код запустил, и много лет не трогаю :) :)

 

        IOA &= ~0x80; // Assert FPGA's RESET

       SYNCDELAY;
       EP2FIFOCFG = 0x00;
       SYNCDELAY;
       EP6FIFOCFG = 0x00;

       SYNCDELAY;
       FIFORESET = 0x80;
       SYNCDELAY;
       FIFORESET = 0x06;
       SYNCDELAY;
       FIFORESET = 0x02;
       SYNCDELAY;
       FIFORESET = 0x00;

       SYNCDELAY;
       OUTPKTEND = 0x82;
       SYNCDELAY;
       OUTPKTEND = 0x82;

       SYNCDELAY;
       EP2FIFOCFG = 0x11;
       SYNCDELAY;                    
       EP6FIFOCFG = 0x09+0x04;  // 04 - ZeroLenIn

       EZUSB_Delay1ms();

       IOA |= 0x80; // Deassert FPGA's RESET

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...