书接上回
任务调度之轮询函数:TD_Poll()
void TD_Poll(void) // Called repeatedly while the device is idle
{
WORD i;
WORD count;
if(!(EP2468STAT & bmEP2EMPTY))
{ //检查寄存器EP2468STAT中的EP2 EMPTY(busy)位
if(!(EP2468STAT & bmEP6FULL))
{ //检查寄存器EP2468STAT中的EP6 EMPTY(busy)位
APTR1H = MSB( &EP2FIFOBUF );
APTR1L = LSB( &EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF );
AUTOPTRL2 = LSB( &EP6FIFOBUF );
count = (EP2BCH << 8) + EP2BCL;
//循环将EP2OUT中的数据发送到EP6IN中
for( i = 0x0000; i < count; i++ )
{
//使用AUTOPOINTER(s)
EXTAUTODAT2 = EXTAUTODAT1;
}
EP6BCH = EP2BCH;
SYNCDELAY;
EP6BCL = EP2BCL; //启动EP6IN
SYNCDELAY;
EP2BCL = 0x80; //重新启动EP2OUT
}
}
if(!(EP2468STAT & bmEP4EMPTY))
{ //检查寄存器EP2468STAT中的EP4 EMPTY(busy)位
if(!(EP2468STAT & bmEP8FULL))
{ //检查寄存器EP2468STAT中的EP8 EMPTY(busy)位
APTR1H = MSB( &EP4FIFOBUF );
APTR1L = LSB( &EP4FIFOBUF );
AUTOPTRH2 = MSB( &EP8FIFOBUF );
AUTOPTRL2 = LSB( &EP8FIFOBUF );
count = (EP4BCH << 8) + EP4BCL;
//循环将EP4OUT中的数据发送到EP8IN中
for( i = 0x0000; i < count; i++ )
{
//使用AUTOPOINTER(s)
EXTAUTODAT2 = EXTAUTODAT1;
}
EP8BCH = EP4BCH;
SYNCDELAY;
EP8BCL = EP4BCL; //启动EP8IN
SYNCDELAY;
EP4BCL = 0x80; //重新启动EP4OUT
}
}
}
1、如果EP2OUT中有数据,且EP6IN还有未使用的空间:
if(!(EP2468STAT & bmEP2EMPTY))
{ //检查寄存器EP2468STAT中的EP2 EMPTY(busy)位
if(!(EP2468STAT & bmEP6FULL))
{ //检查寄存器EP2468STAT中的EP6 EMPTY(busy)位
2、将EP2FIFOBUF的地址传给AUTOPTRH1:AUTOPTRL1,将EP6FIFOBUF的地址传给AUTOPTRH2:AUTOPTRL2
APTR1H = MSB( &EP2FIFOBUF );
APTR1L = LSB( &EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF );
AUTOPTRL2 = LSB( &EP6FIFOBUF );
3、将EP2的maximum buffer sizes传给变量count(128)
count = (EP2BCH << 8) + EP2BCL;
我推测一下,这里的maximum buffer sizes应该是分割数据包后的最大传输的字节数,为了防止数据包的传输长时间的占用CPU:
4、循环将EP2OUT中的数据发送到EP6IN中
//循环将EP2OUT中的数据发送到EP6IN中
for( i = 0x0000; i < count; i++ )
{
//使用AUTOPOINTER(s)
EXTAUTODAT2 = EXTAUTODAT1;
}
#define EXTAUTODAT1 XAUTODAT1
#define EXTAUTODAT2 XAUTODAT2
EXTERN xdata volatile BYTE XAUTODAT1 _AT_ 0xE67B; // Autoptr1 MOVX access
EXTERN xdata volatile BYTE XAUTODAT2 _AT_ 0xE67C; // Autoptr2 MOVX access
5、启动EP6IN,重新启动EP2OUT
EP6BCH = EP2BCH;
SYNCDELAY;
EP6BCL = EP2BCL; //启动EP6IN
SYNCDELAY;
EP2BCL = 0x80; //重新启动EP2OUT
为什么这么做就是启动他们了呢?
对EP4OUT和EP8IN的处理,与上面所述雷同,不再赘述。