Ng_MicHeAl
驱动牛犊
驱动牛犊
  • 注册日期2004-06-15
  • 最后登录2006-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1221回复:3

bulk传输问题

楼主#
更多 发布于:2004-08-05 17:19
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个,然后被覆盖,
那位能解决一下?多谢!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-06 09:38
呵呵,收到数据后要处理呀,难道你的设备只是为了收数据?
收数据后把这些数据转移,然后等待下一次,要不然你就对那段程序作一下处理,每次让缓冲区地址后移64。
Ng_MicHeAl
驱动牛犊
驱动牛犊
  • 注册日期2004-06-15
  • 最后登录2006-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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

什么原因呢?

jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-06 11:16
你是用开发板做的吧
那可以在线调试呀
跟踪一下不就一目了然了? :D
游客

返回顶部