[求助]CH376主机方式读取键盘的问题

参考的程序是“ch376host”,其他帖子中推荐的 开头部分写: /**************************************** ** Copyright (C) WCH 1999-2009 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB 1.1 Host Examples for CH376 ** ** KC7.0@MCS-51 ** ** Version: v1.0 ** ** Author: tech14 ** ** Time : 2009/11/18 ** **************************************** 应该是沁恒官方提供的,但是在官方页面上没找到下载的地方 我参照这个程序编写自己的程序,一点一点的添加 增加一点,运行一下看看效果 我用的是8位并口,软件模拟接口方式

写到“获取设备描述符”时就不成功了,输出“get device descr failed” 我怀疑是前面设置速度的问题 前有面调用这样的函数 void set_freq(void) { CH376_WR_CMD_PORT(0x0b); // 切换使375B进入低速模式 CH376_WR_DAT_PORT(0x17); CH376_WR_DAT_PORT(0xd8); } 我不明白0x0b,0x17,0xd8这三个参数是什么意思 查数据手册中的命令,似乎与速度没有关系

我重新写设置低速的函数: void CH376_SET_USB_SPEED(void) {     CH376_WR_CMD_PORT(CMD_SET_USB_SPEED); //0x04     CH376_WR_CMD_PORT(0x02); } 替换原先的设置速度,获取设备描述符就成功了 但不是很稳定,有时还是会失败

修改 UINT8 Get_Dev_Descr(),增加输出语句 发现是 DATA阶段 不成功, issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN); status = wait_interrupt(); 读出的状态值是 0x16 (检测到USB设备断开事件) 不明白为什么

另外,不知道 (0<<4) 有什么用,0左移4为不还是0么?

请问,void set_freq(void) 中的那三个参数,能解释一下是什么意思么? 另外问个小问题,这两种复位方法效果一样么: 1. 用 CMD_RESET_ALL 命令复位 2. 在CH376芯片第2脚RSTI,高电平一段时间再恢复低电平(不知道高电平需要持续多长时间?)

今天继续编写函数,获取设备描述符几乎总是失败,很郁闷

我跳过这一步,不获取设备描述符了,注释掉相关的语句,继续编写 接下来是设置地址和获取配置描述符 很奇怪,都成功。

获取设备描述符和获取配置描述符,这两个函数差不多的呀,为什么一个成功,一个却不成功呢?


(1)set_freq(void)函数里面的设置是很早以前的命令,也可以用,也可以用CH376_SET_USB_SPEED来设置成低速。 (2)在获取设备描述符之前,芯片正常复位(25脚电平为低),确保测试命令正常通过。 (3) (0<<4) | DEF_USB_PID_IN只是C语言的一个用法,取低4位令牌PID (4)关于复位,软件复位和硬件复位效果是一样的,福为高电平持续时间至少100ns,复位完成需要延时50MS。


回复2楼 (似乎没有回复哪一楼的按钮,希望这个回复能被2楼看到)

非常感谢您的回答,(1)(3)(4)我已经弄明白了 第(2)条回复我不太明白,想再问一下:

芯片中第25脚的描述如下: “电源上电复位和外部复位输出,高电平有效” 这句话我没完全弄明白。 如果是用第2脚进行硬件复位,25脚的输出等于2脚的输入么?

“复位高电平持续时间至少100ns,复位完成需要延时50MS”

我想问,第2脚100ns高电平之后恢复低电平,然后的50ms时间之内,第25脚输出是什么? 是立即跟着变成低电平? 还是保持高电平,等到复位完成后再变成低电平?

我的电路是开发板上的,25脚是悬空的,没法改。引脚太密了,也没法用示波器测

我把延时50ms的语句延长到100ms。但还是没有用,获取设备描述符大多数时候失败 跳过他,继续写,一直把所有的内容都搬到我自己的程序。 后面的部分全都成功的,回过头再试获取设备描述符,还是失败。

////////////////

请问关于 receive_mode 和 send_mode 这两个全局变量 大部分的地方我都看明白的,比如说 send_mode = 0x00; issue_token(send_mode, (0<<4) | DEF_USB_PID_SETUP); 还有: receive_mode = 0x80; // ........ issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN); 看数据手册,我知道参数 0x80 和 0x40 的含义。 技术手册2中,命令CMD_ISSUE_TKN_X 有这样的说明: 同步标志的位7为主机端点的接收器的同步触发标志,位6为主机端点的发送器的同步触发标志

我不明白的是这里: 获取配置描述符的函数 Get_Cfg_Descr(UINT8 *buf)中,DATA阶段里有这样的语句: receive_mode ^= 0x80; 有两处,一处是 while(descr_len>0) 循环中,另一处是循环之前 使用该变量的语句是 issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN);

字面上看,receive_mode 的值是0x80和0x00交替,我不知道这有什么用。 请问,什么时候需要同步触发标志,什么时候不需要同步触发标志? 连续读取(或写入)都要这样交替么?


第25脚是外部复位输出引脚,显示复位的状态,复位的时候是高电平,复位完成是低电平。复位电平从高变低需要一个过程,这个过程就是复位后的延时。 同步标志交替,是根据USB协议来的,如果数据连续写入,相同端点包与包之间同步标志需要切换。 你现在主要的问题是查一下为什么获取设备描述符不成功,而获取配置描述符是成功的?两者操作是一样的。


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