如何使用PC并口與2線設(shè)備通信
本篇應(yīng)用筆記目的是演示如何使用PC并口構(gòu)建一種快速、簡(jiǎn)單和經(jīng)濟(jì)的2線(與I2C兼容)接口。雖然存在好多解決方案,在本篇筆記中給出的方案不需要微處理器、固件,也不存在購(gòu)買芯片的困難。而是通過(guò)Windows軟件,幫助解決同時(shí)調(diào)試硬件和軟件的困難。在給出的軟件的同時(shí),也給出幾個(gè)調(diào)試工具,能夠使硬件快速工作運(yùn)行。
本文引用地址:http://2s4d.com/article/202245.htm既然硬件并不與PC接口,不需要作標(biāo)準(zhǔn)的聲明。雖然給出的硬件和軟件一起構(gòu)建和測(cè)試,用戶使用有一定的風(fēng)險(xiǎn)。確保再三地檢查所有的連接和電源電壓,因?yàn)殡娫粗苯舆B接到PC的并口電路。Dallas Semiconductor/Maxim對(duì)可能引起的損害不負(fù)任何責(zé)任。本解決方案僅用于評(píng)估目的,不是用于產(chǎn)品或者發(fā)行品。雖然現(xiàn)在的軟件僅適用于Win95/98,將來(lái)的版本會(huì)支持Win NT。
為什么使用并口,而不是串口或者USB?
在本篇應(yīng)用筆記中選擇并口作為接口是因?yàn)槟繕?biāo)是建造一種快速、簡(jiǎn)單和經(jīng)濟(jì)的接口。這個(gè)并行接口是基于74HC05邏輯芯片和一些無(wú)源元件。另外一個(gè)方面,串口解決方案需要一個(gè)微處理器、固件、編程器或者系統(tǒng)可編程、電平轉(zhuǎn)換、晶體以及更多的無(wú)源器件。同樣地,USB除了工作量大的軟件和固件投入外,也需要相當(dāng)數(shù)目的硬件。而且調(diào)試USB硬件經(jīng)常需要昂貴的協(xié)議分析儀。因此,根據(jù)我們的目標(biāo),很明顯地選擇并口。然而在作出最終決定時(shí),必須分析缺點(diǎn)以確保這些缺點(diǎn)是可容忍的。
并口最大的缺點(diǎn)是它的未來(lái)。更多的PC制造商放棄了并口和串口,轉(zhuǎn)而支持USB。并口的另外一個(gè)缺點(diǎn)是大多數(shù)的配置需要在PC的BIOS里設(shè)置。這意味著在PC和硬件之間不能建立通信時(shí),PC必須重新啟動(dòng)才能進(jìn)入BIOS工具(通常在啟動(dòng)時(shí)按F1或者DEL鍵)設(shè)置并口配置。在工程或者評(píng)估環(huán)境中,中斷不會(huì)花費(fèi)太多時(shí)間,而一旦投入到市場(chǎng)中大量的支持將成為問(wèn)題。雖然更大的麻煩是PC之間的差異。因?yàn)椴⒖谑沁z留硬件,好多年來(lái)一直在發(fā)展變化和改進(jìn)。然而,在設(shè)計(jì)硬件時(shí),要使硬件能夠工作在老版本和新版本的并口上。這樣在設(shè)計(jì)接口硬件時(shí)必須作個(gè)假設(shè)(定時(shí)和電氣)。最后,另外一個(gè)缺點(diǎn)是操作系統(tǒng),在Windows NT系統(tǒng)中,需要設(shè)備驅(qū)動(dòng)程序。Windows NT不允許用戶程序直接讀/寫硬件寄存器。在軟件方面如果購(gòu)買驅(qū)動(dòng)程序的話是非常昂貴的。
幸運(yùn)的是,在評(píng)估環(huán)境中使用Windows 95和Windows 98并不是很麻煩,一旦軟件修正以支持Windows NT則不必在意這個(gè)話題。
硬件
圖1給出了并行2線接口原理圖。很容易獲得所有的元器件??墒褂帽碣N元件或者直插元件構(gòu)建接口。
圖1 PC 2線接口原理圖
該接口基于一個(gè)74HC05芯片構(gòu)建,在原理圖中以U1表示。74HC05包含六個(gè)集電極開(kāi)路輸出的反相器 。在本應(yīng)用中該芯片具有好幾個(gè)功能。首先,它為PC并口電路與下一級(jí)電路提供隔離功能。同時(shí)將并口的TTL信號(hào)轉(zhuǎn)成2線接口需要的集電極開(kāi)路輸出。集電極開(kāi)路輸出需要連接雙向SDA信號(hào)到一個(gè)專門的并口輸入引腳和一個(gè)專門的并口輸出引腳(與使用一個(gè)并口雙向引腳的情形相反,這通常需要用戶設(shè)置PC BIOS)。
既然2線接口的SCL信號(hào)對(duì)芯片來(lái)說(shuō)為僅輸入(不實(shí)現(xiàn)時(shí)鐘擴(kuò)展),可使用并口的D0產(chǎn)生SCL (PC DB-25連接器的引腳2),配置為輸出。 D0連接到74HC05反相器(U1E)的一個(gè)輸入。然而,一些并口可能不能輸出足夠高的電壓,反相器無(wú)法判斷電壓為高電平,所以電阻R3用作上拉電阻使接口對(duì)PC之間的差異不敏感。同樣地,為補(bǔ)償這種差異,電容C4作為一個(gè)空的元件包括進(jìn)去,如果與帶有噪聲的PC并口連接時(shí)可將C4安裝上去。對(duì)大多數(shù)應(yīng)用不需要該電容,但是如果PCB正在構(gòu)建,并不影響,至少包括電容的封裝。最后,反相器U1E的輸出為SCL。因?yàn)檩敵鰹槁O開(kāi)路,需要上拉電阻R1實(shí)現(xiàn)高電平邏輯。
另外一個(gè)方面SDA信號(hào)是雙向。使用一個(gè)輸入引腳(PC DB-25連接器引腳12)和一個(gè)輸出引腳(D1, PC DB-25連接器引腳3)實(shí)現(xiàn)雙向工作。從PC到2線設(shè)備的通信由產(chǎn)生SCL信號(hào)的同樣電路實(shí)現(xiàn)。并口的輸出D1連接到另外74HC05 (U1)的另一個(gè)反相器的輸入(U1A)。再?gòu)?qiáng)調(diào)一次,為保證并口高電平邏輯足夠高,反相器能夠正確判斷,上拉電阻R4將信號(hào)D1電平上拉到VCC。同樣地,電容C5作為一個(gè)空的元件,在遇到噪聲的并口時(shí)可安裝用以濾波。反相器的輸出為漏極開(kāi)路,需要R2實(shí)現(xiàn)高電平邏輯。
使用并口的一個(gè)輸入引腳(引腳12)和74HC05反相器(U1B)實(shí)現(xiàn)從2線設(shè)備到PC的SDA通信。應(yīng)該指出的是,為使設(shè)備能夠與PC通信,應(yīng)用軟件必須使D1為低電平,這樣反相器的輸出釋放SDA,允許2線設(shè)備控制SDA。反相器U1B的輸入監(jiān)視SDA。反相器的輸出通過(guò)R6上拉到VCC,R6負(fù)責(zé)判定高電平邏輯。串聯(lián)電阻R5用作沖突狀態(tài)下的保護(hù)。在這個(gè)例子中不需要串聯(lián)電阻,因?yàn)椴⒖诘囊_12僅用作輸入。如果使用并口引腳作為輸入輸出,在并口輸出高電平電壓且外部將高電平電壓加入到并口上時(shí)這個(gè)電阻變得非常重要。即使應(yīng)用軟件沒(méi)有導(dǎo)致沖突,可能另外一個(gè)程序也要在一段時(shí)間內(nèi)訪問(wèn)該端口(例如,操作系統(tǒng)周期性搜索打印機(jī))。
僅需要74HC05六個(gè)反相器中的三個(gè)用于實(shí)現(xiàn)2線通信,其余三個(gè)反相器并未沒(méi)用。為避免浪費(fèi),原理圖也包括了一個(gè)可選的電路,使用兩個(gè)未使用的門驅(qū)動(dòng)LED,可在軟件控制下開(kāi)啟或者關(guān)閉。并口引腳17為輸出引腳,用于控制反相器U1C和U1D,并行提供足夠的拉電流驅(qū)動(dòng)各種LED。電阻R7,與R3、R4一樣,使反相器輸入具有足夠高的電壓,確保高電平邏輯。電阻R8是LED限流電阻,用于控制LED的亮度。有趣的是,并口引腳17,對(duì)PC內(nèi)部有反相器。對(duì)引腳17寫0將轉(zhuǎn)化成高電平,在到達(dá)DB25之前。高電平輸入到U1C和U1D引起輸出低電平,打開(kāi)LED。
其余沒(méi)有用到的反相器輸入應(yīng)當(dāng)連接到GND,輸出高阻以防止沖突。
電容C1和C2用于電源電壓的旁路,盡量靠近PCB上電源。同樣地,去藕電容C3應(yīng)該盡可能靠近74HC05的VCC和GND放置。
當(dāng)連接SCL和SDA到2線設(shè)備時(shí),應(yīng)確保接口地與2線設(shè)備地共地。如果接口的SCL和SDA連接到包含2線設(shè)備的電路時(shí),注意R1和R2與應(yīng)用電路2線上拉電阻并聯(lián)。如果你計(jì)劃在電路內(nèi)與2線設(shè)備連接,可適當(dāng)調(diào)整R1和R2,如果應(yīng)用電路已經(jīng)有SDA和SCL上拉電阻,可去掉R1和R2。
最后,在原理圖中給出的,陰型DB25接口用在接口原型中。在原理圖中給出了制造商和器件型號(hào)以及陽(yáng)型DB25電纜。取決于電源,很容易使用陽(yáng)型DB25連接器和DB25陽(yáng)型到陰型電纜。
并口寄存器
PC與接口之間的通信使用三個(gè)寄存器中的四位實(shí)現(xiàn)(表1)。并口(LPT1)缺省基地址為378h。其余的兩個(gè)可能地址為3BCh和278h?;刂窞?位數(shù)據(jù)字節(jié)的地址。該字節(jié)包含控制引腳D7-D0的位,最低有效位(LSB)為D0。在數(shù)據(jù)字節(jié)后面、基地址+1處的字節(jié)為狀態(tài)字節(jié)。在給出的原理圖中,狀態(tài)字節(jié)的第5位(位0為L(zhǎng)SB)為SDA的輸入。狀態(tài)字節(jié)位5的讀數(shù)指示SDA的狀態(tài)(通過(guò)U1B的倒相)。在執(zhí)行讀操作之前,確保數(shù)據(jù)字節(jié)中的D1寫為低電平使得反相器U1A為高阻,允許反相器U1B檢測(cè)SDA的狀態(tài)。狀態(tài)字節(jié)之后基地址+2處的字節(jié)為控制字節(jié)。我們感興趣的是控制字節(jié)的位3(位0為L(zhǎng)SB)。位3通過(guò)PC內(nèi)部的反相器,然后輸出到PC的DB25接口的引腳17。該位使能LED或者使LED無(wú)效。讀寫該位的例子后面的章節(jié)給出。
校驗(yàn)和調(diào)試硬件
一旦硬件完成構(gòu)建,首先對(duì)硬件做仔細(xì)檢查。在連接到PC或者電源之前,確保所有的連接是安全的、正確的,且沒(méi)有短路存在。確保VCC沒(méi)有連接到地。一旦執(zhí)行這些防范措施后,連接5V電源到該接口(不要連接并口電纜)。如果電源有電流讀數(shù),確保電流不超過(guò)10mA到15mA。如果出現(xiàn)更大的電流,再三檢查所有連接。確保芯片連接正確,再次檢查可能用到的極性電容的極性,比如C1。另一個(gè)可能導(dǎo)致大工作電流是不正確的上拉電阻的阻值 ,比如使用470Ω代替4.7kΩ電阻會(huì)導(dǎo)致電流增大。
如果一切都正常,連接并口電纜。由于上拉電阻的存在,電流稍微發(fā)生變化。到此你可以試試附送的軟件,或者根據(jù)下一部分學(xué)會(huì)如何使用微軟的調(diào)試工具直接讀寫并口寄存器,這樣可以校驗(yàn)或者調(diào)試硬件。使用Debug Microsoft Windows 95和98和DOS工具Debug讀寫并口寄存器。雖然Windows NT包含Debug工具,但是操作系統(tǒng)不允許直接訪問(wèn)硬件。在NT使用Debug對(duì)硬件不會(huì)有任何效果。為運(yùn)行Debug,單擊Sart菜單選擇Run命令..在編輯框輸入Debug。帶“-”提示符的DOS窗口出現(xiàn)。圖2給出了Debug的屏幕截圖。很容易使用Debug。例如,讀字節(jié)地址378h,在提示符“-”后輸入: i 378
結(jié)果是從指定地址中讀出兩個(gè)數(shù)字(一個(gè)字節(jié))十六進(jìn)制數(shù)。可使用Debug寫存儲(chǔ)器。例如,將00h寫入378h,輸入以下然后回車。
建議小心使用Debug,僅可、訪問(wèn)已知的寄存器。訪問(wèn)其他的寄存器會(huì)可能導(dǎo)致未知或者不希望的副效果。鍵入q退出Debug, 鍵入?尋求幫助。這里給出使用Debug校驗(yàn)/條是硬件的例子(使用缺省的LPT地址)。圖2的Debug屏幕截圖給出了這些例子。
-i 378 讀數(shù)據(jù)字節(jié)。
-o 378 00 數(shù)據(jù)字節(jié)寫為00h。SDA和SCL輸出高電平。
-i 378 讀數(shù)據(jù)字節(jié)。這會(huì)返回00,因?yàn)閯倢懭?0。
-o 378 01 使SCL低電平,SDA高電平。
-o 378 02 使SDA低電平,SCL高電平。
-o 378 03 SDA 和SCL輸出低電平。
-o 378 00 在執(zhí)行下列命令時(shí)確保SDA為高電平。
-i 379 這返回SDA的狀態(tài)。如果位5為0,則SDA為高電平,如果位5為1,SDA為低電平。
注意要讀入SDA的值,數(shù)據(jù)字節(jié)應(yīng)首先寫入0, 這樣反相器(U1A)會(huì)釋放SDA。如果外部沒(méi)有將SDA拉低,位5讀入為0。
-o 378 02 使SDA為低電平。
-i 379 讀SDA狀態(tài),這時(shí)位5讀入為1。
為將LED開(kāi)啟和關(guān)閉。建議控制字節(jié)中未使用的的位保持不變??赏ㄟ^(guò)讀寄存器,然后使用與或者或操作設(shè)置清除位3。注意PC內(nèi)部
有反相器。
-i 37A 讀控制字節(jié)。可看到如屏幕截圖所示,PC返回0C(當(dāng)前LED關(guān)閉)。為打開(kāi)LED,位3必須清除,可用F7h與上控制字節(jié)的讀數(shù)。對(duì)于讀數(shù)0C,清除位3得到04。將其寫入控制字節(jié)會(huì)開(kāi)啟LED.
-o 37A 04 開(kāi)啟LED。
并口軟件工具
圖3給出了并口軟件的屏幕截圖,該軟件專為本篇應(yīng)用程序中的硬件設(shè)計(jì)??蓮囊韵碌刂废螺d: http://files.dalsemi.com/system_extension/AppNotes/AN3230/ParallelPort.exe 屏幕截圖可能與所下載的程序稍微有出入,因?yàn)檐浖锌赡芨倪M(jìn)了或者增添了功能。
軟件缺省的LPT地址為378h。如果發(fā)現(xiàn)軟件不能與硬件通信,可以選擇不同端口的地址。最容易判斷軟件是否與硬件通信的方法是單擊LED On和LED Off按鈕。如果成功,單擊Test按鈕,它控制D1 (U1A),從U1B讀入值。讀數(shù)結(jié)果會(huì)顯示在狀態(tài)欄里。
忽略同步脈沖。如果你希望使用示波器捕捉2線通信,可以使能同步脈沖,將示波器探針?lè)诺紻B25的引腳17上,作為觸發(fā)器。
到此,可以準(zhǔn)備與你已連接的2線設(shè)備通信了。確保設(shè)備的SDA, SCL和GND連接到硬件上。確保74HC05的VCC盡可能等于設(shè)備的VCC。
有兩種方法可以與設(shè)備通信,首先需要確保軟件知道2線設(shè)備從地址通信。軟件缺省地址為A0 (hex),這恰好為數(shù)字電壓表的地址,雖然這常取決于設(shè)備地址引腳,如果有許多的話。要改變2線設(shè)備地址,在編輯框中鍵入地址,單擊“Change”。如果不知道2線設(shè)備的地址,請(qǐng)檢查設(shè)備數(shù)據(jù)手冊(cè)。
最容易讀寫一個(gè)或者兩個(gè)字節(jié)設(shè)備寄存器的方法是使用軟件中的“One and Two Byte Reads/Writes”部分。該部分適合對(duì)設(shè)備編程/配置,因?yàn)?線設(shè)備中所有細(xì)節(jié)(start, stop, ACK, NACK, 等)自動(dòng)隱藏。只需要輸入需要的存儲(chǔ)器地址去讀或者讀或者寫。如果希望寫,用需要的數(shù)據(jù)填充“DATA”域。
與設(shè)備通信的另外一種方法是用“2-Wire Functions”部分,如果需要學(xué)習(xí)2線設(shè)備協(xié)議,這部分功能很適合。在演示例子之前,需要解釋幾個(gè)按鈕的含義。“Send Write”按鈕是用2線地址從2線地址域,將LSB (R/W位)屏蔽為0,然后發(fā)送8位。“Send Read”按鈕是用同樣的2線地址,但是將LSB (R/W位)屏蔽為1,指示下一步將進(jìn)行讀操作。8位數(shù)據(jù)發(fā)送。“Bus Reset”按鈕在SCL輸出9個(gè)時(shí)鐘周期,重新設(shè)置2線設(shè)備總線。
例子(使用缺省的從地址)
1. 寫存儲(chǔ)器地址7Fh到01h。
Start
Send Write
Data [7F]
Data [01]
Stop
2. 讀存儲(chǔ)器地址7Fh (一個(gè)字節(jié))。
Start
Send Write
Data [7F]
Start——通
常稱作重新讀。
Send Read - 這里使用Rd w/NACK - Rd w/NACK是因?yàn)閮H讀1個(gè)字節(jié)。
Stop
3. 讀存儲(chǔ)器地址F0h和F1h (多個(gè)字節(jié)讀)。
Start
Send Write
Data [F0]
Start
Send Read
Rd w/ACK - 如果超過(guò)2字節(jié)需要讀,命令會(huì)重復(fù)。
; Rd w/NACK - 最后的讀必須是w/NACK。
Stop
結(jié)論
本篇應(yīng)用筆記描述了如何使用PC并口構(gòu)建一個(gè)簡(jiǎn)單、經(jīng)濟(jì)和快速的2線接口。除了原理圖外,還提供軟件幫助構(gòu)建硬件。一旦硬件構(gòu)建完畢,軟件可立即用于與Dallas Semiconductor2線設(shè)備通信,不需要寫任何軟件。
更多計(jì)算機(jī)與外設(shè)信息請(qǐng)關(guān)注:21ic計(jì)算機(jī)與外設(shè)頻道
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
上拉電阻相關(guān)文章:上拉電阻原理
評(píng)論