本帖最后由 kokoromi 于 2013-5-6 19:59 编辑
之前看 《圈圈教你玩USB》这本书,里面有段程序没看明白,大概是这样:
....
if(wLength > SendLength)
{
if(SendLength % DeviceDescriptor[7] == 0) //并且刚好是整数个数据包时
NeedZeroPacket = 1;//需要返回0长度数据包
}
else
{
SendLength = wLength;
}
//将数据通过EP0返回
UsbEp0SendData();
....
我现在很不明白的是,如果请求的长度(wLength)大于实际返回的数据长度(SendLength),并且返回的数据包长度是端点最大包长的整数倍时,需要返回0长度数据包,否则不返回0长度数据包,这个是什么原因?没明白。
也就是说,在端点最大包长为8字节的前提下,如果USB请求里要求要返回18字节数据,但是我要返回的数据只有12字节,那么只返回12字节的数据即可,但是如果我要返回的数据有16字节,或者8字节,那么就要在返回这些字节后再返回一个0长度数据包,这是为什么?
后来我在TI的官网上下载了MSP430F5529的USB例程,里面的程序也是这样,是USB协议规定的吗?为什么在请求长度大于实际返回长度并且实际返回长度还是端点最大包长整数倍时,就要额外返回0长度包?求真相~~~
|