Разбираюсь с CY7C68013A в режиме Slave FIFO. Данные принимает-передает ПЛИСка.
AN61345 курил, вроде все более-менее понятно.
Обмен данными провожу в USB Control Center.
BULK OUT в EP2 OUT работает нормально - т.е., с компа в ПЛИСку данные прилетают - я это вижу в SignalTap.
ПЛИСка в ответ отсылает те же данные: выставляет FIFOADDR=2 и записывает принятые данные в чип. Если теперь я выбираю BULK IN EP 0x86 и нажимаю Transfer Data In, то получаю ошибку: BULK IN transfer failed with Error Code:997.
Чип настроен конфигом из AN61345. Код:
Код
#include "fx2.h"
#include "fx2regs.h"
#include "fx2sdly.h"
void TD_Init( void )
{
CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operation, output CLKOUT
PINFLAGSAB = 0x08; // FLAGA - EP2EF
SYNCDELAY;
PINFLAGSCD = 0xE0; // FLAGD - EP6FF
SYNCDELAY;
PORTACFG |= 0x80;
SYNCDELAY;
IFCONFIG = 0xE3; //Internal clock, 48 MHz, Slave FIFO interface
SYNCDELAY;
EP2CFG = 0xA0; //out 512 bytes, 4x, bulk
SYNCDELAY;
EP6CFG = 0xE0; // in 512 bytes, 4x, bulk
SYNCDELAY;
SYNCDELAY;
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY; //
FIFORESET = 0x06; // reset, FIFO 6
SYNCDELAY; //
FIFORESET = 0x00; // deactivate NAK-ALL
SYNCDELAY; //
EP2FIFOCFG = 0x00; // AUTOOUT=0, WORDWIDE=1
SYNCDELAY; //
EP2FIFOCFG = 0x11; // AUTOOUT=1, WORDWIDE=1
SYNCDELAY; //
EP6FIFOCFG = 0x0D; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=1
SYNCDELAY;
OEA|=0x02; //Declare PA.1 as output
SYNCDELAY;
IOA|=0x02; //output 1 on PA.1
SYNCDELAY;
OEC|=0x01; //PC.0 as output (SYNC signal)
SYNCDELAY;
IOC|=0x00; //output 0 on PC.0...SYNC signal is LOW
SYNCDELAY;
OEC&=0xFD; //PC.1 as input (Clock changing signal)
SYNCDELAY;
}
void main(void)
{
TD_Init();
}
#include "fx2regs.h"
#include "fx2sdly.h"
void TD_Init( void )
{
CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operation, output CLKOUT
PINFLAGSAB = 0x08; // FLAGA - EP2EF
SYNCDELAY;
PINFLAGSCD = 0xE0; // FLAGD - EP6FF
SYNCDELAY;
PORTACFG |= 0x80;
SYNCDELAY;
IFCONFIG = 0xE3; //Internal clock, 48 MHz, Slave FIFO interface
SYNCDELAY;
EP2CFG = 0xA0; //out 512 bytes, 4x, bulk
SYNCDELAY;
EP6CFG = 0xE0; // in 512 bytes, 4x, bulk
SYNCDELAY;
SYNCDELAY;
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY; //
FIFORESET = 0x06; // reset, FIFO 6
SYNCDELAY; //
FIFORESET = 0x00; // deactivate NAK-ALL
SYNCDELAY; //
EP2FIFOCFG = 0x00; // AUTOOUT=0, WORDWIDE=1
SYNCDELAY; //
EP2FIFOCFG = 0x11; // AUTOOUT=1, WORDWIDE=1
SYNCDELAY; //
EP6FIFOCFG = 0x0D; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=1
SYNCDELAY;
OEA|=0x02; //Declare PA.1 as output
SYNCDELAY;
IOA|=0x02; //output 1 on PA.1
SYNCDELAY;
OEC|=0x01; //PC.0 as output (SYNC signal)
SYNCDELAY;
IOC|=0x00; //output 0 on PC.0...SYNC signal is LOW
SYNCDELAY;
OEC&=0xFD; //PC.1 as input (Clock changing signal)
SYNCDELAY;
}
void main(void)
{
TD_Init();
}
Также привожу снапшот времянки ПЛИС:
Нажмите для просмотра прикрепленного файла
Здесь меня смущает что не дергается FLAG_D.
И вдогонку еще один вопрос:
Судя по коду конфига, после загрузки прошивки в чип, я должен видеть там только 2 ендпоинта: EP2 OUT и EP6 IN. Однако, их там на самом деле больше:
Нажмите для просмотра прикрепленного файла
Такое ощущение, что прошивка либо не заливается (заливаю через Ppogram FX2->RAM, и он пишет что Programming succeded), либо я что-то не так делаю.
Выручайте - уж очень хочется запустить обмен...
Спасибо!