[求助]ch372 外置固件模式

本人准备使用avr atmega64 + ch372做一个模拟键盘,在过程中遇到了问题。

目前主机可以成功请求设备描述符,但设置地址时,出现异常的中断,不知道为什么。 以下是我打印出来的log:

Program Starting ... CH375 init ok return = 0x51 Start loop mCH375Interrupt InterruptStatus = 0x2 default mCH375Interrupt InterruptStatus = 0x2 default mCH375Interrupt InterruptStatus = 0x2 default mCH375Interrupt InterruptStatus = 0x2 default mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xF default 总线复位 mCH375Interrupt InterruptStatus = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x40 0x0 获取设备描述符 发送长度: 8 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 发送长度: 8 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 发送长度: 2 , 发送内容: 0x3 0x1 mCH375Interrupt InterruptStatus = 0x0 端点0写中断 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 mCH375Interrupt InterruptStatus = 0x7 default 总线复位 mCH375Interrupt InterruptStatus = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x40 0x0 获取设备描述符 发送长度: 8 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 发送长度: 8 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 获取描述符 发送长度: 2 , 发送内容: 0x3 0x1 mCH375Interrupt InterruptStatus = 0x0 端点0写中断 mCH375Interrupt InterruptStatus = 0xC 端点0setup中断 长度 = 8 内容 = 0x0 0x5 0x1 0x0 0x0 0x0 0x0 0x0 DEF_USB_SET_ADDRESS mCH375Interrupt InterruptStatus = 0xC 端点0setup中断 长度 = 0 内容 = --------------------------ch375 发生错误 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x8 端点0读中断 设置地址: 0x1 mCH375Interrupt InterruptStatus = 0x7 default 总线复位 mCH375Interrupt InterruptStatus = 0x7 default 总线复位 mCH375Interrupt InterruptStatus = 0x7 default 总线复位 mCH375Interrupt InterruptStatus = 0x7

请教达人如何修改,为什么?

你这样打印会出问题的。尽量少打印数据。因为你在打印时会耽误很长时间,导致无法处理CH372的中断,PC会超时的。


重新更新log Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x40 0x0 获取设备描述符 剩余长度: 56 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 Status = 0x8 端点0读中断 获取描述符 剩余长度: 48 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 Status = 0x0 端点0写中断 长度 = 0 Status = 0x0 端点0写中断 长度 = 0 Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x0 0x5 0x1 0x0 0x0 0x0 0x0 0x0 DEF_USB_SET_ADDRESS Status = 0x8 端点0读中断 设置地址: 0x1 Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x12 0x0 获取设备描述符 剩余长度: 10 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 Status = 0x8 端点0读中断 获取描述符 剩余长度: 2 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 Status = 0x8 端点0读中断 获取描述符 剩余长度: 0 , 发送内容: 0x3 0x1 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x7 default 总线复位 Status = 0x7 default 总线复位 Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x40 0x0 获取设备描述符 剩余长度: 56 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 Status = 0x8 端点0读中断 获取描述符 剩余长度: 48 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 Status = 0x0 端点0写中断 长度 = 0 Status = 0x0 端点0写中断 长度 = 0 Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x0 0x5 0x1 0x0 0x0 0x0 0x0 0x0 DEF_USB_SET_ADDRESS Status = 0x8 端点0读中断 设置地址: 0x1 Status = 0xC 端点0setup中断 长度 = 8 内容 = 0x80 0x6 0x0 0x1 0x0 0x0 0x12 0x0 获取设备描述符 剩余长度: 10 , 发送内容: 0x12 0x1 0x10 0x1 0x0 0x0 0x0 0x8 Status = 0x8 端点0读中断 获取描述符 剩余长度: 2 , 发送内容: 0x3c 0x41 0x3 0x20 0x0 0x2 0x1 0x2 Status = 0x8 端点0读中断 获取描述符 剩余长度: 0 , 发送内容: 0x3 0x1 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断 长度 = 0 Status = 0x8 端点0读中断 获取描述符 Status = 0x8 端点0读中断 获取描述符 Status = 0x0 端点0写中断

以上是使用ch372 hid代码打印出的log 为什么设置地址成功后,没有发生setup中断请求配置描述符?


你看下设置地址之后,程序里面有没有设置CH372的地址为0X01。如果没有的话,那么就有可能出现你的情况 else if(mVarSetupRequest==DEF_USB_SET_ADDRESS){ //设置地址 CH375_WR_CMD_PORT(CMD_SET_USB_ADDR); CH375_WR_DAT_PORT(VarUsbAddress); //设置USB地址,设置下次事务的USB地址 }


谢谢大家了,已经解决了

跟串口波特率有关


把打印去掉。会超时。


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