whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:1192回复:5

d12固件的一个小问题

楼主#
更多 发布于:2004-02-25 09:00
刚刚在看《PDIUSBD12固件编程与驱动开发》,里面有几个地方看不太懂,向各位高手请教!
1)在端点0的OUT中断程序里有这么一句:
....
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
  {  
     bEPPflags.bits.control_state=USB_IDEL;
     D12_SetEndpointStatus(0,1);
     D12_SetEndpointStatus(1,0);
   }
else
  {
     bEPPflags.bits.contorl_state=USB_RECEIVE;
   }
....
其中MAX_CONTROLDATA_SIZE=8;程序表明,当要传输的数据大于8时就会停掉端点(属于出错情况);这是当收到的是setup包的时候,但是再看看端点0的另外一种情况当收到的不是setup包的时候:
if(bEPPflags.bit.control_state==USB_RECEIVE)
{
   i=D12_ReadEndpoint(0,EP0_PACKET_SIZE, ControlData.dataBuffer+controldata.wCount);
   contorlData.wCount+=i;
}
在这里,一次却可以收到大于8的数,EP0_PACKET_SIZE等于16!即一次可以从端点0的缓冲区里读到16个字节的数据,这是不是程序有矛盾呀???

2)在D12_SmartBoard里,为什么它的固件里的端点1IN的程序里没有做数据的处理,只是清理了标志位?还有主端点in的程序里也没有数据的处理,难道smart――board里没用到这两个端点吗?


 
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-29 01:03
我没有smartboad的源代码。
不过可以这样讲,如果你只是传送小规模的数据(指小于等与缓冲区SIZE),除了请中断外,完全不用处理IN管道。因为USB是非对称协议,设备端对IN请求是被动的。但D12帮你做成了可以是主动的。
A strong man can save himself. A great man can save another.
zhangzhuoliang
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望42点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-26 23:21
我也想知道啊,特别是第2个问题!谁能回答啊!!
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-02-25 10:35
不是的
这是程序设计成这样的
为了使固件能在字节数正确的情况下再去判断是什么命令
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-25 10:01
我觉得不应该这么理解,ControlData.DeviceRequest.WLength中放的是在SETUP包后主机要发送或接收到多少个字节的数据,它这一个if语句就限制了主机在setup包后只能收到或接受8个字节的数据包,我是这么理解的,这是因为设备固件中接受数据的缓冲区只有MAX_CONTROLDATA_SIZE这么大!
#define MAX_CONTROLDATA_SIZE 8
typedef struct _control_xfer
{
DEVICE_REQUEST DeviceRequest;
unsigned short wLength;
unsigned short wCount;
unsigned char * pData;
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
} CONTROL_XFER;
但是当设备接受数据时,就是第二断程序,却一次可以读出EP0_PACKET_SIZE个字节,而EP0_PACKET_SIZE=16;
这就是我疑惑的地方,前面是只要接受的数据大于8就停掉端点,而后面却可以接受到大于16字节的数据(但用不上),因为前面的if语句在接收到的数据大于8时把端点停掉了!所以这是不是程序的逻辑问题,请教大家!
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-02-25 09:40
因为命令包就是8个字节,如果不是8个字节当然就判断不是命令了
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
游客

返回顶部