[原創(chuàng)]CH341A的使用幾點(diǎn)心得!

在我閱讀CH341A的PDF文檔時(shí),著實(shí)高興了一陣子,因?yàn)橛X(jué)得CH341A的使用太簡(jiǎn)單了,比菲利浦的PDIUSBD12簡(jiǎn)單得多(此前我一直用這個(gè)芯片做USB類產(chǎn)品),至少可以免寫驅(qū)動(dòng),而且價(jià)格還很便宜。國(guó)內(nèi)IC廠商能做出這樣的產(chǎn)品,值得鼓勵(lì)。于是上淘寶購(gòu)了幾片CH341A著手進(jìn)行測(cè)試。

測(cè)試的第一天晚上,使用的是CH341A的EPP1.7模式,無(wú)論如何發(fā)數(shù)據(jù),我的設(shè)備都不理。因?yàn)槲业脑O(shè)備端有CRC16校驗(yàn),數(shù)據(jù)出錯(cuò)就不予理睬,所以可以肯定是數(shù)據(jù)出錯(cuò)了。于是使用CH341EppWriteData,每次只發(fā)一個(gè)字節(jié),通訊成功,然而這個(gè)速度真吃不消,大約100Bytes/s。為什么多個(gè)字節(jié)一起發(fā)就不行呢?研究了一下EPP1.7的PDF,發(fā)現(xiàn)我的程序時(shí)序沒(méi)錯(cuò),而可能是CH341A的EPP1.7模式,并不等待nWAIT拉高就自行結(jié)束EPP周期,所以數(shù)據(jù)象流水般發(fā)送,我們的程序無(wú)法同步:前面的數(shù)據(jù)并未接收,后面的數(shù)據(jù)就覆蓋了它!這么說(shuō)來(lái),CH341A的EPP1.7可能是個(gè)貌似的EPP1.7,與標(biāo)準(zhǔn)的EPP1.7文檔中的可能不一樣。WCH的文檔并沒(méi)說(shuō)明,我只是根據(jù)測(cè)試現(xiàn)象猜測(cè)。

第二天,采用CH341A的EPP1.9模式。我之所以不太樂(lè)意用EPP1.9,因?yàn)镋PP1.9對(duì)WAIT信號(hào)很敏感,若數(shù)據(jù)寫入之后的10ms內(nèi),WAIT不被外設(shè)拉低,則置位超時(shí)標(biāo)志,強(qiáng)制結(jié)束EPP周期,而且需要人為清除超時(shí)標(biāo)志,才能啟動(dòng)下一個(gè)EPP周期,所以對(duì)于響應(yīng)不夠快的設(shè)備,EPP1.9并不適合。因?yàn)槲业脑O(shè)備是多任務(wù)的,通訊任務(wù)的優(yōu)先級(jí)較低,50ms內(nèi)都可能沒(méi)時(shí)間去處理通訊中斷。結(jié)果發(fā)現(xiàn)CH341A的EPP1.9竟然又是個(gè)貌似的EPP1.9,根本沒(méi)有10ms時(shí)限控制。這一下歪打正著,恰好我就是不需要這個(gè)超時(shí)控制的!于是修改了程序的時(shí)序:設(shè)備初始化拉低CH341A的WAIT引腳 -> CH341A的DS引腳從高跳低的下降沿觸發(fā)通訊中斷->設(shè)備接收數(shù)據(jù),然后拉高CH341A的WAIT引腳5us,通知CH341A結(jié)束當(dāng)前EPP周期 -> 設(shè)備拉低CH341A的WAIT引腳,通知CH341A啟動(dòng)下一EPP周期。經(jīng)過(guò)這樣的時(shí)序匹配,CH341A才真正和我的設(shè)備通訊起來(lái),速率可達(dá)220k/s左右。關(guān)于這點(diǎn),WCH的文擋也沒(méi)有說(shuō)明,我是萬(wàn)不得已才采用EPP1.9模式試試,才發(fā)現(xiàn)沒(méi)這個(gè)10ms時(shí)限控制!

可見(jiàn),WCH的文檔不夠詳細(xì)嚴(yán)密,否則就不要走這個(gè)彎路。大體上,我們對(duì)于EPP1.7和EPP1.9的了解,來(lái)自英文的標(biāo)準(zhǔn)文檔。所以個(gè)人認(rèn)為,與標(biāo)準(zhǔn)有所不同的地方,應(yīng)著重在文檔中申明。

