bulkloop例程:
数据从EP2OUT->EP6IN ,从端点2 out缓冲区到端点6的in缓冲区。数据流向为:
1)PC端(console软件)设定要传输的数据
2)PC端发起端点2out传输,数据到达68013端点2的out缓冲区
3)bulkloop固件查询到端点2的out缓冲区有数据,于是将数据发往端点6的IN缓冲区
4)PC端发起端点6 IN传输,于是68013的端点6 IN缓冲区中的数据被读到PC机显示
数据从EP4OUT->EP8IN一样。。。
我现在将FLAGB/C用来指示端点6的空状态和端点8的空状态,PINFLAGAB和PINFLAGCD设置正确,
FLAGB/C通过CPLD直接连接到开发板的两个LED灯上。把CPLD程序下到板子上,bulkloop固件程序下进去后,在console面板选端点2OUT,点击bulk tran按钮,LED1由灭变亮指示(端点6)非空,然后选端点6IN,点bulk tran按钮,LED1会灭指示端点6空。同样,4OUT端点和8IN端点测试也正确。
我的问题是:
1)现在我对PINFLAGAB和PINFLAGCD重新赋值,让它们分别取指示端点2OUT和4OUT的空状态,同样FLAGB/C通过CPLD直接连接到开发板的两个LED灯上。把CPLD程序下到板子上,bulkloop固件程序下进去后,在console面板选端点2OUT,点击bulk tran按钮,LED1不变指示(端点2)空,然后选端点6IN,点bulk tran按钮,LED1不变指示端点2仍未空。(端点4和8的一样)
在console面板选端点2OUT,点击bulk tran按钮,也就是PC端发起端点2out传输,数据到达68013端点2的out缓冲区,为什么端点2FIFO一直都为空??
下面是TD_POLL()部分代码:
if(!(EP2468STAT & bmEP2EMPTY))
{ // check EP2 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is empty
if(!(EP2468STAT & bmEP6FULL))
{ // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
首先,查询端点2的EMPTY标志,如果不为1,说明有数据,然后查询端点6的FULL标志,如果不为1,说明端点6 FIFO为空,可以接收数据。至于bmEP2EMPTY,bmEP6FULL,自行go to definition...
当检查到端点2 out fifo有数据且端点6 in fifo为空时,就可以将ep2的数据"copy"到ep6.使用自动指针直接更换2者的指针,实现数据传送:
APTR1H = MSB( &EP2FIFOBUF ); //取端点2 FIFO指针
APTR1L = LSB( &EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF ); //取端点6 fifo指针
AUTOPTRL2 = LSB( &EP6FIFOBUF );
count = (EP2BCH << 8) + EP2BCL; //计数器
// loop EP2OUT buffer data to EP6IN
for( i = 0x0000; i < count; i++ ) //传送count字节
{
// setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)
EXTAUTODAT2 = EXTAUTODAT1; //APTR1指针赋给APTR2,实现数据传送
}
完毕后,重置计数器,以进行下次传输:
EP6BCH = EP2BCH;
SYNCDELAY;
EP6BCL = EP2BCL; // arm EP6IN
SYNCDELAY;
EP2BCL = 0x80; // re(arm) EP2OUT
}
我尝试将这部分代码注释掉了(也就是TD_POLL()里面是空的),但是在console面板选端点2OUT,点击bulk tran按钮,LED1灯仍然指示端点2 fifo为空,难道主机发送的数据没有达到端点2 OUT么?没到2OUT端点FIFO,那固件又是如何将主机发送的数据从端点2OUT缓冲区到达端点6IN缓冲区的呢?
请达人指导!
|