買了個(gè)T版模塊的CH341,從DSP傳送數(shù)據(jù)到PC,USB線1.5m,T版模塊到DSP引腳不超過20cm,用示波器看RXD波形很完整,但是波特率只能做到500Kbps,此時(shí)沒有誤碼,提高到625Kbps后就全是亂碼了。采用的協(xié)議是8bit,1個(gè)停止位,沒有奇偶校驗(yàn)。
但是,說明書里說是可以支持到2Mbps,不知哪里出問題了。
買了個(gè)T版模塊的CH341,從DSP傳送數(shù)據(jù)到PC,USB線1.5m,T版模塊到DSP引腳不超過20cm,用示波器看RXD波形很完整,但是波特率只能做到500Kbps,此時(shí)沒有誤碼,提高到625Kbps后就全是亂碼了。采用的協(xié)議是8bit,1個(gè)停止位,沒有奇偶校驗(yàn)。
但是,說明書里說是可以支持到2Mbps,不知哪里出問題了。
所用DSP的串口模塊最高支持2.5Mbps。 剛自己焊了一塊CH341A模塊,試了一下,還是只能到500kbps(沒有誤碼),625Kbps或更高頻率的話全是亂碼。
亂碼的產(chǎn)生是因?yàn)楦咚賯鬏斠鸬倪€是PC端因接收、處理、保存時(shí)間來不及,造成不能及時(shí)接收數(shù)據(jù)導(dǎo)致的接收混亂?PC端接收、處理和保存數(shù)據(jù)肯定是要花費(fèi)時(shí)間的。此外,DSP端要確保發(fā)送數(shù)據(jù)正確。當(dāng)提高發(fā)送數(shù)率后,是否DSP端程序出了問題?每個(gè)環(huán)節(jié)都要驗(yàn)證!
DSP端只是更改了SCI模塊的波特率,500Kbps對應(yīng)的寄存器值是5。625Kbps對應(yīng)的寄存器值是4。DSP程序完全沒變,程序采用輪訓(xùn),沒有緩存問題。
PC端采用ReadFile函數(shù)讀取數(shù)據(jù)后用WriteFile函數(shù)直接寫入硬盤文件,中間緩存大小為 0x8000 Byte。
出現(xiàn)這樣的原因可以是波特率誤差所導(dǎo)致,請看下面說明 ===============================================================
對于一些非標(biāo)準(zhǔn)波特率或者常規(guī)方法無法設(shè)置的高速波持率,CH341驅(qū)動程序提供特殊方法, 應(yīng)用程序可以按串口寫數(shù)據(jù)的方式間接設(shè)置CH341的串口通訊波特率,方法是: 設(shè)置CH341串口波特率為300,然后以ASCII碼字符串的命令包寫串口, 命令包的首字節(jié)必須是#,井字符,對應(yīng)的十六進(jìn)制數(shù)為23H, 命令包的中間為不超過7個(gè)數(shù)字表示的波特率,例如字符串9600或者921600等, 命令包的尾字節(jié)必須是_,下劃線,對應(yīng)的十六進(jìn)制數(shù)為5FH, 也就是說,將要設(shè)置的波特率以字符串的形式置于#字符和_字符之間,作為一個(gè)命令包, 在300bps下發(fā)送到CH341的串口,那么將被CH341驅(qū)動程序解釋為修改CH341的波特率, 而不會被作為數(shù)據(jù)從串口真正發(fā)出,當(dāng)該操作成功返回后, CH341實(shí)際工作于指定的新波特率,當(dāng)然,計(jì)算機(jī)系統(tǒng)及串口控件仍然以為是工作于300bps, 如果需要再次以這種方法改變波特率,那么首先要用常規(guī)方法將CH341的波特率置為300bps。
例如,用串口監(jiān)控/調(diào)試工具軟件演示: 1、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為6個(gè)ASCII碼數(shù)據(jù): #9600_ 發(fā)送成功后,CH341將實(shí)際工作于9600bps 2、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為8個(gè)ASCII碼數(shù)據(jù): #460800_ 發(fā)送成功后,CH341將實(shí)際工作于460800bps 3、將CH341串口的波特率選擇為300bps(有些工具軟件在選擇波特率后必須重新打開串口), 發(fā)出字符串命令包,為9個(gè)ASCII碼數(shù)據(jù): #1000000_ 發(fā)送成功后,CH341將實(shí)際工作于1000000bps
CH341串口支持50bps到2Mbps的波特率,當(dāng)應(yīng)用程序請求CH341改變串口通訊波特率時(shí), CH341驅(qū)動程序?qū)⒉ㄌ芈蕮Q算為波特率除數(shù),然后修改CH341芯片內(nèi)部的波特率除數(shù)寄存器, 所以設(shè)置CH341串口的通訊波特率實(shí)際上是設(shè)置CH341芯片內(nèi)部的波特率除數(shù)寄存器, 由于CH341內(nèi)部的串口基準(zhǔn)位時(shí)鐘為48/8=6MHz(或12MHz),并且波特率除數(shù)只支持整數(shù), 所以在指定波特率時(shí),應(yīng)該考慮實(shí)際換算誤差,在波特率大于19200bps時(shí)的計(jì)算方法是: X = 6000000 除以波特率后的值 Y = X 四舍五入后的值 誤差 = ( Y - X ) / X
以下為CH341支持的常用波特率,未注明的基準(zhǔn)位時(shí)鐘為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都可以支持,計(jì)算誤差時(shí)要考慮兩端的誤差之和。 但是為了可靠進(jìn)行通訊,建議不要使用誤差大于1%的波特率。
500Kbps沒有誤差,所以通訊正常,625Kbps誤差比較大為0.4%,所以出現(xiàn)了這樣的問題,如果使用750Kbps,1000Kbps。。??隙ㄒ矝]有問題
誤差是4%,寫錯了
嗯,還真是這個(gè)原因哈! 我還奇怪為什么625Kbps情況下,明明傳送了65534個(gè)數(shù)據(jù),為什么收到的是51920左右個(gè)數(shù)據(jù)...
剛剛試了一下833.333kbps,波特率偏差為2.78%,沒有誤碼。
再問幾個(gè)問題: 1、能否通過調(diào)整晶振頻率來改變CH341內(nèi)部的基準(zhǔn)時(shí)鐘,從而實(shí)現(xiàn)波特率的匹配?比如將12MHz的晶振換成7.5MHz的晶振,如此則最高波特率變成2Mbps*7.5/12=1.25Mbps。 2、能否將12MHz晶振換成頻率更高的晶振,比如15MHz,大概的上限是多少?
貌似不行是吧? 畢竟還要和USB的總線頻率匹配
是的,usb引擎要用到48MHZ時(shí)鐘,所以必須使用12M,然后內(nèi)部4倍頻,當(dāng)然USB引擎使用的時(shí)鐘也可以有誤差,所以使用12MHZ上下浮動一點(diǎn)USB也可以正常工作,但是可能不穩(wěn)定,不推薦這樣做!