阅读:1248回复:5
WORDSWAP
请教各位大侠,
CYPRESS例程中有几个地方有WORDSWAP, 请问为什么? 采用51单片机必须这样吗? 为什么我枚举时读出的值不对? |
|
沙发#
发布于:2004-07-29 23:22
那是因为你芯片的endian和USB规范里面的endian不一样,需要转换一下。 USB规范里的所有Descriptor等都是Little Endian的, 而51的许多编辑器采用的是Big Endian的,如Keil C. Keil C51的程序需要对Word/DWord进行Swap, 而little endian的控制芯片如ARM就不必Swap. :) |
|
板凳#
发布于:2004-07-30 08:37
谢谢,opencore,我改动一下试试!
我不解的是,例程中并非所有的WORD都SWAP了! 的确,我的编译器是KEIL C,我修改程序再试试! 非常感谢你的回复! |
|
地板#
发布于:2004-07-30 09:09
Cypress源程序里有几个Word的,wIndex,wValue,wLength.
由于wIndex的高8位是Reserved to 0的,所以不需要Swap, 但还是因为endian不一样,需要右移一下 dReq.wIndex>>8才可取得所需值 而wValue根据不同的request定义不一样,但也只是用到了 其中的一部分位,没必要Swap后再使用, 所以源程序里面直接通过位操作来实现了,没有Swap. ^_^ |
|
地下室#
发布于:2004-07-30 10:31
OpenCore,请问下面这段例程的意思,好像看不太懂:
epLen = 0; for (i=1; i<=uDev[usbaddr].bNumOfEPs; i++) // For each data endpoint { pEnp = (pEPDesc)(DBUF + 9 + 9 + epLen); uDev[usbaddr].bEPAddr = pEnp->bEPAdd; uDev[usbaddr].bAttr = pEnp->bAttr uDev[usbaddr].wPayLoad = pEnp->wPayLoad; uDev[usbaddr].bInterval = pEnp->bInterval uDev[usbaddr].bData1 = 0; epLen += 7; } 其中+9,和+7不清楚? |
|
5楼#
发布于:2004-07-30 20:08
2个 +9 大概是因为Interface Descriptor和Configure Descriptor 的结构体都是9个字节。
+7则是因为Endpoint Descriptor的结构体是7个字节。 [编辑 - 7/30/04 by OpenCore] |
|