CH375B通过串口连接USB 键盘获取设备描述符不成功,求助!

使通过串口方式连接至CH375B 芯片,串口速率为9600 ,8位数据,2位停止,无校验,无流控。

在电脑上通过串口助手,将命令字及数据依次发送至CH375B,

不能获取插入键盘的设备描述,换成鼠标也不可以,

但是插入手头的U盘, 可以成功获取到设备描述符!

请问对于键盘鼠标与U盘的差异在什么地方,应该如何处理??

CH375串行数据格式不是 1个起始位、9个数据位、1个停止位吗?搞不懂,楼主是怎么控制第九位对375进行写数据、写命令的。本人刚开始学CH375B,上面布置的任务是通过串口方式写U盘,求指导


To:hubertboy 使用串口连接CH375,首先把测试命令测试通过。键盘和鼠标的话一般是低速设备,区别于U盘,需要设置一线总线速度。 To:杜宾 第九位通过TB8寄存器来控制,首先初始化设置为9位,为1时是命令。为0时为数据。


To: ZBin 感谢您的回复,您所说的测试命令是指CHECK_EXIT吗? 现在使用CHECK_EXIST 命令测试OK! 发送 0x06 0x55 , IC 返回0xAA !


你的测试命令是正确通过的,那注意一下速度设置,CH375操作键盘鼠标你可以参考一下第8楼:http://www.wch.cn/bbs/View.asp?S=101&I=19463


To: ZBin 感谢您的回复,测试后,在来报告!

查看源码中更改速度的代码为: void set_freq(void) { CH375_WR_CMD_PORT(0x0b); /* 切换使375B进入低速模式 */ CH375_WR_DAT_PORT(0x17); CH375_WR_DAT_PORT(0xd8); }

与手册中 SET_USB_SPEED 0x04 不一致!请问代码是否正确?

测试发现,使用GET_IC_VER 命令获取版本,可以返回 0xB7, 使用 CHECK_EXIST 命令,可以接受到发送数据取反后的值。

调用 get_descr_ex()程序,此程序内 issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); 返回状态为0x2E, 请问是什么错误,该如何处理?


等待回复!


设置速度的话可以使用第5楼的函数,也可以用SET_USB_SPEED 0x04这条命令。 获取描述符get_descr_ex()中断返回0x2E说明主机发送命令设备没有响应,有可能是你命令发送有问题,最好使用USB分析仪监控一下数据。


现在手头没有USB分析的设备,无法监控到数据!


检查代码发现两个问题, 1,我现在使用的是STM32 ,数据存储与51 有一个大小端的差异,导致数据发送顺序错误! 2,数据类型,在C51 中 int 是16为的, 在STM32 中int 是32 位的,导致共用体 union _REQUEST //请求包结构 { struct { unsigned char bmRequestType; unsigned char bRequest; unsigned int wValue; unsigned int wIndex; unsigned int wLength; }Req; unsigned char Req_buf[8]; }Request;

与实际想要的数据有出入! 要更改为: union _REQUEST //ÇëÇó°ü½á11 { struct { unsigned char bmRequestType; unsigned char bRequest; unsigned short int wValue; unsigned short int wIndex; unsigned short int wLength; }Req; unsigned char Req_buf[8]; }Request;


现测试结果如下:

1,可以成功返回设备描述符,以及配置符,并可成功设置配置! 2,调用 set_idle() ,返失败。。 3,获取report 成功, 4,调用set_report(),返回1, 调用成功, 5,调用 get_int_in() 后,没有中断发生。

请问 1, 调用 set_idle() 失败后,是否可以继续操作? 2,调用 get_int_in() 后,没有中断发生。 可能的原因是什么?


程序也没有做更改, 现在set_idle 调用后返回成功!

2,调用 get_int_in() 后,没有中断发生。

增加重试次数后,发生中断!

另外,请问当一个设备有两个输出断点 81 ,82 的时候,如何选择充那个端点获取数据??


get_int_in() 函数是在发送IN令牌包取数据,操作鼠标键盘需要每隔几ms发送一次,这样操作鼠标键盘才能获取到数据。 一般鼠标键盘只有一个端点(81)来传输数据,如果有两个端点,有可能一个端点没用到,也有可能一个端点传输控制信息,一个端点传输数据。具体你插到电脑上监控一下USB数据。


能否采用两个端点轮流发送IN 令牌的方式来获取两个端点的数据?

另外,现在手头有块USB的红外触摸屏,插上后,act led 不停的闪烁,频率大约2秒,

请问是什么原因呢?


可以,我们CH375的ACT引脚是USB设备连接状态输出引脚,低电平有效。闪烁的话你的设备是不是一直在断开连接。


使用 获取状态命令 0x22 ,返回 0x15 0x16 ,交替返回!

可能是什么原因列?

怀疑是电源不够,增加了一个470uF 的电容在USB 座上,测量实际平均电流也就100mA,

增加电容后,结果还是一样!


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