68013A与FPGA连接,工作在slavefifo模式,EP2配置为512的bulk_out,manuout模式,
我按照技术手册上的说明,在TD_Poll()里面把EP2BCH 和EP2BCL 改成0x00 0x08(就是不想要那么多字节的数 据,只要8个),
为什么从PC发送512的数据后,FIFO的数据标志引脚FLAGA B C D没有任何变化,而且FPGA也读不到数据??
但是把EP2BCH 和EP2BCL 改成0x02 0x00,FPGA就完全可以正常读取512字节的数据且标志信号引脚正常。
我看技术手册里面都可以把BCL赋值0x01的,有木有哪位能指点一下啊!?想不明白了,,,,谢谢!!!
另:如果说是芯片本身不支持这个,请问有没有别的能传输少量字节的办法?
下面是代码:
void TD_Poll(void) // USB空闲的时候循环调用
{
if( !( EP2468STAT & 0x01 ))
{
SYNCDELAY; //
FIFORESET = 0x80; // nak all OUT pkts. from host
SYNCDELAY; //
//EP2FIFOBUF[0] = 0xA0; // create newly sourced pkt. data
//SYNCDELAY; //
EP2FIFOBUF[1] = EP2BCH; // create newly sourced pkt. data
SYNCDELAY; //
EP2FIFOBUF[2] = EP2BCL; // create newly sourced pkt. data
SYNCDELAY; //
EP2FIFOBUF[3] = EP2FIFOBUF[0]+3; // create newly sourced pkt. data
SYNCDELAY;
EP2FIFOBUF[4] = EP2FIFOBUF[0]+4; // create newly sourced pkt. data
SYNCDELAY; //
EP2FIFOBUF[5] = EP2FIFOBUF[0]+5; // create newly sourced pkt. data
SYNCDELAY; //
EP2FIFOBUF[6] = EP2FIFOBUF[0]+6; // create newly sourced pkt. data
SYNCDELAY; //
EP2FIFOBUF[7] = EP2FIFOBUF[0]+7; // create newly sourced pkt. data
SYNCDELAY;
SYNCDELAY;
EP2BCH = 0x02;
SYNCDELAY; // 就是这里有问题,字节计数器如果不复制512就死活不行!!!
EP2BCL = 0x00; // commit newly sourced pkt. to interface fifo
SYNCDELAY;
FIFORESET = 0x00; // release "nak all"
SYNCDELAY;
OUTPKTEND =0x82; //skip uncommitted pkt.(the second pkt.)
}
}
初始化程序:
void TD_Init(void) // 初始化程序段
{
/*SYS------------------------SYS*/
CPUCS = 0x12; //48MHZ CLKOUT ENALBE 使用48M晶振
IFCONFIG =0xCB;//使用内部时钟 48M 异步
SYNCDELAY; //同步延时
REVCTL = 0x03; //置REVCTL.0=1,REVCTL.1=1
SYNCDELAY;
PINFLAGSAB = 0x00;
SYNCDELAY;
PINFLAGSCD = 0x00;
SYNCDELAY;
PORTACFG = 0x00; // SLCS, set alt. func. of PA7 pin PA7引脚作为普通的I/O口
SYNCDELAY;
FIFOPINPOLAR = 0x00; // all signals active low,所有接口引脚为低电平有效
SYNCDELAY;
/*SYS------------------------SYS*/
/*EP8------------------------EP8*/
EP8CFG = 0xE1; //设置8端点为批量传输模式,输入端点
SYNCDELAY;
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions 复位FIFO
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x08; // reset, FIFO 8
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
EP8FIFOCFG = 0x09; // AUTOIN=1, ZEROLENIN=0, WORDWIDE=1
SYNCDELAY;
EP8AUTOINLENH = 0x00; //EZ_USB自动处理8字节的数据包
SYNCDELAY;
EP8AUTOINLENL = 0x08;
SYNCDELAY;
/*EP8------------------------EP8*/
/*EP2------------------------EP2*/
EP2CFG = 0xA2; //EP2 BULK 512B 双缓冲
SYNCDELAY;
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions 复位FIFO
SYNCDELAY; //
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
EP2FIFOCFG = 0x01;//0x11; // AUTOOUT=0, ZEROLENIN=0, WORDWIDE=1
SYNCDELAY; // deactivate NAK-ALL
OUTPKTEND =0x82; //启动EP2的OUT缓冲区 1
SYNCDELAY;
OUTPKTEND =0x82; //启动EP2的OUT缓冲区 2
SYNCDELAY;
/*EP2------------------------EP2*/
/*EP4------------------------EP4*/
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions 复位FIFO
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x04; // reset, FIFO 4
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
/*EP4------------------------EP4*/
/*EP6------------------------EP6*/
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions 复位FIFO
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x06; // reset, FIFO 6
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
/*EP6------------------------EP6*/
Rwuen = TRUE;
}
|