Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CY7C68013 Slave FIFO - BULK - OUT
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
РоманО
Добрый день, всем!

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

Примеры с сайта кипариса уж очень сомнительные, в TRM последовательность инициализации прописана убого. Прошу помощи
SM
Цитата(РоманО @ Feb 6 2014, 22:49) *
неправильно реализована сама программа кипариса. Есть ли у кого живой пример Slave FIFO - OUT для этого контроллера?


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

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

CODE

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 - сброшен.

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

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

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

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

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

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

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

Код
        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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.