但是,還是高興得太早!眾所周知,USB總線攜帶的數(shù)據(jù)包,帶有CRC16校驗(yàn)。所以當(dāng)數(shù)據(jù)發(fā)送到CH341A時(shí),理論上應(yīng)該是準(zhǔn)確無(wú)誤的,而CH341A在PCB上,與PCB上的CPU的距離不到1cm,完全就是CPU一個(gè)片外擴(kuò)展器件,若這么短的距離內(nèi)通訊,還出錯(cuò)的話,那CPU和片外所有的器件通訊,都要出錯(cuò),所以出錯(cuò)應(yīng)該在USB傳輸層。但我發(fā)現(xiàn)CH341A發(fā)送到CPU的數(shù)據(jù)還是很多錯(cuò)的。為了驗(yàn)證這個(gè)問(wèn)題,我在設(shè)備的PCB上加了個(gè)指示燈,每檢測(cè)到一個(gè)數(shù)據(jù)包的CRC16校驗(yàn)碼錯(cuò)誤,就閃爍一次指示燈。結(jié)果我所看到的情況是指示燈不停地閃(我的數(shù)據(jù)量一般在幾M字節(jié)以上,發(fā)送幾十字節(jié)幾k字節(jié)可能觀察不到)!USB傳輸層的錯(cuò)誤,我們還能有什么辦法?芯片對(duì)我們而言是黑盒子的,驅(qū)動(dòng)和應(yīng)用層API也對(duì)我們是黑盒子。但辦法總還是有的:對(duì)要發(fā)送的數(shù)據(jù),先自己封包,把封好的包使用CH341EppWriteData發(fā)出去,設(shè)備端再檢測(cè)包的正確性,錯(cuò)了通知應(yīng)用程序重發(fā)。我的包是這樣封的:握手的同步字符(2字節(jié)(我使用0xAA+0x55作為同步字符)) + 包號(hào)(2字節(jié)) + 數(shù)據(jù)流長(zhǎng)度 1字節(jié) + 數(shù)據(jù)流(最多255字節(jié)) + CRC16(2字節(jié))。一次連續(xù)通訊最多65535個(gè)包,每包最多255字節(jié),一次連續(xù)通訊可發(fā)16M數(shù)據(jù),一般的應(yīng)用可說(shuō)足夠了!經(jīng)過(guò)這樣處理后,CH341A終于和我們的設(shè)備可準(zhǔn)確無(wú)誤地通訊。準(zhǔn)確到什么程度呢?即使正在通訊時(shí),我把USB電纜不斷地拔出、插入,人為破壞其通訊,99%的情況下還能正確完成通訊。我使用Bus hound總線監(jiān)控軟件,可以清楚地看到錯(cuò)包重發(fā)的現(xiàn)象,很爽??吹竭@里,覺(jué)得問(wèn)題是不是應(yīng)該解決了?可是——

還是有一個(gè)問(wèn)題:CH341A頻繁隨機(jī)斷線問(wèn)題!CH341A斷線之后,必須拔出USB電纜再插入,才能重新連接上。前面說(shuō)過(guò),我改進(jìn)的通訊機(jī)制,已經(jīng)不怕通訊時(shí)拔出電纜再插入電纜。問(wèn)題是,很多設(shè)備是工作于無(wú)人值守的情況下,不可能專門安排個(gè)人去監(jiān)視設(shè)備的通訊。這個(gè)問(wèn)題的解決辦法其實(shí)并不復(fù)雜:控制CH341A的Reset In引腳。但目前的CH341A不夠方便,因?yàn)樗鼪](méi)有一個(gè)引腳通知CPU說(shuō)它斷線了,只能判斷多久沒(méi)有通訊事件發(fā)生,確定是否是斷線了,這會(huì)造成失誤。PDIUSBD12有個(gè)重連功能,當(dāng)斷線發(fā)生時(shí),GoodLink會(huì)熄滅,根據(jù)GoodLink的電平高低,就能知道是否斷線,這點(diǎn)非常適合無(wú)人值守的設(shè)備!若CH341A能內(nèi)置斷線重連功能,它的應(yīng)用范圍就寬了不少。目前,它只適合于一般性應(yīng)用,比方在無(wú)人值守的工業(yè)控制產(chǎn)品方面,根本就無(wú)法用。

應(yīng)該說(shuō),CH341A在數(shù)據(jù)量不大時(shí),通訊還是蠻可靠的,我測(cè)試了數(shù)據(jù)量在10k以下時(shí)的通訊質(zhì)量,很少會(huì)出錯(cuò)。僅這點(diǎn),做做下載線等一般性應(yīng)用就很方便。但是,在數(shù)據(jù)量較大時(shí),不經(jīng)過(guò)應(yīng)用層的嚴(yán)密處理,就幾乎沒(méi)法用。

