Roma_ne 0 6 февраля, 2014 Опубликовано 6 февраля, 2014 · Жалоба Добрый день, всем! Проблема следующая: делаю Slave FIFO IN - OUT. Мастером служит Xilinx Spartan-6. Для Slave FIFO - IN все работает замечательно: данные из ПЛИСа успешно доходят до компьютера, но вот со Slave FIFO - OUT какие то проблемы. Флаги не устанавливаются и не меняют своего значения при попытке отправить данные с компьютера. Такое ощущение, что неправильно реализована сама программа кипариса. Есть ли у кого живой пример Slave FIFO - OUT для этого контроллера? Примеры с сайта кипариса уж очень сомнительные, в TRM последовательность инициализации прописана убого. Прошу помощи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 6 февраля, 2014 Опубликовано 6 февраля, 2014 · Жалоба неправильно реализована сама программа кипариса. Есть ли у кого живой пример 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 лежать и будет до второго пришествия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Roma_ne 0 11 февраля, 2014 Опубликовано 11 февраля, 2014 · Жалоба Извините за задержку с ответом: только сегодня смог попробовать ваш вариант решения проблемы. Сразу же скажу, что ваш текст не лишен недостатков: 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 0 11 февраля, 2014 Опубликовано 11 февраля, 2014 · Жалоба У меня FLAGD реально используется в схеме как I/O пин. Так что это не недостаток, это фича :) Внутри ПЛИС подключены FLAGA и FLAGB, для индикации, что что-то пришло по OUT, и что еще есть место для передачи по IN FLAGC никому не нужен, идет в ПЛИС, но не используется. Чтобы там TRM не говорил, этот мой код был выстрадан кучей экспериментов, и работает не в одной тысяче изделий именно в таком виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Roma_ne 0 11 февраля, 2014 Опубликовано 11 февраля, 2014 · Жалоба Не то чтобы я пытался атаковать с критикой, и конечно я не сомневаюсь в работоспособности вашего кода. И все таки у меня это не работает: мой пример кода приведен выше: может быть я не вижу чего-то очевидного. Идея работы кода такая: сначала я прогружаю кипарис приведенным выше кодом, далее через EP1 я конфигурирую ПЛИС (работает на ура), далее я хочу передать данные в ПЛИС и вот тут затык. Для примера сделаны все флаги фиксироваными и обозначающими EP2Empty, так вот флаги у меня находятся в разных положениях и не перещелкиваются при передаче данных через Control Center. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 11 февраля, 2014 Опубликовано 11 февраля, 2014 · Жалоба Может быть пригодится (я так понимаю, что Вы переключаете режим работы с 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться