阅读:1006回复:5
谁能看懂这几行程序?
;----------------------get status 读取端点状态????
GETS_J2: CJNE A, #02H, GETS_J3 MOV A, USB_INDEX ; ENDPOINT,从INDEX中获知端点号 ANL A, #03H ;返回两字节,只有位0定义:若为1,表示HALT状态。 RL A ;为什么RL A???????? PUSH ACC MOV A, USB_INDEX ;看INDEX得最高位,???????? ANL A, #80H JZ GETS_J3A POP ACC ADD A, #01H PUSH ACC GETS_J3A: POP ACC LCALL SELECT_POINT ;选通EP0,IN MOV USB_WRDAT+1, #00H JNB ACC.1, GETS_J3B MOV USB_WRDAT+1, #01H 疑问如上,特别是为什么RL A???????? [编辑 - 11/6/03 by only8008] |
|
沙发#
发布于:2003-11-06 15:30
不用看那个了,给你个函数好了
void get_status(void) { unsigned char endp, txdat[2]; unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT; unsigned char c; if (bRecipient == USB_RECIPIENT_DEVICE) { //返回设备状态 if(bEPPflags.bits.remote_wakeup == 1) txdat[0] = 3; //支持远程唤醒、自供电 else txdat[0] = 1; txdat[1]=0; single_transmit(txdat, 2); //发送数据 } else if (bRecipient == USB_RECIPIENT_INTERFACE) { //返回接口状态 txdat[0]=0; txdat[1]=0; single_transmit(txdat, 2); //发送数据 } else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //返回端点状态 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) c = D12_SelectEndpoint(endp*2 + 1); //读取输入端点状态 /* Control-in */ else c = D12_SelectEndpoint(endp*2); //读取输出端点状态 /* Control-out */ if(c & D12_STALL) txdat[0] = 1; //端点禁止 else txdat[0] = 0; //端点有效 txdat[1] = 0; single_transmit(txdat, 2); //发送数据 } else stall_ep0(); //非标准请求,发STALL } |
|
板凳#
发布于:2003-11-06 15:35
是USB标准设备请求中的Get Status,希望能给帮上你的忙了!
|
|
地板#
发布于:2003-11-06 15:57
谢谢你,只不过这些程序我有的,看来我应该学C了。
|
|
地下室#
发布于:2003-11-07 08:46
用来确定是那一个endpoint .因为你的endpoint 是输入输出间隔排列的,因此要 RL A,再根据输入输出是否 add a,#01h. 大概就是这样的。
|
|
5楼#
发布于:2003-11-07 09:45
其实挺简单,应该是这个意思:
USB_INDEX来自于主机,其中的数据定义应该是这样的 最高位D7表示方向,为“1”表示下一个数据包是从端点到主机,为“0”则表示从主机到端点,D6―D0位表示端点号,即0―3,注意这不是端点索引号,比如端点号1对应的端点索引号应该是2(out)和3(in),所以端点索引号的计算公式是 = 端点号 * 2 + (1),加不加1取决于in还是out,现在你该知道那2条语句什么意思了吧。 RL A就是使端点号 * 2 ANL A,#80H就是为了判断放向,决定后面是否+1 而取得端点号以后就应该是选择端点,即LCALL SELECT_POINT 最后取得端点状态信息(D1为1表示停止,D0为1表示缓冲区已满) |
|