[求助]CH376主机模式无法获取HID设备描述符

我想用CH376S读取手柄键值,但是不能获取手柄的HID设备描述符。 准确的说是SETUP事务都执行失败了

事务执行函数如下: void issue376(UCHAR tog,UCHAR pid) { wr_cmd376(CMD_ISSUE_TKN_X); wr_dat376(tog); wr_dat376(pid); _nop_(); }

获取设备描述符函数如下: UCHAR get_dev_descr() { UCHAR length; UCHAR *p = data_buf; mode = 0x00; wr_buf376(8,SetupGetDevDescr); _nop_(); issue376(mode,DEF_USB_PID_SETUP); _nop_(); status = INT_QUERY376(); _nop_(); if(status!=USB_INT_SUCCESS) return(ERR_SETUP_F); else mode = 0x80; …… }

手册上说事务执行完毕后CH376会产生中断,返回0x14,但是我查看上面函数的返回值,就是ERR_SETUP_F (这个是我自己定义的值) 我用的是89C52,晶振12M,376的晶振也是12M,CMD_CHECK_EXIST命令的返回值是正常的

调了半天也不对,不知道怎么回事啊,请求大家帮忙看看,谢谢!

对了,因为我不太懂那个376总线地址是怎么来的,加上我又是用的自己做的板子,所以说读写函数就是通常的时序控制的,像这样 UCHAR rd376() { UCHAR temp; DIR_IN376(); A0 = 0; RD = 0; _nop_(); temp = DATA_IN376(); RD = 1; return(temp); }

写指令 void wr_cmd376(UCHAR cmd) { DATA_OUT376(cmd); A0 = 1; WR = 0; _nop_(); WR = 1; A0 = 0; }

写数据 void wr_dat376(UCHAR dat) { DATA_OUT376(dat); A0 = 0; WR = 0; _nop_(); WR = 1; }

从缓冲区读 UCHAR rd_buf376(UCHAR *buf) { UCHAR i,length; wr_cmd376(CMD_RD_USB_DATA0); DELAY_US(5); length = rd376(); _nop_(); for(i=0;i!=length;i++) *buf++ = rd376(); return(length); }

向端点缓冲区写 void wr_buf376(UCHAR length,UCHAR *buf) { wr_cmd376(CMD_WR_HOST_DATA); DELAY_US(5); wr_dat376(length); DELAY_US(5); while(length--) wr_dat376(*buf++); }

不知道这几个有没有问题,恳请指教


首先检查一下你的硬件,主要是模拟并口和中断的配置。至于获取描述符的流程参CH376操作鼠标键盘程序:http://www.wch.cn/bbs/View.asp?S=101&I=19463 另外我们程序是支持模拟并口方式通讯的,具体时序参考\CH376EVT\EXAM\PARA_SW.C


谢谢

硬件方面,376的数据并口与51的P1直接连接,片选PCS口在初始化之后就一直拉低,中断虽然连了51的外中断,但是现在的程序只有操作376的,所以我没有使用中断,而是循环读376并口的值

获取描述符的函数我是照着你们给的例程写的,但是SETUP事务那儿就会出错,按照手册,事务执行成功的话376会产生一个中断,如果用CMD_GET_STATUS命令应该能返回0x14并且取消中断请求,但是在事务执行之后我查询中断,并没有返回0x14

并口通讯的代码我也是按着PARA_SW写的,只不过没有将片选拉高,而是使用延时


中断那块如果你连接了单片机中断会直接查询中断引脚,没连接才会循环读并口值。另外你复位之后做一下测试命令看看有没有通过?还有监测一下status = INT_QUERY376();中status 的返回值。


376的中断和51的外中断连着的 但是我把51的中断屏蔽了,在主函数里面进行初始化后就循环让主芯片和376通过并口进行通信,因为是想调试,所以就是循环获取HID的几个描述符 复位之后进行CMD_CHECK_EXIST的返回值是对的 在用CMD_ISSUE_TKN_X执行SETUP事务之后返回的中断状态是0xd1,我不明白这个是什么意思,不应该返回0x14么?

非常感谢!


你如果接的是HID低速设备的话需要在初始化完成之后将速度降为低速才能进行SETUP包的传输。


我使用CMD_SET_USB_SPEED命令设置的速度,设置的是0x02 1.5M低速模式 不过就是这么设置还是不正常


那问下获取设备描述符正确吗?获取配置描述符正确吗?只是获取HID类描述符有问题?


就是在获取设备描述符阶段的SETUP事务包执行有问题,返回的中断状态代码是0xd1


没有这个中断状态,建议你检查下你的硬件连线是否有问题,最好做下测试命令。还有就是CH376晶振用的是否为12M?


晶振是12M的 我使用的51单片机,连线方式是 PCS----------P2.1 RSTI---------P2.5 A0-----------P3.2 INT----------P3.3 WR-----------P3.6 RD-----------P3.7 D0~D7--------P1.0~P1.7 TXD下拉 RXD悬空 SD_CS连VSS SD_CK SD_DO SD_DI均悬空

命令的话 CMD_CHECK_EXIST可以通过 CMD_SET_USB_MODE可以通过


那很简单,直接发送获取设备描述符的命令: CMD = GET_DESCR(0x46); DATA = 0x01; //获取设备描述符 等待中断,这个时候的中断状态是什么?


我使用CMD_GET_DESCR命令了 然后使能了中断 执行命令后等待中断 这个时候发的中断状态不是0xd1了 但是是0xac 似乎也没有这个状态吧……


按照你的这个情况,重点检查这几个地方: 1,中断引脚定义是否正确? 2,仔细检查测试命令,测试命令做2次,一次发送0X55数据,读取数据应该是0XAA,再发送0XAA数据,看下读取数据是否为0X55。 按照你反馈的现象估计还是硬件上面有问题。


376的INT# 与P3.3 就是INT1 相连 我刚刚又试了下不用中断 在main里面循环执行命令 然后返回0xd1 我加了段代码等中断状态不是0xd1之后再读 是0xac 再等到0xac之后 是0xa4 硬件方面……我参考了开发板的连接方式的 板子用电表测过没有虚焊

测试命令按你说的做了 没有问题 发送0x55和0xaa后返回0xaa和0x55


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