ch374T用作控制键盘设备时,有问题

00 00 80 00 c1 40 c0 03 00 40 e8 00 00 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 a1 4b 2d 34 00 a8 06 26 25 4c 58 03 60 2c 12 53 12 60 72 cc 20 5e 4a 1d 10 96 0e 3c 2d 54 c0 Start CH374 Host

Reset Device Start Low- Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 D9 04 03 15 10 03 01 02 00 01 a ddress_status=14 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 7 5 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 26 ff 00 05 07 19 00 29 91 81 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Set_Report Set_Report success

s:2a

s:14 00 00 1f 00 00 00 00 00 s:14 00 00 00 00 00 00 00 00

s:14 00 00 1f 00 00 00 00 00 s:14 00 00 00 00 00 00 00 00

s:2a

s:14 00 00 1e 00 00 00 00 00 s:14 00 00 00 00 00 00 00 00

s:14 00 00 29 00 00 00 00 00 s:14 00 00 00 00 00 00 00 00

s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 s:20 然后就一直是s:20了,请问这是怎么个情况啊?

那个20是从这里返回的: UINT8 HostTransact374( UINT8 endp_addr, UINT8 pid, BOOL tog ) { // 本子程序着重于易理解,而在实际应用中,为了提供运行速度,应该对本子程序代码进行优化 UINT8 retry; UINT8 s, r, u; for ( retry = 0; retry < 3; retry ++ ) {//原来是3 Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( pid, endp_addr ) ); // 指定令牌PID和目的端点号 //Write374Byte( REG_USB_H_CTRL, BIT_HOST_START | ( tog ? ( BIT_HOST_TRAN_TOG | BIT_HOST_RECV_TOG ) : 0x00 ) ); // 设置同步标志并启动传输 Write374Byte( REG_USB_H_CTRL, ( tog ? ( BIT_HOST_START | BIT_HOST_TRAN_TOG | BIT_HOST_RECV_TOG ) : BIT_HOST_START ) ); // 设置同步标志并启动传输 //Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE ); // 取消暂停 //delay_us( 200 ); s = Wait374Interrupt( ); if ( s == ERR_USB_UNKNOWN ) return( s ); // 中断超时,可能是硬件异常 s = Read374Byte( REG_INTER_FLAG ); // 获取中断状态 if ( s & BIT_IF_DEV_DETECT ) { // USB设备插拔事件 delay_us( 200 ); // 等待传输完成 Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_DEV_DETECT | BIT_IF_TRANSFER ); // 清中断标志 if ( s & BIT_IF_DEV_ATTACH ) { // USB设备连接事件 u = Read374Byte( REG_USB_SETUP ); if ( s & BIT_IF_USB_DX_IN ) { // 速度匹配,不需要切换速度 if ( u & BIT_SETP_USB_SPEED ) return( USB_INT_CONNECT_LS ); // 低速USB设备 return( USB_INT_CONNECT ); // 全速USB设备 } else { // 速度失配,需要切换速度 if ( u & BIT_SETP_USB_SPEED ) return( USB_INT_CONNECT ); // 全速USB设备 return( USB_INT_CONNECT_LS ); // 低速USB设备 } } else return( USB_INT_DISCONNECT ); // USB设备断开事件 } else if ( s & BIT_IF_TRANSFER ) { // 传输完成///////////////////////////////// Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中断标志 s = Read374Byte( REG_USB_STATUS ); // USB状态s为0x0a寄存器的状态 r = s & BIT_STAT_DEV_RESP; // USB设备应答状态s&0x0f switch ( pid ) { case DEF_USB_PID_SETUP: case DEF_USB_PID_OUT: if ( r == DEF_USB_PID_ACK ) return( USB_INT_SUCCESS ); else if ( r == DEF_USB_PID_STALL || r == DEF_USB_PID_NAK ) return( r | 0x20 ); else if ( ! M_IS_HOST_TIMEOUT( s ) ) return( r | 0x20 ); // 不是超时/出错,意外应答 break; case DEF_USB_PID_IN: if ( M_IS_HOST_IN_DATA( s ) )//是否返回DATA0或者DATA1 { // DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1 if ( s & BIT_STAT_TOG_MATCH ) return( USB_INT_SUCCESS ); // 数据包同步则返回,不同步则需丢弃后重试 } else if ( r == DEF_USB_PID_STALL || r == DEF_USB_PID_NAK ) return( r | 0x20 );//其他标志位为1 else if ( !M_IS_HOST_TIMEOUT( s ) ) return( r | 0x20 ); // 不是超时/出错,意外应答 break; default: return( ERR_USB_UNKNOWN ); // 不可能的情况 } } else { // 其它中断,不应该发生的情况 delay_us( 200 ); // 等待传输完成 Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); /* 清中断标志 */ if ( retry ) return( ERR_USB_UNKNOWN ); // 不是第一次检测到则返回错误 } } //Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); /* 清中断标志 */ return( 0x20 ); // 0x20应答超时 s=0x88 }

单片机是STM32 72MHz


怎么没有回答啊,请求答复啊。谢谢


今天测试发现是USB状态寄存器(地址0x0a值为0xc8)中的接收的数据包不同步(bit 4=0),bit0-bit3 为0,表示设备应答错误或者超时无应答,该怎么解决啊?谢谢


你操作的是什么HID类设备?键盘?鼠标还是其他的?还有就是你读取返回0X20是对哪个端点进行操作的?


我操作的是键盘设备,端点1


s:14 00 00 1f 00 00 00 00 00 这个是你获取的按键数据?


en,是的,但是它和我用电脑抓到的数据不同,不知道为什么?


终于找到原因的所在了,是我的键盘不是标准键盘的原因,谢谢了。


请问,控制键盘上的灯的亮灭是怎么控制的? 还有没有其他ch374T控制键盘的例程或者资料啊(邮箱个人信息保护,已隐藏),总感觉现在用的这个不是很稳定,谢谢了


灯是通过发送SET-REPORT命令来实现的,目前只有论坛上的例子,程序是经过测试的比较稳定的。


能具体说明SET-REPORT发送的那个字节,以及发送什么数据来控制键盘的LED吗?谢谢


SET-REPORT发送的命令SetupSetReport[]={0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00}; 发送的数据是0x01。.实际的数据可以写别的数据,这个你可以用计算机抓下数据在发下去。


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