only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1005回复:5

谁能看懂这几行程序?

楼主#
更多 发布于:2003-11-06 08:22
;----------------------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]
playboysun
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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
}
playboysun
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-06 15:35
是USB标准设备请求中的Get Status,希望能给帮上你的忙了!
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-06 15:57
谢谢你,只不过这些程序我有的,看来我应该学C了。
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-07 08:46
用来确定是那一个endpoint .因为你的endpoint 是输入输出间隔排列的,因此要 RL A,再根据输入输出是否 add a,#01h. 大概就是这样的。
mailxufeng
驱动牛犊
驱动牛犊
  • 注册日期2003-10-15
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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表示缓冲区已满)
游客

返回顶部