晶振的频率问题

小弟刚毕业,最近做的项目是打印机的USB驱动,用的是CH374,由于没有24MHz的晶振,只能用12M的替代,请问路过的大侠,这样会有影响吗?

不可以,通讯不稳定,甚至无法通讯,强烈推荐24MHZ,官方所有资料都是24MHZ.


哦,谢谢啦


现在晶振换成24MHZ的了,不过,PC机无法识别usb设备。固件中的驱动能够检测到挂起、总线重启中断,但是没有传输中断,Get Descriptor请求没有出现。请问哪位大侠知道可能是什么原因吗?


先要去进行寄存器的读写,看看CH374读写函数是否正确. 参考CH374EVT中DEVICE.C程序.修改和你硬件相关的就可以了.


(1)D+、D-是否接反,正确的次序:Vcc、D-、D+、GND (2)USB线必须为屏蔽线,USB口外壳要接地 (3)软件上如4楼所说,对40H-7FH寄存器作读写测试,验证读写接口函数是否正确


寄存器数据读写现在都是正确的。 因为打印机启动后有一个操作系统初始化,硬件人员把D+上面的上拉电阻去掉了,这样会不会对主机这边设备的识别有影响?


CH374 UD+,UD-线上不要串接并接任何元器件.CH374内部上拉.


现在CH374芯片能收到主机发过来的Get Descriptor请求(而且只收到这个请求),我把设备描述符前面8个字节数据送入了端点0的发送缓冲区(0x20),也设置了端点0的控制寄存器,但是还是无法识别的USB设备。是不是我的Get Descripto请求处理有问题,比如说端点0的控制寄存器设置有问题,导致了后续的请求无法进行,所以设备无法识别。 说明:端点0发送缓冲区(0x20)写入的内容是正确的。


你首先一上电就读取0-15号寄存器,如果可以的话可以把数据帖出来看下,如果没有问题的话,那么你拿我们的CH374DEVICE。C这个程序修改下在去测试下看可以不可以。


是按这个C程序修改的,而且寄存器读取的内容也是正确的。只是有个疑问,端点0的缓冲区是8个字节,而Get Descriptor请求有18个字节,在CH374DEVICE.C里不知道是怎么处理的


你可以看下程序,在发完8个字节后,会产生一个中断,然后继续上传剩余的字节数,知道上传完毕.


这是寄存器初始化前后的数据 before init -----------index:0,regdata=0 before init -----------index:1,regdata=0 before init -----------index:2,regdata=80 before init -----------index:3,regdata=0 before init -----------index:4,regdata=d1 before init -----------index:5,regdata=0 before init -----------index:6,regdata=0 before init -----------index:7,regdata=f0 before init -----------index:8,regdata=0 before init -----------index:9,regdata=4 before init -----------index:a,regdata=ec before init -----------index:b,regdata=ed before init -----------index:c,regdata=0 before init -----------index:d,regdata=fb before init -----------index:e,regdata=0

初始化后: after init -----------index:0,regdata=0 after init -----------index:1,regdata=0 after init -----------index:2,regdata=80 after init -----------index:3,regdata=0 after init -----------index:4,regdata=89 after init -----------index:5,regdata=41 after init -----------index:6,regdata=3 after init -----------index:7,regdata=7 after init -----------index:8,regdata=0 after init -----------index:9,regdata=c0 after init -----------index:a,regdata=cc after init -----------index:b,regdata=ed after init -----------index:c,regdata=e after init -----------index:d,regdata=e after init -----------index:e,regdata=2

这是Get Descriptor请求信息: len_reg_data : 8 //寄存器中读出来的数据长度 the 0 data is:80 the 1 data is:6 the 2 data is:0 the 3 data is:1 the 4 data is:0 the 5 data is:0 the 6 data is:40 the 7 data is:0


这是bus hound捕获的信息 Bus Hound 5.00 capture. Complements of www.perisoft.net

Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------ ---------------- ------------------ 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 1.1.0(2) 14.0 DI 01 05 01 00 .... 1.2.0 14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 3.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 4.1.0(2) 14.0 DI 01 05 00 00 .... 4.2.0 14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 6.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 7.1.0 14.0 DI 00 85 11 00 .... 7.2.0 14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 8.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.1.0(3) 14.0 DI 00 85 01 00 .... 9.2.0 14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 12.1.0 14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 13.1.0 14.0 DI 00 05 00 00 .... 13.2.0 14.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 14.1.0 14.0 DI 00 05 00 00 .... 14.2.0 14.0 CTL a3 00 00 00 04 00 04 00 GET STATUS 15.1.0 14.0 DI 00 85 00 00 .... 15.2.0 14.0 CTL a3 00 00 00 05 00 04 00 GET STATUS 16.1.0 14.0 DI 03 05 00 00 .... 16.2.0 14.0 CTL a3 00 00 00 06 00 04 00 GET STATUS 17.1.0 14.0 DI 00 05 00 00 .... 17.2.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 18.1.0 14.0 DI 00 85 00 00 .... 18.2.0 14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 19.1.0 14.0 DI 00 05 00 00 .... 19.2.0 14.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 20.1.0 14.0 DI 00 05 00 00 .... 20.2.0 14.0 CTL a3 00 00 00 04 00 04 00 GET STATUS 21.1.0 14.0 DI 00 85 00 00 .... 21.2.0 14.0 CTL a3 00 00 00 05 00 04 00 GET STATUS 22.1.0 14.0 DI 03 05 00 00 .... 22.2.0 14.0 CTL a3 00 00 00 06 00 04 00 GET STATUS 23.1.0 14.0 DI 00 05 00 00 .... 23.2.0


如果出现这个可能你没有返回ACK给计算机,你确定拿我们的例子程序没有修改吗??


功能的实现都是按例子程序改的。 返回ACK给计算机是通过设置端点0的控制寄存器来实现的吧,这一步在数据放入端点0发送缓冲区之后就做了。 在发完8个字节后,会产生一个中断,这个中断是指传输中断中的SETUP中断还是端点0的IN中断?我这里只收到一个SETUP的Get Descriptor 中断,不像“在发完8个字节后,会产生一个中断,然后继续上传剩余的字节数,知道上传完毕”这个过程。


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