CH341A的應(yīng)用,簡(jiǎn)單不?

現(xiàn)在遺留兩個(gè)問(wèn)題: 1、開(kāi)機(jī)不管插不插帶CH341A的設(shè)備,都彈出找到新硬件向?qū)В? 2、頻繁隨機(jī)斷線的問(wèn)題。雖然可控制CH341A的RESET引腳重連,但畢竟如何知道斷線了呢?

經(jīng)驗(yàn)證,控制CH341A的RESET IN引腳,可引起重連的效果(PC會(huì)響一聲,表示有設(shè)備插入),但有時(shí)實(shí)際上并沒(méi)有重連,因?yàn)閼?yīng)用程序有時(shí)不能收到CH341_DEVICE_ARRIVAL消息,不知何故。有時(shí)卻能收到


USB協(xié)議里面規(guī)定是要有CRC校驗(yàn)的,這個(gè)是有底層硬件來(lái)控制的,在一個(gè)傳輸事務(wù)(是USB中不能再分割的單位)中分3個(gè)階段,令牌(IN/OUT/SETUP)+數(shù)據(jù)(可選)+握手(ACK/NAK/STALL),如果有數(shù)據(jù)傳輸?shù)脑?,并且我們假設(shè)數(shù)據(jù)出現(xiàn)錯(cuò)誤,那么另一端在接受到數(shù)據(jù)出錯(cuò)的話肯定不是應(yīng)答ACK。 主機(jī)讀數(shù)據(jù): 主機(jī)(PC)發(fā)IN令牌,設(shè)備(341A)發(fā)數(shù)據(jù)(假如數(shù)據(jù)出錯(cuò)),主機(jī)發(fā)現(xiàn)數(shù)據(jù)出錯(cuò)什么也不發(fā),設(shè)備發(fā)現(xiàn)沒(méi)有握手,繼續(xù)發(fā)數(shù)據(jù),設(shè)備3次發(fā)都不成功進(jìn)超時(shí)一般會(huì)進(jìn)STALL,主機(jī)在沒(méi)收到數(shù)據(jù)的ACK會(huì)一直發(fā)IN。設(shè)備進(jìn)STALL,主機(jī)清端點(diǎn),然后重新開(kāi)始上述步驟傳輸數(shù)據(jù)。 主機(jī)寫數(shù)據(jù): 主機(jī)(PC)發(fā)OUT令牌,向設(shè)備發(fā)數(shù)據(jù)(假如數(shù)據(jù)出錯(cuò)),主機(jī)等待ACK確定,設(shè)備在發(fā)現(xiàn)數(shù)據(jù)出錯(cuò)的話,是不會(huì)發(fā)任何握手,這樣主機(jī)會(huì)重復(fù)2次上面步驟(發(fā)OUT令牌,向設(shè)備發(fā)數(shù)據(jù)),設(shè)備發(fā)現(xiàn)3次數(shù)據(jù)都發(fā)送錯(cuò)誤進(jìn)STALL。 設(shè)備進(jìn)STALL,同上。 上面是USB協(xié)議規(guī)定的,所以USB設(shè)備接受到的數(shù)據(jù)交給上層的時(shí)候是不會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)誤的,而你說(shuō)的數(shù)據(jù)出錯(cuò),應(yīng)該是341并口與你的CPU之間出錯(cuò)的。


理論上應(yīng)該如此。USB通訊攜帶的數(shù)據(jù)包在1024字節(jié)以內(nèi),使用的又是CRC16校驗(yàn),基本不可能出錯(cuò)。但我這里測(cè)試,數(shù)據(jù)量較少時(shí),基本都不會(huì)出錯(cuò),而數(shù)據(jù)量達(dá)到數(shù)M時(shí),我卻沒(méi)發(fā)現(xiàn)一次成功的通訊。若說(shuō)是CPU和CH341A之間的通訊錯(cuò)誤,那產(chǎn)品如何開(kāi)發(fā)?總不能說(shuō)CPU讀寫RAM芯片,都要進(jìn)行校驗(yàn)吧?在USB傳輸層無(wú)錯(cuò),那就可以理解為CH341A的引腳電平不穩(wěn)定,否則沒(méi)理由出錯(cuò),因?yàn)镃H341A離我的CPU也就1cm不到。

