本帖最后由 felixzdx 于 2013-2-5 21:42 编辑
初始化代码:
void initUSB(void)
{
CKCON = (CKCON&(~bmSTRETCH)) | 6;
//REVCTL |= 0x03; //disable auto-arm of endpoints when AUTOOUT transfers from 0 to 1
IFCONFIG = 0x03; //0x03 syn/external clk 40mhz
//IFCONFIG = 0x83; //0x83 syn/internal clk 30mhz
EP2FIFOCFG = 0x00;//autoout=0
EP6FIFOCFG = 0x04;//autoin=0
EP2CFG = 0xA0;
EP6CFG = 0xE0;
EP1OUTCFG = 0x20;
EP1INCFG = 0x20;
EP4CFG = 0x20;
EP8CFG = 0x20;
PINFLAGSAB = 0xE8 ; //ep2ef ep6ff fixed
EP6AUTOINLENH = 0x02;
EP6AUTOINLENL = 0x00;
FIFORESET = 0x80;
FIFORESET = 0x02;
FIFORESET = 0x06;
FIFORESET = 0x00;
EP2BCL = 0x80;
EP2BCL = 0x80;
EP2BCL = 0x80;
EP2BCL = 0x80;
CKCON = (CKCON&(~bmSTRETCH)) |0;
}
初始化 EP2 OUT 4*512 ,EP6 IN 4*512,Slave Fifo 模式,非自动传输模式。
EP6 接受Slave fifo的数据(FPGA通过slave fifo传输数据到EP6 fifo中)转发到host,
手动传输示意代码如下:
while(reqSectorCnt)//host请求的sector(512b)数
{
while(EP6FIFO标志寄存器S . EMPTY);//EP6 Slave Fifo 空 ,等待
SYSDELAY;
EP6BCH = 0X02;
SYSDELAY;
EP6BCL = 0X00;//Commit Data to host
reqSectorCnt--;
}
出现的问题:
1. 初始化时,//REVCTL |= 0x03;此句代码加入,FW就无法接受上位机传输的数据包
2. 如果上位机请求一个 sector (512B)则不会出错,如果请求超出一个sector则返回的数据不对,且可以对
EP6无限次请求, while(EP6FIFO标志寄存器S . EMPTY);//EP6 Slave Fifo 空 ,等待
语句判断不起作用。
3. 提交数据(EP6BCL = 0X00), 不改变EP6FIFO标志寄存器S的状态吗??
4. 提交后,usbcore ACK后,提交的 当前的 fifo(512b)是否变为空??即 slave fifo 域可以使用此FIFO
采用自动模式:
示意代码如下:
EP6AutoTransfer()
{
//1. 转为自动模式
REVCTL = 0x03;
SYSDELAY;
EP6FIFOCFG = bmZEROLENIN;
SYSDELAY;
EP6FIFOCFG = bmZEROLENIN | bmAutoIn;
SYSDELAY;
//2. 启动FPGA数据传输
PA0=1;
SYSDELAY;
//3. 等待数据传输完毕
while(!PA1);
//5. 转化为手动模式
REVCTL = 0x00;
SYSDELAY;
EP6FIFOCFG = bmZEROLENIN;
SYSDELAY;
}
在此模式下, 存在的问题是:
1. 数据传输有时可以完成,有时出现USB总线异常,为什么产生此现象??配置不要对还是操作流程不对??
请高手为我解惑,3Q!
|