|
大多數(shù)的電腦設(shè)備都具有RS-232C接口,盡管它的性能指標(biāo)并非很好。在廣泛的市場(chǎng)支持下依然常勝不衰。 就使用而言,RS-232也確實(shí)有其優(yōu)勢(shì):僅需3根線(xiàn)便可在兩個(gè)數(shù)字設(shè)備之間全雙工的傳送數(shù)據(jù)。不過(guò),RS-232C的控制要比使用并行通訊的打印機(jī)接口更難于控制。RS-232C使用了遠(yuǎn)較并行口更多的寄存器。這些寄存器用來(lái)實(shí)現(xiàn)串行數(shù)據(jù)的傳送及RS-232C設(shè)備之間的握手與流量控制。本文將分別描述PC機(jī)及單片機(jī)MCS-51的串行通訊的原理及具體的軟件設(shè)計(jì)。 (1)RS-232C介紹與PC硬件: RS-232C使用-3到-25V表示數(shù)字“1”,使用3V到25V表示數(shù)字“0”,RS-232C在空閑時(shí)處于邏輯“1”狀態(tài),在開(kāi)始傳送時(shí),首先產(chǎn)生一起始位,起始位為一個(gè)寬度的邏輯“0”,緊隨其后為所要傳送的數(shù)據(jù),所要傳送的數(shù)據(jù)有最低位開(kāi)始依此送出,并以一個(gè)結(jié)束位標(biāo)志該字節(jié)傳送結(jié)束,結(jié)束位為一個(gè)寬度的邏輯“1”狀態(tài)。 PC機(jī)一般使用8250或16550作為串行通訊的控制器,使用9針或25針的接插件將串行口的信號(hào)送出。 該插座的信號(hào)定義如下: DB-25DB-9信號(hào)名稱(chēng)方向含 義 23TXD輸出數(shù)據(jù)發(fā)送端 32RXD輸入數(shù)據(jù)接收端 47RTS輸出請(qǐng)求發(fā)送(計(jì)算機(jī)要求發(fā)送數(shù)據(jù)) 58CTS輸入清除發(fā)送(MODEM準(zhǔn)備接收數(shù)據(jù)) 66DSR輸入數(shù)據(jù)設(shè)備準(zhǔn)備就緒 75SG-信號(hào)地 81DCD輸入數(shù)據(jù)載波檢測(cè) 204DTR輸出數(shù)據(jù)終端準(zhǔn)備就緒(計(jì)算機(jī)) 229RI輸入響鈴指示 以上信號(hào)在通訊過(guò)程之中可能會(huì)被全部或部分使用,最簡(jiǎn)單的通訊僅需TXD及RXD及SG即可完成,其他的握手信號(hào)可以做適當(dāng)處理或直接懸空,至于是否可以懸空這視乎你的通訊軟件。比如說(shuō),如果使用DOS所提供的BIOS通訊驅(qū)動(dòng)程序,那么,這些握手信號(hào)則需要做如下處理,因?yàn)锽IOS的通訊驅(qū)動(dòng)使用了這些信號(hào)。如果使用自己編寫(xiě)的串行驅(qū)動(dòng)程序則可以完全不使用這些握手信號(hào)(詳見(jiàn)下面有關(guān)章節(jié))。 PC機(jī)一般使用8250或16550的作為串行通訊控制器,8250及16550的管腳排列如下: 8250(16550)的寄存器如下表所示: 基地址讀/寫(xiě)寄存器縮寫(xiě)注 釋 0Write-發(fā)送保持寄存器(DLAB=0) 0Read-接收數(shù)據(jù)寄存器(DLAB=0) 0Read/Write-波特率低八位(DLAB=1) 1Read/WriteIER中斷允許寄存器 1Read/Write-波特率高八位(DLAB=1) 2ReadIIR中斷標(biāo)識(shí)寄存器 2WriteFCRFIFO控制寄存器 3Read/WriteLCR線(xiàn)路控制寄存器 4Read/WriteMCRMODEM控制寄存器 5ReadLSR線(xiàn)路狀態(tài)寄存器 6ReadMSRMODEM狀態(tài)寄存器 7Read/Write-Scratch Register PC機(jī)支持1-4個(gè)串行口,即COM1-COM4,其基地址在BIOS數(shù)據(jù)區(qū)0000:0400-0000:0406中描述,對(duì)應(yīng)地址分別為3F8/2F8/3E8/2E8,COM1及COM3使用PC機(jī)中斷4,COM2及COM4使用中斷3。 在上表中,8250共有12個(gè)寄存器,使用了8個(gè)地址,其中部分寄存器共用一個(gè)地址,由DLAB=0/1來(lái)區(qū)分,在DLAB=1用于設(shè)定通訊所需的波特率。常用的波特率參數(shù)見(jiàn)下表: 速率(BPS)波特率高八位波特率低八位 5009h00h 30001h80h 60000hC0h 240000h30h 480000h18h 960000h0Ch 1920000h06h 3840000h03h 5760000h02h 11520000h01h 以下幾個(gè)表格為8250的寄存器的功能描述: 中斷允許寄存器(IER): 位注 釋 7未使用 6未使用 5進(jìn)入低功耗模式(16750) 4進(jìn)入睡眠模式(16750) 3允許MODEM狀態(tài)中斷 2允許接收線(xiàn)路狀態(tài)中斷 1允許發(fā)送保持器空中斷 0允許接收數(shù)據(jù)就緒中斷 Bit0置1將允許接收到數(shù)據(jù)時(shí)產(chǎn)生中斷,Bit1置1時(shí)允許發(fā)送保持寄存器空時(shí)產(chǎn)生中斷,Bit2置1將在LSR變化時(shí)產(chǎn)生中斷,相應(yīng)的Bit3置位將在MSR變化時(shí)產(chǎn)生中斷。 中斷識(shí)別寄存器(IIR): 位注 釋 Bit6:7=00無(wú)FIFO Bit6:7=01允許FIFO,但不可用 Bit6:7=11允許FIFO Bit5允許64字節(jié)FIFO(16750) Bit4未使用 Bit316550超時(shí)中斷 Bit2:1=00MODEM狀態(tài)中斷(CTS/RI/DTR/DCD) Bit2:1=01發(fā)送保持寄存器空中斷 Bit2:1=10接收數(shù)據(jù)就緒中斷 Bit2:1=11接收線(xiàn)路狀態(tài)中斷 Bit0=0有中斷產(chǎn)生 Bit0=1無(wú)中斷產(chǎn)生 IIR為只讀寄存器,Bit6:7用來(lái)指示FIFO的狀態(tài),均為0時(shí)則無(wú)FIFO,此時(shí)為8250或16450芯片,為01時(shí)有FIFO但不可以使用,為11時(shí)FIFO有效并可以正常工作。Bit3用來(lái)指示超時(shí)中斷(16550/16750)。 Bit0用來(lái)指示是否有中斷發(fā)生,Bit1:2標(biāo)識(shí)具體的中斷類(lèi)型,這些中斷具有不同的優(yōu)先級(jí)別,其中LSR中斷級(jí)別最高,其次是數(shù)據(jù)就緒中斷,然后是發(fā)送寄存器空中斷,而MSR中斷級(jí)別最低。 FIFO控制寄存器(FCR): 位注 釋 Bit7:6=001Byte產(chǎn)生中斷 Bit7:6=014Byte產(chǎn)生中斷 Bit7:6=108Byte產(chǎn)生中斷 Bit7:6=1114Byte產(chǎn)生中斷 Bit5允許64字節(jié)FIFO Bit4未使用 Bit3DMA模式選擇 Bit2清除發(fā)送FIFO Bit1清除接收FIFO Bit0允許FIFO FCR可寫(xiě)但不可以讀,該寄存器用來(lái)控制16550或16750的FIFO寄存器。Bit0置1將允許發(fā)送/接收的FIFO工作,Bit1和Bit2置1分別用來(lái)清除接收及發(fā)送FIFO。清除接收及發(fā)送FIFO并不影響移位寄存器。Bit1:2可自行復(fù)位,因此無(wú)需使用軟件對(duì)其清零。Bit6:7用來(lái)設(shè)定產(chǎn)生中斷的級(jí)別,發(fā)送/接收中斷將在發(fā)送/接收到對(duì)應(yīng)字節(jié)數(shù)時(shí)產(chǎn)生。 線(xiàn)路控制寄存器(LCR): 位注 釋 Bit7=1允許訪(fǎng)問(wèn)波特率因子寄存器 Bit7=0允許訪(fǎng)問(wèn)接收/發(fā)送及中斷允許寄存器 Bit6設(shè)置間斷,0-禁止,1-設(shè)置 Bit5:3=XX0無(wú)校驗(yàn) Bit5:3=001奇校驗(yàn) Bit5:3=011偶校驗(yàn) Bit5:3=101奇偶保持為1 Bit5:3=111奇偶保持為0 Bit2=01位停止位 Bit2=12位停止位(數(shù)據(jù)位6-8位),1.5位停止位(5位數(shù)據(jù)位) Bit1:0=005位數(shù)據(jù)位 Bit1:0=016位數(shù)據(jù)位 Bit1:0=107位數(shù)據(jù)位 Bit1:0=118位數(shù)據(jù)位 LCR用來(lái)設(shè)定通訊所需的一些基本參數(shù)。Bit7為1指定波特率因子寄存器有效,為0則指定發(fā)送/接收及IER有效。Bit6置1會(huì)將發(fā)送端置為0,這將會(huì)使接收端產(chǎn)生一個(gè)“間斷”。Bit3-5用來(lái)設(shè)定是否使用奇偶校驗(yàn)以及奇偶校驗(yàn)的類(lèi)型,Bit3=1時(shí)使用校驗(yàn),Bit4為0則為奇校驗(yàn),1為偶校驗(yàn),而B(niǎo)it5則強(qiáng)制校驗(yàn)為1或0,并由Bit4決定具體為0或1。Bit2用來(lái)設(shè)定停止位的長(zhǎng)度,0表示1位停止位,為1則根據(jù)數(shù)據(jù)長(zhǎng)度的不同使用1.5-2位停止位。Bit0:1用來(lái)設(shè)定數(shù)據(jù)長(zhǎng)度。 MODEM控制寄存器(MCR): 位注 釋 Bit7未使用 Bit6未使用 Bit5自動(dòng)流量控制(僅16750) Bit4環(huán)路測(cè)試 Bit3輔助輸出2 Bit2輔助輸出1 Bit1設(shè)置RTS Bit0設(shè)置DSR MCR寄存器可讀可寫(xiě),Bit4=1進(jìn)入環(huán)路測(cè)試模式。Bit3-0用來(lái)控制對(duì)應(yīng)的管腳。 線(xiàn)路狀態(tài)寄存器(LSR): 位注 釋 Bit7FIFO中接收數(shù)據(jù)錯(cuò)誤 Bit6發(fā)送移位寄存器空 Bit5發(fā)送保持寄存器空 Bit4間斷 Bit3幀格式錯(cuò) Bit2奇偶錯(cuò) Bit1超越錯(cuò) Bit0接收數(shù)據(jù)就緒 LSR為只讀寄存器,當(dāng)發(fā)生錯(cuò)誤時(shí)Bit7為1,Bit6為1時(shí)標(biāo)示發(fā)送保持及發(fā)送移位寄存器均空,Bit5為1時(shí)標(biāo)示僅發(fā)送保持寄存器空,此時(shí),可以由軟件發(fā)送下一數(shù)據(jù)。當(dāng)線(xiàn)路狀態(tài)為0時(shí)Bit4置位為1,幀格式錯(cuò)時(shí)Bit3置位為1,奇偶錯(cuò)和超越錯(cuò)分別將Bit2及Bit1置位為1。Bit0置位為1表示接收數(shù)據(jù)就緒。 MODEM狀態(tài)寄存器(MSR): 位注 釋 Bit7載波檢測(cè) Bit6響鈴指示 Bit5DSR準(zhǔn)備就緒 Bit4CTS有效 Bit3DCD已改變 Bit2RI已改變 Bit1DSR已改變 Bit0CTS已改變 MSR寄存器的高4位分別對(duì)應(yīng)MODEM的狀態(tài)線(xiàn),低4位表示MODEM的狀態(tài)線(xiàn)是否發(fā)生了變化。 以上我們?cè)敿?xì)介紹了PC機(jī)的串行通訊硬件環(huán)境,以下將分別給出使用查詢(xún)及中斷驅(qū)動(dòng)的方法編寫(xiě)的串行口驅(qū)動(dòng)程序。這些程序僅使用RXD/TXD,無(wú)需硬件握手信號(hào)。 |