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

[复制链接]
2933|9
 楼主| brotherwen 发表于 2007-12-26 15:31 | 显示全部楼层 |阅读模式
void&nbsp;USB_DataInStage&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;DWORD&nbsp;cnt;<br /><br />&nbsp;&nbsp;if&nbsp;(EP0Data.Count&nbsp;&gt&nbsp;USB_MAX_PACKET0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;USB_MAX_PACKET0;<br />&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;EP0Data.Count;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;cnt&nbsp;=&nbsp;USB_WriteEP(0x80,&nbsp;EP0Data.pData,&nbsp;cnt);<br />&nbsp;&nbsp;EP0Data.pData&nbsp;+=&nbsp;cnt;<br />&nbsp;&nbsp;EP0Data.Count&nbsp;-=&nbsp;cnt;<br />}<br />我感觉里面的if要改成while<br /><br />望大侠们指正!!
阿南 发表于 2007-12-26 17:30 | 显示全部楼层

楼主最好讲得详细些

  
平常人 发表于 2007-12-26 18:57 | 显示全部楼层

一次只能发一个数据包

首先,while语句中必须有影响循环条件的操作,但程序中没有,如果把&nbsp;if&nbsp;改成&nbsp;while&nbsp;不是变成死循环了吗!<br /><br />其次,一次只能发一个数据包,你用&nbsp;while&nbsp;搞成循环是什么目的?
 楼主| brotherwen 发表于 2007-12-27 09:18 | 显示全部楼层

补充说明下

对不起,我的描述有错<br />以上的函数我觉得应该为<br /><br />void&nbsp;USB_DataInStage&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;DWORD&nbsp;cnt;<br />&nbsp;&nbsp;do{<br />&nbsp;&nbsp;if&nbsp;(EP0Data.Count&nbsp;&gt&nbsp;USB_MAX_PACKET0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;USB_MAX_PACKET0;<br />&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;EP0Data.Count;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;cnt&nbsp;=&nbsp;USB_WriteEP(0x80,&nbsp;EP0Data.pData,&nbsp;cnt);<br />&nbsp;&nbsp;EP0Data.pData&nbsp;+=&nbsp;cnt;<br />&nbsp;&nbsp;EP0Data.Count&nbsp;-=&nbsp;cnt;}while(EP0Data.Count&nbsp;&gt&nbsp;USB_MAX_PACKET0);<br />&nbsp;&nbsp;pUDP-&gtUDP_CSR[EPNum]&nbsp;|=&nbsp;AT91C_UDP_TXPKTRDY;<br /><br />}<br /><br />DWORD&nbsp;USB_WriteEP&nbsp;(DWORD&nbsp;EPNum,&nbsp;BYTE&nbsp;*pData,&nbsp;DWORD&nbsp;cnt)&nbsp;{<br />&nbsp;&nbsp;DWORD&nbsp;n;<br /><br />&nbsp;&nbsp;EPNum&nbsp;&=&nbsp;0x0F;<br />&nbsp;&nbsp;if&nbsp;(pUDP-&gtUDP_CSR[EPNum]&nbsp;&&nbsp;AT91C_UDP_TXPKTRDY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((DualBankEP&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;EPNum))&nbsp;&&&nbsp;(TxDataBank[EPNum]&nbsp;==&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TxDataBank[EPNum]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;for&nbsp;(n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt&nbsp;cnt;&nbsp;n++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;pUDP-&gtUDP_FDR[EPNum]&nbsp;=&nbsp;*pData++;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;//pUDP-&gtUDP_CSR[EPNum]&nbsp;|=&nbsp;AT91C_UDP_TXPKTRDY;<br /><br />&nbsp;&nbsp;return&nbsp;(cnt);<br />}<br />不然有点担心:只发了USB_MAX_PACKET0个字节,后面没有到这个地方来,EP0Data内容乱了,岂不是丢了,由于初涉USB目前还没去书店买书看,不到之处,望大侠们见谅
 楼主| brotherwen 发表于 2007-12-27 10:38 | 显示全部楼层

补充

在USBDESC.H文件中有一行是<br />#define&nbsp;WBVAL(x)&nbsp;(x&nbsp;&&nbsp;0xFF),((x&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF)<br />不知道干什么的,我觉得,号是不是要表示这种&nbsp;&nbsp;|&nbsp;&nbsp;号啊!<br />
 楼主| brotherwen 发表于 2007-12-27 14:53 | 显示全部楼层

又一疑问

case&nbsp;USB_EVT_IN_STALL:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_ClrStallEP(0x80);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;USB_EVT_OUT_STALL:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB_ClrStallEP(0x00);<br /><br />void&nbsp;USB_ClrStallEP&nbsp;(DWORD&nbsp;EPNum)&nbsp;{<br />&nbsp;&nbsp;pUDP-&gtUDP_CSR[EPNum&nbsp;&&nbsp;0x0F]&nbsp;&=&nbsp;~AT91C_UDP_FORCESTALL;<br />}<br />上面两个case&nbsp;有区别吗
阿南 发表于 2007-12-27 19:25 | 显示全部楼层

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

  
 楼主| brotherwen 发表于 2007-12-28 09:46 | 显示全部楼层

呵呵,惊动了南哥啊

但是函数内部执行是一样的啊!<br />#define&nbsp;WBVAL(x)&nbsp;(x&nbsp;&&nbsp;0xFF),((x&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF)<br />这个主要干什么用的啊
阿南 发表于 2007-12-28 20:33 | 显示全部楼层

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

是一个宏定义,在函数中WBVAL(x)就等同于调用(x&nbsp;&&nbsp;0xFF),((x&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF),其中x是参数,你可以将x代进去计算结果
 楼主| brotherwen 发表于 2007-12-29 08:46 | 显示全部楼层

谢谢南哥

&nbsp;#define&nbsp;WBVAL(x)&nbsp;(x&nbsp;&&nbsp;0xFF),((x&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF)<br />这一句我弄清楚了,原来它和书上所说的逗号表达式有很大的区别,可能是嵌入式方面有所不同吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

217

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部