CH375B通过串口连接USB 键盘获取设备描述符不成功,求助!
使通过串口方式连接至CH375B 芯片,串口速率为9600 ,8位数据,2位停止,无校验,无流控。

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

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

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

请问对于键盘鼠标与U盘的差异在什么地方,应该如何处理??
这人很懒,什么都没留下
热门产品推荐 : CH342: USB转双串口芯片
CH375串行数据格式不是 1个起始位、9个数据位、1个停止位吗?搞不懂,楼主是怎么控制第九位对375进行写数据、写命令的。本人刚开始学CH375B,上面布置的任务是通过串口方式写U盘,求指导
这人很懒,什么都没留下
To:hubertboy
使用串口连接CH375,首先把测试命令测试通过。键盘和鼠标的话一般是低速设备,区别于U盘,需要设置一线总线速度。
To:杜宾
第九位通过TB8寄存器来控制,首先初始化设置为9位,为1时是命令。为0时为数据。
邮箱:[email protected] 电话:025-52638376
To: ZBin
感谢您的回复,您所说的测试命令是指CHECK_EXIT吗?
现在使用CHECK_EXIST 命令测试OK! 发送 0x06 0x55 , IC 返回0xAA !
这人很懒,什么都没留下
你的测试命令是正确通过的,那注意一下速度设置,CH375操作键盘鼠标你可以参考一下第8楼:https://www.vs7ae.com/bbs/View.asp?S=101&I=19463
邮箱:[email protected] 电话:025-52638376
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分析仪监控一下数据。
邮箱:[email protected] 电话:025-52638376
现在手头没有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数据。
邮箱:[email protected] 电话:025-52638376
能否采用两个端点轮流发送IN 令牌的方式来获取两个端点的数据?

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

请问是什么原因呢?
这人很懒,什么都没留下
可以,我们CH375的ACT引脚是USB设备连接状态输出引脚,低电平有效。闪烁的话你的设备是不是一直在断开连接。
邮箱:[email protected] 电话:025-52638376
使用 获取状态命令 0x22 ,返回 0x15 0x16 ,交替返回!

可能是什么原因列?

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

增加电容后,结果还是一样!
这人很懒,什么都没留下
只有登录才能回复,可以选择微信账号登录