最近在做STM32扫码枪的东西,用的是CH376,读取U盘、鼠标都没问题,现在连上扫码枪获取不到设备描述符,但是配置描述符能获取,而且Set idle success Set idle success,不知道哪里出了问题。还有扫码枪扫到的数据应该怎样读取?
",现在连上扫码枪获取不到设备描述符",试下把设置地址、总线复位删掉,能否获取?扫码枪的数据按照类似键盘的方式获取,对扫码枪上传中断端点不断发IN包。
",现在连上扫码枪获取不到设备描述符",试下把设置地址、总线复位删掉,能否获取?扫码枪的数据按照类似键盘的方式获取,对扫码枪上传中断端点不断发IN包。
设置地址是在获取设备描述符之后,应该不影响。注掉复位后连配置描述符也获取不到了
“获取不到设备描述符”返回什么值?获取描述符使用的控制传输命令还是GET_DESCR(0X46)命令?
“获取不到设备描述符”返回什么值?获取描述符使用的控制传输命令还是GET_DESCR(0X46)命令?
uint8_t Get_Dev_Descr(void)
{
uint8_t descr_len;
uint8_t *p = data_buf;
send_mode = 0x00;
WR_USB_DATA(8,(void*)SetupGetDevDescr);
issue_token(send_mode,( 0 << 4 ) | DEF_USB_PID_SETUP);
status = wait_interrupt();
if( status == USB_INT_SUCCESS )
{
receive_mode = 0x80;
}
else
{
return(0);
}
issue_token(receive_mode,( 0 << 4 ) | DEF_USB_PID_IN);
status = wait_interrupt(); //这里返回0x2E
if( status == USB_INT_SUCCESS )
descr_len = data_buf[0] - RD_USB_DATA(data_buf);
while( descr_len > 0 )
{
receive_mode ^= 0x80;
p += 0x08;
issue_token(receive_mode,( 0 << 4 ) | DEF_USB_PID_IN);
status = wait_interrupt();
if( status == USB_INT_SUCCESS )
{
descr_len -= RD_USB_DATA(p);
}
else
{
return(0);
}
}
}
else
{
return(0);
}
send_mode = 0x40;
WR_USB_DATA(0,(void*)SetupGetDevDescr);
issue_token(send_mode,( 0 << 4 ) | DEF_USB_PID_OUT);
status = wait_interrupt();
if( status == USB_INT_SUCCESS )
{
return(1);
}
else
{
return(0);
}
}
返回值0x2E不算通讯异常,只是设备返回了一个STALL,协议上说可能为一个不支持的命令,不过在这里我觉得可能是设备忙暂时未响应,可以尝试重发。
返回值0x2E不算通讯异常,只是设备返回了一个STALL,协议上说可能为一个不支持的命令,不过在这里我觉得可能是设备忙暂时未响应,可以尝试重发。
现在发现,第一次连接设备,获取不到设备描述符,拔了重连就可以