求教大侠们。我本意是使用68013的slave fifo进行数据传输,外部的数据送直接通过68013送到PC机,但是PC机发送的命令送到68013之后,再转换成用串口发送到外部控制芯片。但是现在发现如果设置REVCTL.0和REVCTL.1为1,那么只能从PC机发送两次命令,第三次开始就总是提示Bulk OUT failed。如果不设置REVCTL.0和REVCTL.1为1,那么可以正常发送数据。这是为什么,急求原因,感激不尽。
void TD_Init(void) // Called once at startup
{
CPUCS = 0x12; //设置CPU时钟
FX2LPSerial_Init();
IFCONFIG = 0xCB; // bit7: IFCLKSRC=1 , FIFO使用内部时钟
// bit6: xMHz=1 , 48MHz 内部时钟
// bit5: IFCLKOE=0 , 不设置IFCLK引脚为48MHz
// bit4: IFCLKPOL=0 , IFCLK引脚不取反
// bit3: ASYNC=1 , 主机异步读取数据
// bit2: GSTATE=0 , 不把GPIF状态送到PORTE[2:0]
// bit[1:0]: IFCFG[1:0]=11, FX2 in slave FIFO mode
SYNCDELAY;
REVCTL = 0x03; // 必须设置REVCTL.0和REVCTL.1为1,芯片规定
EP6CFG = 0xE2; // 配置EP6为输入端点,块传输,双缓冲512字节FIFO(与默认配置相同)
SYNCDELAY;
EP4CFG = 0xA0;
SYNCDELAY;
EP2CFG = 0xA2;
SYNCDELAY;
EP8CFG = 0xE0;
SYNCDELAY;
FIFORESET = 0x80; // 重设全部 FIFOs
SYNCDELAY;
FIFORESET = 0x02; // 重设端点2的FIFO
SYNCDELAY;
FIFORESET = 0x04; // 重设端点4的FIFO
SYNCDELAY;
FIFORESET = 0x06; // 重设端点6的FIFO
SYNCDELAY;
FIFORESET = 0x08; // 重设端点8的FIFO
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
OUTPKTEND = 0x82;
SYNCDELAY;
OUTPKTEND = 0x82;
SYNCDELAY;
EP6FIFOCFG = 0x0D; // 设置自动发送IN数据包,能发送0长度数据包
// 数据接口为16bits
EP2FIFOCFG = 0x00;
SYNCDELAY;
PINFLAGSAB = 0x00; // 配置FLAGA为prog-level flag,判别由FIFOADR[1:0]指向的FIFO
SYNCDELAY; // 配置FLAGB满标志,判别由FIFOADR[1:0]指向的FIFO
PINFLAGSCD = 0x00; // 配置FLAGC空标志,判别由FIFOADR[1:0]指向的FIFO
SYNCDELAY; // FLAGD一般不使用
FIFOPINPOLAR = 0x04; // 配置SLWR为高电平有效
SYNCDELAY;
EP6AUTOINLENH = 0x02; // 配置自动传送的数据包大小,高字节,对Bulk,小于512
SYNCDELAY;
EP6AUTOINLENL = 0x00; // 配置自动传送的数据包大小,低字节,对Bulk,小于512
SYNCDELAY;
EP2BCL = 0x80; // arm EP2OUT by writing byte count w/skip.
SYNCDELAY;
EP2BCL = 0x80;
Rwuen=TRUE;
}
void TD_Poll(void) // Called repeatedly while the device is idle
{
char order;
if(!(EP2468STAT & bmEP2EMPTY))
{
APTR1H = MSB( &EP2FIFOBUF );
APTR1L = LSB( &EP2FIFOBUF );
order = EXTAUTODAT1 ;
FX2LPSerial_XmitChar(order);
EP2BCL = 0x80; // re(arm) EP2OUT
EP2BCL = 0x80; // re(arm) EP2OUT
FX2LPSerial_XmitChar('c');
}
}
|