阅读:1222回复:3
bulk传输问题
void ISR_Ep2out(void) interrupt 0
{ if (!(EPIO[OUT2BUF_ID].cntrl & bmEPBUSY)) { count = EPIO[OUT2BUF_ID].bytes; } for (i = 0; i < count; i++) FIFO1_SRAM[i+1] = OUT2BUF; OUT2BC = 0; EZUSB_IRQ_CLEAR(); OUT07IRQ = bmEP2; } 请问:我设置的MaxPackageSize为64bytes 那么如果传输的大于64bytes的话,程序如何实现呢? FIFO1_SRAM是一个byte xdata 类型的有512大的数祖 上面的代码分析起应该只能存到前64个,然后被覆盖, 那位能解决一下?多谢! |
|
沙发#
发布于:2004-08-06 11:16
你是用开发板做的吧
那可以在线调试呀 跟踪一下不就一目了然了? :D |
|
板凳#
发布于:2004-08-06 11:01
呵呵,我知道这个意思,可能我说的不明白
比如我要送130bytes,那么显然需要3个packet,64+64+2。 然后送到我定义的FIFO1_SRAM去, 那么如果我再想用EP2IN读回来的话,我就有点糊涂了 我现在的代码是这样的: void ISR_Ep2in(void) interrupt 0 { int i; //receive the Test Results via USB from IC if( !(EPIO[IN2BUF_ID].cntrl & bmEPBUSY) ) { if (count_size <= 64 ) { for (i = 0; i < count_size; i++) { IN2BUF = FIFO1_SRAM[count_size-i]; } IN2BC = count_size; } else if (count_size > 64) { for (i = 0; i < 64; i++) { IN2BUF = FIFO1_SRAM[count_size-i]; } count_size = count_size - 64; IN2BC = 64; } } EZUSB_IRQ_CLEAR(); IN07IRQ = bmEP2; } void ISR_Ep2out(void) interrupt 0 { int i,j; int count; if (!(EPIO[OUT2BUF_ID].cntrl & bmEPBUSY)) { count = EPIO[OUT2BUF_ID].bytes; for (i = 0; i < count; i++) FIFO1_SRAM[i+1+count_size] = OUT2BUF; IN2BUF = FIFO1_SRAM[i+1+count_size] ; //IN2BUF = OUT2BUF; OUT2BC = 0; IN2BC = count; } count_size = count_size + count; EZUSB_IRQ_CLEAR(); OUT07IRQ = bmEP2; } 用开发板的bulk trans测试的话 结果如下: Write IOCTL passed// 发45个1 0000 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0010 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0020 01 01 01 01 01 01 01 01 01 01 01 01 01 Read IOCTL passed//收到45个1 0000 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0010 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0020 01 01 01 01 01 01 01 01 01 01 01 01 01 Write IOCTL passed// 再发67个2 0000 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0010 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0020 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0030 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0040 02 02 02 Read IOCTL passed//收到3个1??67-64=3 0000 01 01 01 Write IOCTL passed// 再发34个3 0000 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 0010 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 0020 03 03 Read IOCTL passed//收到34个2 0000 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0010 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0020 02 02 Write IOCTL passed// 再发130个4 0000 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0010 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0020 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0030 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0040 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0050 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0060 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0070 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0080 04 04 Read IOCTL passed 收到2个3 130-64-64=2 0000 03 03 什么原因呢? |
|
地板#
发布于:2004-08-06 09:38
呵呵,收到数据后要处理呀,难道你的设备只是为了收数据?
收数据后把这些数据转移,然后等待下一次,要不然你就对那段程序作一下处理,每次让缓冲区地址后移64。 |
|