打印

USB_DataInStage函数好像有问题,不知道是否??

[复制链接]
1951|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
brotherwen|  楼主 | 2007-12-26 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
阿南| | 2007-12-26 17:30 | 只看该作者

楼主最好讲得详细些

使用特权

评论回复
板凳
平常人| | 2007-12-26 18:57 | 只看该作者

一次只能发一个数据包

首先,while语句中必须有影响循环条件的操作,但程序中没有,如果把 if 改成 while 不是变成死循环了吗!

其次,一次只能发一个数据包,你用 while 搞成循环是什么目的?

使用特权

评论回复
地板
brotherwen|  楼主 | 2007-12-27 09:18 | 只看该作者

补充说明下

对不起,我的描述有错
以上的函数我觉得应该为

void USB_DataInStage (void) {
  DWORD cnt;
  do{
  if (EP0Data.Count > USB_MAX_PACKET0) {
    cnt = USB_MAX_PACKET0;
  } else {
    cnt = EP0Data.Count;
  }
  cnt = USB_WriteEP(0x80, EP0Data.pData, cnt);
  EP0Data.pData += cnt;
  EP0Data.Count -= cnt;}while(EP0Data.Count > USB_MAX_PACKET0);
  pUDP->UDP_CSR[EPNum] |= AT91C_UDP_TXPKTRDY;

}

DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
  DWORD n;

  EPNum &= 0x0F;
  if (pUDP->UDP_CSR[EPNum] & AT91C_UDP_TXPKTRDY) {
    if ((DualBankEP & (1 << EPNum)) && (TxDataBank[EPNum] == 0)) {
      TxDataBank[EPNum] = 1;
    } else {
      return (0);
    }
  }
  for (n = 0; n < cnt; n++) {
    pUDP->UDP_FDR[EPNum] = *pData++;
  }
  //pUDP->UDP_CSR[EPNum] |= AT91C_UDP_TXPKTRDY;

  return (cnt);
}
不然有点担心:只发了USB_MAX_PACKET0个字节,后面没有到这个地方来,EP0Data内容乱了,岂不是丢了,由于初涉USB目前还没去书店买书看,不到之处,望大侠们见谅

使用特权

评论回复
5
brotherwen|  楼主 | 2007-12-27 10:38 | 只看该作者

补充

在USBDESC.H文件中有一行是
#define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)
不知道干什么的,我觉得,号是不是要表示这种  |  号啊!

使用特权

评论回复
6
brotherwen|  楼主 | 2007-12-27 14:53 | 只看该作者

又一疑问

case USB_EVT_IN_STALL:
      USB_ClrStallEP(0x80);
      break;

    case USB_EVT_OUT_STALL:
      USB_ClrStallEP(0x00);

void USB_ClrStallEP (DWORD EPNum) {
  pUDP->UDP_CSR[EPNum & 0x0F] &= ~AT91C_UDP_FORCESTALL;
}
上面两个case 有区别吗

使用特权

评论回复
7
阿南| | 2007-12-27 19:25 | 只看该作者

哈哈,当然有区别.两个调用函数的参数不一样啊

使用特权

评论回复
8
brotherwen|  楼主 | 2007-12-28 09:46 | 只看该作者

呵呵,惊动了南哥啊

但是函数内部执行是一样的啊!
#define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)
这个主要干什么用的啊

使用特权

评论回复
9
阿南| | 2007-12-28 20:33 | 只看该作者

#define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)

是一个宏定义,在函数中WBVAL(x)就等同于调用(x & 0xFF),((x >> 8) & 0xFF),其中x是参数,你可以将x代进去计算结果

使用特权

评论回复
10
brotherwen|  楼主 | 2007-12-29 08:46 | 只看该作者

谢谢南哥

 #define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)
这一句我弄清楚了,原来它和书上所说的逗号表达式有很大的区别,可能是嵌入式方面有所不同吧.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

217

帖子

0

粉丝