關(guān)于這個(gè)問(wèn)題已經(jīng)不很重要,因?yàn)槿绾伪WC通訊的絕對(duì)可靠,我已經(jīng)解決了。穩(wěn)定性已經(jīng)允許通訊期間,隨意拔插USB電纜了。

現(xiàn)在的問(wèn)題是:如何知道CH341A斷線了?CH341A斷線了如何可靠地重新連接上?因?yàn)槿斯ぐ尾宓姆椒?,太不招人喜歡,而且未必所有設(shè)備都是有人值守的。CH341A斷線之后,Windows設(shè)備管理器里還在,只是應(yīng)用程序無(wú)法和CH341A通訊了,拔插一下,馬上就好了。

我試了兩種方法:1、使用CH341ResetDevice函數(shù),但這個(gè)函數(shù)只是簡(jiǎn)單地復(fù)位一下CH341A,卻不能斷線重連,恢復(fù)通訊。再說(shuō),真正斷線了,API也無(wú)法訪問(wèn)CH341A了。 2、在硬件端檢測(cè)CH341A的Active引腳,發(fā)現(xiàn)Active引腳被拉高,則拉高CH341A的RSTI引腳,產(chǎn)生復(fù)位。問(wèn)題是,我發(fā)現(xiàn)CH341A的ACT引腳,斷線了它也還是低電平(有時(shí)會(huì)是高電平)。這個(gè)不確定性,硬件端又無(wú)法做到重連。如果CH341A的引腳與PDIUSBD12的GoodLink引腳一樣,那就好辦得多了。


你留個(gè)電話,這樣聯(lián)系快點(diǎn)。


13588867730


你說(shuō)的“現(xiàn)在的問(wèn)題是:如何知道CH341A斷線了?CH341A斷線了如何可靠地重新連接上?因?yàn)槿斯ぐ尾宓姆椒?,太不招人喜歡,而且未必所有設(shè)備都是有人值守的。CH341A斷線之后,Windows設(shè)備管理器里還在,只是應(yīng)用程序無(wú)法和CH341A通訊了,拔插一下,馬上就好了。” 這個(gè)問(wèn)題應(yīng)該是干擾造成的,如果把這個(gè)問(wèn)題解決了我們的芯片是不會(huì)頻繁出現(xiàn)你說(shuō)的斷線問(wèn)題,請(qǐng)查看下面的文檔! http://m.findthetime.net/download/list.asp?id=2


因?yàn)槲乙恢笔亲龉た胤矫娈a(chǎn)品的,所以對(duì)于接口保護(hù)比較熟悉?,F(xiàn)在的測(cè)試PCB上,我使用的是TVS管對(duì)D+、D-進(jìn)行Rail-To-Rail保護(hù)。正式產(chǎn)品中,則可能用USB接口專用保護(hù)組件stf202。我所要說(shuō)的是,保護(hù)只能增加穩(wěn)定性和防止損壞,但不能杜絕。而我希望的是:在不能杜絕的情況下,若能用軟方法產(chǎn)生拔插效果,基本就可杜絕了,除非PC系統(tǒng)除了問(wèn)題——這就與我們的產(chǎn)品無(wú)關(guān)。而且,軟方法拔插,不同于物理拔插,不會(huì)產(chǎn)生瞬變和尖鋒電壓。

做過(guò)工控產(chǎn)品開(kāi)發(fā)的都知道,有的東西是無(wú)人值守地長(zhǎng)年開(kāi)著的。還比監(jiān)控、安防產(chǎn)品,就拿云臺(tái)的控制來(lái)說(shuō),基本是全年全天候運(yùn)行,大多數(shù)時(shí)候無(wú)人值守。所以不僅僅是需要穩(wěn)定性,還需要“萬(wàn)一出問(wèn)題,自動(dòng)恢復(fù)正?!边@個(gè)功能。


用了很多時(shí)間。。CH341能用VB控制燈的開(kāi)與關(guān)了。。。但頻繁隨機(jī)斷線的問(wèn)題。要按復(fù)位。。。基本是全年全天候運(yùn)行,大多數(shù)時(shí)候無(wú)人值守。 哪個(gè)高手給個(gè) 用菲利浦的PDIUSBD12 用VB控制LED燈的電路圖。。或給個(gè)網(wǎng)址。。。。


我用CH341A做了個(gè)USB轉(zhuǎn)TTL串口的轉(zhuǎn)換器,用于STC單片機(jī)程序下載,工作很穩(wěn)定,速度能到14400kbps。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频