CH376T接USB打印机,读取配置描述符出错

用STM32控制CH376T做USB打印的程序

参考CH375PRT.C中例子

unsigned char init_print()函数中

if ( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) return( UNKNOWN_USB_PRINT );  /* 不是USB打印机或者不符合USB规范 */

 

这句中p_cfg_descr->itf_descr.bInterfaceClass和p_cfg_descr->itf_descr.bInterfaceSubClass的值始终不对

 

查看了一下

p_cfg_descr->itf_descr.bInterfaceClass=1
p_cfg_descr->itf_descr.bInterfaceSubClass=2

 

接着查看了一下读出的配置描述符的数据,即buffer中的数据

buffer[00]=09
buffer[01]=02
buffer[02]=20
buffer[03]=00
buffer[04]=01
buffer[05]=01
buffer[06]=00
buffer[07]=C0
buffer[08]=00
buffer[09]=09
buffer[10]=04
buffer[11]=00
buffer[12]=00
buffer[13]=02
buffer[14]=07
buffer[15]=01
buffer[16]=02
buffer[17]=00
buffer[18]=07
buffer[19]=05
buffer[20]=81
buffer[21]=02
buffer[22]=40
buffer[23]=00
buffer[24]=00
buffer[25]=07
buffer[26]=05
buffer[27]=02
buffer[28]=02
buffer[29]=40
buffer[30]=00
buffer[31]=00

 

好像指针p_cfg_descr指向错位了

用STM32控制CH376T做USB打印的程序

参考CH375PRT.C中例子

unsigned char init_print()函数中

if ( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) return( UNKNOWN_USB_PRINT );  /* 不是USB打印机或者不符合USB规范 */

 

这句中p_cfg_descr->itf_descr.bInterfaceClass和p_cfg_descr->itf_descr.bInterfaceSubClass的值始终不对

 

查看了一下

p_cfg_descr->itf_descr.bInterfaceClass=1
p_cfg_descr->itf_descr.bInterfaceSubClass=2

 

接着查看了一下读出的配置描述符的数据,即buffer中的数据

buffer[00]=09
buffer[01]=02
buffer[02]=20
buffer[03]=00
buffer[04]=01
buffer[05]=01
buffer[06]=00
buffer[07]=C0
buffer[08]=00
buffer[09]=09
buffer[10]=04
buffer[11]=00
buffer[12]=00
buffer[13]=02
buffer[14]=07
buffer[15]=01
buffer[16]=02
buffer[17]=00
buffer[18]=07
buffer[19]=05
buffer[20]=81
buffer[21]=02
buffer[22]=40
buffer[23]=00
buffer[24]=00
buffer[25]=07
buffer[26]=05
buffer[27]=02
buffer[28]=02
buffer[29]=40
buffer[30]=00
buffer[31]=00

 

好像指针p_cfg_descr指向错位了


你检查下程序给这两个变量赋值的时候是不是偏移多加了1,导致赋值的时候就错了,因为刚刚好偏移多一个字节就是1和2.


程序是CH375PRT.C中的,没修改过

 


自己调试了几次

可能跟CPU的内存分配有关

这里用了stm32的cpu,32位的

因此用sizeof(USB_CFG_DESCR)计算了一下,

sizeof(USB_CFG_DESCR) = 10


在查询打印机端口状态函数

unsigned char get_port_status( )中

 

if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) {  /* DATA阶段操作成功 */

这句函数issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )返回值始终不等于USB_INT_SUCCESS

返回值为USB_INT_RET_STALL(0x2E)

/* USB_INT_RET_STALL 0x001X1110B */  /* 错误:返回STALL */

 

这是为什么?


返回状态说明命令不识别,应该是你还有命令没有发送,打印机没有正确枚举,你在电脑端用USB抓包工具看看是不是哪个阶段的命令还没有完成。


打印机枚举已经完成,unsigned char init_print()函数返回USB_INT_SUCCESS


工具获得的数据

x.png


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