关于读取设备描述符的函数

unsigned char get_descr_ex() { unsigned char descr_len; unsigned char *p=data_buf; endp7_mode=0x80;//unsigned char endp6_mode=0x80, endp7_mode=0x80;//同步标志位初值 toggle_send(); wr_usb_data(8,Request.Req_buf); //void issue_token( unsigned char endp_and_pid ) { /* 执行USB事务 */ //CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN ); //CH375_WR_DAT_PORT( endp_and_pid ); /* 高4位目的端点号, 低4位令牌PID */ //status=0xff;} //#define DEF_USB_PID_SETUP 0x0D USB的包标识PID, 主机方式可能用到 issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); //unsigned char wait_interrupt() { /* 主机端等待操作完成, 返回操作状态 */ //while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ //CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ //return( CH375_RD_DAT_PORT() );}

status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); } else return(0); issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */ { if(flag_config_2)descr_len=data_buf[2]-rd_usb_data(data_buf); else descr_len=data_buf[0]-rd_usb_data(data_buf); while(descr_len>0) { toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ descr_len-=rd_usb_data(p); else return(0); } } else return(0); endp7_mode=0xc0; toggle_send(); wr_usb_data(0,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ return(1); else return(0); } 为什么要进行两次DATA阶段操作

  因为控制传输端点0一次只能上传8个字节,大于8个字节的数据要分多次传输.


只有登录才能回复,可以选择微信账号登录