买了个T版模块的CH341,从DSP传送数据到PC,USB线1.5m,T版模块到DSP引脚不超过20cm,用示波器看RXD波形很完整,但是波特率只能做到500Kbps,此时没有误码,提高到625Kbps后就全是乱码了。采用的协议是8bit,1个停止位,没有奇偶校验。
但是,说明书里说是可以支持到2Mbps,不知哪里出问题了。
买了个T版模块的CH341,从DSP传送数据到PC,USB线1.5m,T版模块到DSP引脚不超过20cm,用示波器看RXD波形很完整,但是波特率只能做到500Kbps,此时没有误码,提高到625Kbps后就全是乱码了。采用的协议是8bit,1个停止位,没有奇偶校验。
但是,说明书里说是可以支持到2Mbps,不知哪里出问题了。
所用DSP的串口模块最高支持2.5Mbps。 刚自己焊了一块CH341A模块,试了一下,还是只能到500kbps(没有误码),625Kbps或更高频率的话全是乱码。
乱码的产生是因为高速传输引起的还是PC端因接收、处理、保存时间来不及,造成不能及时接收数据导致的接收混乱?PC端接收、处理和保存数据肯定是要花费时间的。此外,DSP端要确保发送数据正确。当提高发送数率后,是否DSP端程序出了问题?每个环节都要验证!
DSP端只是更改了SCI模块的波特率,500Kbps对应的寄存器值是5。625Kbps对应的寄存器值是4。DSP程序完全没变,程序采用轮训,没有缓存问题。
PC端采用ReadFile函数读取数据后用WriteFile函数直接写入硬盘文件,中间缓存大小为 0x8000 Byte。
出现这样的原因可以是波特率误差所导致,请看下面说明 ===============================================================
对于一些非标准波特率或者常规方法无法设置的高速波持率,CH341驱动程序提供特殊方法, 应用程序可以按串口写数据的方式间接设置CH341的串口通讯波特率,方法是: 设置CH341串口波特率为300,然后以ASCII码字符串的命令包写串口, 命令包的首字节必须是#,井字符,对应的十六进制数为23H, 命令包的中间为不超过7个数字表示的波特率,例如字符串9600或者921600等, 命令包的尾字节必须是_,下划线,对应的十六进制数为5FH, 也就是说,将要设置的波特率以字符串的形式置于#字符和_字符之间,作为一个命令包, 在300bps下发送到CH341的串口,那么将被CH341驱动程序解释为修改CH341的波特率, 而不会被作为数据从串口真正发出,当该操作成功返回后, CH341实际工作于指定的新波特率,当然,计算机系统及串口控件仍然以为是工作于300bps, 如果需要再次以这种方法改变波特率,那么首先要用常规方法将CH341的波特率置为300bps。
例如,用串口监控/调试工具软件演示: 1、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为6个ASCII码数据: #9600_ 发送成功后,CH341将实际工作于9600bps 2、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为8个ASCII码数据: #460800_ 发送成功后,CH341将实际工作于460800bps 3、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为9个ASCII码数据: #1000000_ 发送成功后,CH341将实际工作于1000000bps
CH341串口支持50bps到2Mbps的波特率,当应用程序请求CH341改变串口通讯波特率时, CH341驱动程序将波特率换算为波特率除数,然后修改CH341芯片内部的波特率除数寄存器, 所以设置CH341串口的通讯波特率实际上是设置CH341芯片内部的波特率除数寄存器, 由于CH341内部的串口基准位时钟为48/8=6MHz(或12MHz),并且波特率除数只支持整数, 所以在指定波特率时,应该考虑实际换算误差,在波特率大于19200bps时的计算方法是: X = 6000000 除以波特率后的值 Y = X 四舍五入后的值 误差 = ( Y - X ) / X
以下为CH341支持的常用波特率,未注明的基准位时钟为6MHz,未注明的误差小于0.16% 921600 (12MHz), 460800, 307200 (12MHz), 230400, 153600, 128000 (0.27%), 115200, 76800, 57600, 56000, 38400, 33600, 28800, 19200, 14400, 9600, 7200, 4800, 3600, 2400, 1800, 1200, 900, 600, 300, 150, 134.5, 110, 100, 75, 50, 2000000, 1500000, 1200000, 1000000, 750000, 500000, 375000, 250000, 200000, 187500, 100000, 93750, 75000, 50000, 25000, 10000 其它波特率只要误差小于2.5%,CH341都可以支持,计算误差时要考虑两端的误差之和。 但是为了可靠进行通讯,建议不要使用误差大于1%的波特率。
500Kbps没有误差,所以通讯正常,625Kbps误差比较大为0.4%,所以出现了这样的问题,如果使用750Kbps,1000Kbps。。。肯定也没有问题
误差是4%,写错了
嗯,还真是这个原因哈! 我还奇怪为什么625Kbps情况下,明明传送了65534个数据,为什么收到的是51920左右个数据...
刚刚试了一下833.333kbps,波特率偏差为2.78%,没有误码。
再问几个问题: 1、能否通过调整晶振频率来改变CH341内部的基准时钟,从而实现波特率的匹配?比如将12MHz的晶振换成7.5MHz的晶振,如此则最高波特率变成2Mbps*7.5/12=1.25Mbps。 2、能否将12MHz晶振换成频率更高的晶振,比如15MHz,大概的上限是多少?
貌似不行是吧? 毕竟还要和USB的总线频率匹配
是的,usb引擎要用到48MHZ时钟,所以必须使用12M,然后内部4倍频,当然USB引擎使用的时钟也可以有误差,所以使用12MHZ上下浮动一点USB也可以正常工作,但是可能不稳定,不推荐这样做!