求助:CH375主机模式下与扫码枪通信

CH375能够正常获取USB键盘的设备描述符,配置描述符,正常config和set idle。接上USB扫码枪之后只能运行到375进入低速模式,后面的程序不运行了。然后拔掉扫码枪之后,又开始运行,

get device descr failed

get config descr failed

get device descr again failed

get report descr failed

set report failed

是在拔掉扫码器之后开始运行的,请问这是什么原因呢。

1.png2.png3.png

请先执行“GET_DEV_RATE”获取设备速度,根据设备速度情况进行匹配。


                           

请先执行“GET_DEV_RATE”获取设备速度,根据设备速度情况进行匹配。


谢谢你。再请教一下,

CH375_WR_CMD_PORT( CMD_GET_DEV_RATE );要如何使用获取的速度呢,是有几位数据的?


"该命令需要输入 1 个数据 07H,输出为数据速率类型,其位 4 为 1 则是 1.5Mbps 低速 USB 设备,否则是 12Mbps 全速 USB 设备。该命令仅在 USB 模式 5(已启用的 USB 主机方式,不产生 SOF 包)状态下有效。",详细查看CH375DS2手册。


还是没怎么搞懂,有没有获取设备速度再使用的例程,能不能提供一下,谢谢了。


unsigned char get_descr( unsigned char type ) 

{  /* 从设备端获取描述符 */

status=0xff;

CH375_WR_CMD_PORT( CMD_GET_DESCR );

printf( "get_descr WR_CMD SUCCESS\n" ); //20161015

CH375_WR_DAT_PORT( type );  /* 描述符类型, 只支持1(设备)或者2(配置) */

printf( "get_descr WR_DAT SUCCESS\n" ); //20161015

status=wait_interrupt();  /* 等待CH375操作完成 */

printf( "CH375操作完成\n" ); //20161015

if ( status==USB_INT_SUCCESS ) {  /* 操作成功 */

unsigned char i, len;

len=rd_usb_data( data_buf );

printf( "%s描述符是:", type==1?"设备":"配置" );

for ( i=0; i!=len; i++ ) printf( "%02x ", (unsigned int)data_buf[i] );

printf( "\n" );

}

return( status );

}


后来加入一些打印符做标记,发现是运行到status=wait_interrupt()就没有运行下去了;

应该是停在这一步while( CH375_INT_WIRE );  /* 查询等待CH375操作完成中断(INT#低电平) */


unsigned char Get_freq(void)
{  
 CH375_WR_CMD_PORT(0x0a);    /* 查询当前设备速度 */
 CH375_WR_DAT_PORT(0x07);
 return (CH375_RD_DAT_PORT());
}
void Set_freq(void)

 CH375_WR_CMD_PORT(0x04);    /* 切换使375B进入低速模式 */
 CH375_WR_DAT_PORT(0x02);
}

 s = Get_freq(); 
  set_usb_mode( 7 );    /* 总线复位 */
  mDelayms(30);
  set_usb_mode( 6 );
  mDelayms(30);
  if( s&0x10 ) Set_freq();  /* 切换使375B进入低速模式 */

PS:在执行 CMD_SET_USB_MODE 命令设置 USB 工作模式后也会自动恢复到 12Mbps 全速方式


非常感谢  jie  !!!确实是速度不同,后来把设备的速度打印出来,使用的键盘是11,扫码枪是2121.png虽然不知道11和21分别代表了什么速度,但确实是传输速度不同的问题导致没能正常读取数值。


21.png

程序能读到鼠标的键值和鼠标移动的数值,但是键盘(和扫码枪)的值读不到。键盘(和扫码枪)的那些配置之类的都可以配置成功,就是按下按键的时候串口没有值输出。用的是HP(惠普)的键盘。


不同设备类的的类命令不同,还有需要注意端点号。


我这边使用的代码是官网提供的/* 用CH375操作HID设备,比如键盘,鼠标*/,应该是可以直接

操作键盘鼠标了吧?我也不是很懂,刚接触USB。关于设备类命令和端点号,刚刚百度了一下,

大概明白是什么,但是不懂的如何操作,还请大虾赐教,指导一下,谢谢你了。


鼠标的键值和键盘的键值除了位数不同,操作方式有什么不同?发现键盘上有三个按键,音量+,音量-和静音按下去是有键值出来的,和鼠标一样都是4位的,但是其他按键都没有值,应该就是八位的了。为什么8位的就读不出来呢?求指导!!!!!!!


issue_token的参数包含了端点号和命令类型,IN到数据后,执行CMD_RD_USB_DATA的数据流必须全部读出。如果想了解传输,建议通过BUS HOUND在电脑上查看。


试过把这段代码

len_temp1=rd_usb_data(data_buf);

for(i=0;i!=len_temp1;i++)data_in[i]=data_buf[i];

加进get_int_in();函数里面,但是效果还是一样。

第一张图是键盘电脑上用BUS HOUND抓的数据,第二张是鼠标


键盘2.png





鼠标2.png



这是键鼠的数据?方便把代码发给我看吧 gj@wch.cn


                           

这是键鼠的数据?方便把代码发给我看吧 gj@wch.cn

                       

已发送,请查收。感谢你,百忙之中抽空解答。


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