文章目錄
8.1 串行通信的基本概念和EIA RS-232C串行口
8.1.1 串行/並行通信比較
計算機與外部的信息交換稱爲通信,基本的通信方式有兩種:並行通信,串行通信。
- 並行通信時,數據各位同時傳送。例如,CPU通過
8255A
與外設交換數據時,就採用並行通信方式。這種方式傳輸數據的速度快,但使用的通信線多,如果要並行傳送8
位數據,需要用8根數據線,另外還要加上一些控制信號線。
隨着傳輸距離的增加,通信線成本增加將成爲突出的問題,而且傳輸的可靠性隨着距離的增加而下降。 因此並行通信適用於近距離傳送數據的場合。 - 串行通信具有通信線少和傳送距離遠等優點。串行通信時,要傳送的數據或信息必須按一定的格式編碼,然後在單根線上,按位順序傳送。發送數據時,逐位發送完一個字符後再發第二個。接收數據時,逐位接收信息,再把它們拼成一個字符,送給CPU作進一步處理。
微機與遠程終端或遠距離處理機交換數據時,都採用串行通信方式。 有些外設,如MODEM、鼠標等,本身需用串行方式通信;有些外設,如打印機、繪圖儀等,既可採用並行方式,也可用串行方式。 - 當前,與外部的信息交換主要使用串行通信,計算機內部使用並行通信。因此,發送方在發送前要將並行數據轉成串行數據,接收方接收後要完成串行數據到並行數據的轉換。
下面詳細介紹串行通信方式。
8.1.2 串行通信基本概念
1. 串行通信定義和特點
串行通信是指計算機與外部設備以及計算機與計算機之間的信息傳輸可以通過一對傳輸線,將數據一位一位順序地傳送。它的傳輸線少、成本低、速度慢,適合遠距離通信。特點:
- 一對通信線,既要傳數據,又要傳控制信息
- 需要通信協議.
- 與TTL電平不兼容.
- 通信雙方約定波特率,控制通信速率.
2. 串行通信的數據傳送方式
根據數據傳送方向的不同,有三種方式:
- 單工方式
只使用一個信道,並且只允許數據按照一個固定的方向傳送,與廣播方式類似。 - 半雙工方式
只使用一個信道,允許數據在兩個方向傳輸,但是不能同時在兩個方向上傳送,只能交替進行,例如無線電對講機。 - 全雙工方式
使用兩個信道,允許數據在兩個方向傳輸,並且可以同時進行,例如電話。
3. 串行通信的兩種基本工作方式
串行通信基本方式:“同步”:通信的雙方要協調發送、接收之間的動作以確保發送、接收準確的信息。
通信協議:爲了實現同步,通信的雙方必須就同步方式、信息格式、傳輸控制步驟、差錯檢驗方式等問題定下一組共同遵守的規定,這種規定稱爲通信協議。
按同步方式的不同,串行通信有兩種基本方式:
- 異步方式——異步通信協議
- 同步方式——同步通信協議
(1) 異步方式通信ASYNC(Asynchronous
)
起止式異步通信:以字符爲單位進行傳輸的,兩個字符之間傳輸的時間間隔是不固定的,但在每一個字符內部的每一位是以固定的時間間隔來傳送的。
收、發雙方同步方法:
- 在字符格式中設置起始位和停止位;
- 接收端利用極性相反的起始位和停止位檢測新字符的開始
數據格式:起始位 1
位;數據位 5~8
位,D0
在先;奇偶校驗位1
位;停止位 1
位、1.5
位或 2
位。
- 發送
1
個包含7
個數據位的ASCII符,加上起、停、校驗位,共要發送10
位,會浪費30%
的傳輸時間。 - 爲提高串行數據傳送速率,可採用同步方式。
- 注意: 數據位、停止位的位數,校驗位的設置在不同的傳輸系統中可根據需要進行不同的設置,但在同一傳輸系統中,收方、發方的設置必須一致。
(2) 同步方式通信(Synchronous
)
以數據塊爲單位進行傳送。每個數據塊爲一幀,每幀包含若干個字符。不僅字符內部的位傳送是同步的,而且字符和字符之間傳送也必須是同步的。
因爲每幀信息內部的每一位都要求同步,所以收、發兩端必須使用同一時鐘源作爲時鐘信號。
同步方式通信中收、發雙方的同步方法:
- 所傳送的字符沒有起始位和停止位,不是用起始位表示字符的開始。
- 同步方法可分爲:
- 外同步:採用專用控制線來實現收、發的同步操作
- 內同步:每幀開始有同步字符或同步標誌碼, 同步方式通信時,每幀信息之間不允許有空隙,當線路空閒時,鬚髮送同步字符(標誌)。
- 單同步
- 雙同步
同步串行數據發送格式:
- 傳輸開始,先發送
1
或2
個同步字符。 - 收發雙方須用同一個時鐘協調,確定傳輸的每
bit
位置。 - 雙方達到同步後,就可逐個字符連續發送一大塊數據,不再需要起始位和停止位。
- 接收方利用同步字符,使其內部時鐘與發送方同步,將其後的數據逐位移入,轉換成並行格式。
同步方式通信的效率:同步方式採用同步字符(標誌)進行一幀信息的同步。在連續發送字符時,添加的附加信息遠遠少於異步通信,有較高的通信效率。
同時,同步方式通信中要求收、發時鐘完全一致,和異步方式通信比較,它的技術複雜、硬件開銷大。因此,同步方式通信適用於快速傳送、大量數據的環境。
4. 串行傳送速率
波特率(Baud Rate
)每秒傳送數據的位數,單位波特(Bd
),等於傳送每 bit
信息所用時間的倒數。
例如,設 1
個串行字符包含 10
位:1
個起始位、7
個數據位、1
個奇偶校驗位、1
個停止位,如每秒傳送 120
個字符,則波特率爲:10位/字符×120字符/秒=1200位/秒=1200波特
,傳送每位的時間:1s/1200=0.833ms
。
異步傳送常用波特率:110,300,600,1200,2400,4800,9600,19200,28800,36400,57600
波特。同步傳送波特率高於異步傳送,可達到上千兆波特。
5. 信道複用
時分多路複用TDM(Time Division Multiplexing
),就是將一條物理傳輸線路按時間分成若干時間片輪換地爲多個信號所佔用,每個時間片由複用的一個信號佔用。
頻分多路複用FDM(Frequency Division Multiplexing
)就是利用頻率調製原理,將要同時傳送的多個信號進行頻譜搬移,使它們互不重疊地佔據信道頻帶的不同頻率段,然後經發送器從同一信道上同時或不同時地發送出去。
計算機串行數據通信及其接口中使用時分多路複用系統。
8.1.3 串行通信接口芯片UART和USART
1. 通用串行接口芯片
常用的通用串行接口芯片爲:
- 通用異步收發器
UART
(Universal Asynchronous Receiver Transmitter
),只能異步工作。如National Semiconductor
的INS 8250
,IBM PC機中採用它作串行接口芯片。 - 通用同步異步收發器
USART
(Universal Synchronous Asynchronous Receiver Transmitte
),同步異步都可以。如Intel 8251A
。
接受方式:當 RxD
線上出現起始位,便開始接收 1
個字符。在CLK
控制下移進移位寄存器,轉換成並行數據,送入並行寄存器中,等CPU讀取。
- 若奇偶校驗出錯,置奇偶校驗出錯標誌。
- 自動檢測停止位,若無,置幀出錯標誌
FRERR
。 - 若前字符未取走,又送來1個,置溢出標誌
OVRN
。
發送方式:發送緩衝器把來自CPU的並行數據,加上起始位、停止位和奇偶校驗位等,並行串行變換後,從 TxD
一位一位發送出去。還設狀態信息:接收數據就緒(RDA),發送緩衝器空(TBE)等。
UART/USART
的主要功能:
- 發送時,用並行輸入、串行輸出移位寄存器,實現並行碼->串行碼變換後,再發送出去。
- 接收時,則用串行輸入、並行輸出寄存器,實現串行碼->並行碼變換後,再送給CPU。
- 傳送過程中,需要握手聯絡信號,確保雙方速度相同,並檢測傳送中的錯誤。
- 需要專門的可編程串行通信接口芯片,由編程來設定不同的工作方式、選擇不同的字符格式和波特率等。
2. 調制解調器
串行接口不適合長距離傳送。解決方式是:利用調製器可以將數字信號調製成模擬信號,能夠進行遠距離傳輸,然後再用解調器把模擬信號變換爲數字信號。能實現這種轉換的器件即調制解調器 MODEM
(Modulator Demodulator
)
比如說可用標準電話線進行遠程傳送,但電話線只能傳送 300~3000Hz
音頻信號,不能直接傳送頻帶很寬的數字信號。因此,可以先把數字信號轉換成音頻信號後,再利用電話線進行傳輸,接收數據時再將音頻信號轉換回數字信號。
數字調製常用的方法有幅度調製(調幅)、頻率鍵移調製(調頻)和相位鍵移調製 (調相),利用幅移鍵控ASK、頻移鍵控FSK和相移鍵控PSK使正弦波的幅值、頻率和相位隨着數字信號1和0變化。
(1)幅度調製
用改變信號幅度的方法來表示數字信號 0
和 1
。一種調幅方法爲: 當接通 f=387Hz
的正弦波時表示數字 1
,斷開時表示 0
,如圖
另一種方法是調幅時總是有正弦波輸出,但幅度不同,一種輸出幅度表示數字 0
,另一種表示 1
。
(2)頻率鍵移調製(FSK)
用一種頻率信號表示數字 0
,另一種表示 1
。如圖
爲了實現全雙工通信,常使用四種不同的頻率來表示不同方向上的兩種不同數字。
例如,對於Bell 103A,300Bd FSK MODEM標準,規定在一個方向上用2025Hz的頻率表示0,而用2225Hz表示1;另一個方向用1070Hz表示0,1270Hz表示1。
8.1.4 EIA RS-23C 串行口
在20世紀60年代,電子工業協會EIA(Electronic Industry Association
)開發了一個串行接口推薦標準 EIA RS-232C
。標準對串行接口電路中的插頭插座規格、各引腳名稱和功能、信號電平等做了統一規定。
1.信號電平
- 邏輯高電平:有負載時
-3V~-15V
,無負載時-25V
。 - 邏輯低電平:有負載時
+3V~+15V
,無負載時+25V
。 - 通常用
±12V
作RS-232C
電平。
計算機及接口芯片多采用 TTL
電平,即 0~0.8V
爲邏輯0,+2V~+5V
爲邏輯1。顯然與 RS-232C
電平不匹配,必須設計專門的電平轉換電路。
2.接插件規格
RS-232C
串行接口規定使用 25芯D型
插頭插座連接,引腳形狀和引腳號如圖(a)。也可用 9芯D型
插頭座, 如圖(b)。
圖中給出的都是凸型接插件。此外還有凹型接插件,使用時要注意插頭座上標的引腳序號。
3.信號定義
RS-232C
標準對 25芯
和 9芯
插件各引腳的信號名稱、功能等都做了具體規定,25芯
還有一些引腳未定義或保留。
TxD:發送數據,DTE → DCE
RxD:接收數據,DCE → DTE
DTR:DTE準備好,DTE → DCE
DSR:DCE準備好,DCE → DTE
RTS:請求發送,DTE → DCE
CTS:允許發送,DCE → DTE
RI:振鈴指示,DCE → DTE
DCD:載波檢出,DCE → DTE
SG:信號地
兩個地信號:保護地(1), 信號地(7)。信號地是所有信號的公共地, 爲防止信號地上感應大的交流地電流,應把兩個地連在一起。
兩根數據信號線: TxD
和 RxD
:
EIA
的邏輯1
表示數字位的1
或MARK
,即實際的負電壓-3V~-15V
。EIA
的邏輯0
表示數字位的0
或SPACE
,即實際的正電壓+3V~+15V
。- 常用三線傳輸的最小方式通信,只使用
TxD、RxD
及地線這3
根線通信。地線與25芯
插座的1、7
腳相連。
8.2 8250/16450串行通信芯片
8.2.1 8250/16450的結構及功能
1. 8250的引腳
除 Vcc
和 GND
外,其他信號可分成對系統和對通信設備。
2.8250的內部結構
注意:THR/RBR
指發送保持寄存器/接受緩衝寄存器。TSR
是發送移位寄存器。
有幾點需要注意:
- 只有
8
個端口地址; - :波特率的節拍信號;
- :輸入的一個基準的時鐘節拍,接的是
1.8432MHz
; - 的節拍信號是最終的工作過程中的波特率的
16
倍。 - 基準頻率 / 放入除數鎖存器的除數 = , / 16 =
端口地址的使用和共享情況如下:
8.2.2. 8250的內部寄存器及編程
1. 線路控制與狀態
① LCR
串行通信數據格式,W/R
:
其中:
D7
是DLAB
,標誌位;D6
設置間斷位;D5
附加位,爲1
時意味着發送的數據中存在附加的奇偶校驗位;D4
奇偶校驗位,是奇校驗還是偶校驗;D3
D2
停止位,是0
表示停止位只有1
位,否則可能是1.5
位或者2
位;D1D0
數據位的位數是5
位而D2=1
,則停止位是1.5
位;否則數據位爲6,7,8
位時停止位是兩位。
② LSR
串行數據收發狀態, R/W
(D6除外)
其中:
D4
:爲1
可以引發中斷;D3D2D1
:格式錯,校驗錯,溢出錯,其中有一位爲1
,就可以引發中斷。
2. 波特率控制
3. Modem控制與狀態
MCR
:Modem控制寄存器。高 3
位不用。D4=
;D3
輸出高低電平; D2
輸出高低電平;D1
請求發送; D0
數據終端設備就緒。
在 LOOP=1
的回送方式下,8250的發送、接收和Modem的中斷仍然工作,但Modem中斷源爲 MCR
低 4
位、非狀態輸入端,並受IER控制。改變 MCR
低 4
位,可產生Modem變化中斷。
8250中斷系統測試方法:向 LSR
低 6
位、MSR
低4位寫入適當值(寫1),中斷允許時,可產生中斷。
Loop方式返回正常工作時,重新編程8250,並將MCR置成全0。
D3=1
(即 引腳置 0
),中斷請求信號才能發出,因此我們需要先將其置爲 1
。此外,還要設定中斷允許寄存器。
4. 中斷允許與標識
中斷具有優先級別。
產生中斷時讀取中斷識別寄存器。高五位恆定爲零,低三位纔有用。
5. 數據收發
接受數據:(綠色區域爲中斷條件)
發送數據:
THRE=1
說明數據接受保持寄存器中的數據已經發送,爲空,發送中斷。
6. 8250初始化
整個過程如下:
① 測試8250/適配器存在——IIR
中斷識別寄存器高 5
位爲全 0
。(地址 3FA/2FA
)
② 設置波特率除數——LCR.DLAB=1
(線路控制寄存器D7=1
) ,DLL
(除數寄存器低字節3F8/2F8
) 和 DLH
(除數寄存器高字節3F9/2F9
) 。
③ 設置通道線路控制——LCR.DLAB=0
(線路控制寄存器D7=0
),設置LCR
(線路控制寄存器)各位。
④ 設置Modem控制:MCR
(Modem控制寄存器)中DTR=1、RTS=1、OUT1=0、OUT2=1
(中斷允許輸出)LOOP
。
⑤ 設置中斷允許:LCR.DLAB=0
(線路控制寄存器),IER
(中斷識別寄存器)。
7. 採用中斷方式的異步通信驅動程序編程要點
① 中斷初始化
修改中斷向量表中 COM1/COM2
對應的 0CH/0DH
的向量指向中斷程序,初始化 8250
:
- 置
IER
相應位,MCR.OUT2=
1→ ,信號能送到8259
的IR3
或IR4
。 - 根據通信規程,設置數據幀格式;根據波特率設置分頻除數
- 開放異步中斷:清除
8259 OCW
中的D3
或D4
位允許IR3
或IR4
上請求
② 主程序(根據應用自行編制)
③ 中斷服務程序
-
辨別發生中斷的中斷源:讀
IIR
,根據其中D2D1D0
和狀態轉入相應子程序。 -
中斷處理:
IIR
的D2D1D0
表示ID1、ID2、IP
,- 當
D2D1D0=110
,接收數據出錯,讀LSR
中D4D3D2D1
,判斷是間斷還是何種錯誤,轉相應處理子程序。 D2D1D0=100
,接收數據就緒,從RBR中讀數據存接收緩衝區。D2D1D0=010
,發送保持寄存器空,從發送緩衝區取數據送THR
。D2D1D0=000
,Modem狀態變化,讀MSR
中D3D2D1D0
,判斷是哪些Modem引腳改變了狀態,轉相應處理子程序。
–
判斷有無尚未處理的中斷請求:每種中斷源的中斷處理完之後,再次讀取
IIR
的D2D1D0
位,D0=0
,根據D2D1
轉入相應子程序;若D0=1
,說明8250
所有中斷處理結束,對8259
發EOI
命令返回被中斷的程序。 - 當
8. 8250/16450的編程
兩臺微機通過各自的異步通信口 COM1
按三線連接法通信,通信波特率爲 2400
。
1、初始化程序
MOV DX, 3FBH ;線路控制器
MOV AL, 80H ;往線路控制器LCR中寫DLAB=1,1000_0000=80H
OUT DX, AL ;DLAB=1
MOV DX, 3F9H ;向除數寄存器的高八位寫數
MOV AL, 0 ;AL=0
OUT DX, AL ;寫0
MOV DX, 3F8H ;向除數寄存器的低八位寫數
MOV AL, 30H ;1843200/(2400*16)=48寫除數48=30H
OUT DX, AL ;寫30H
;正式開始芯片初始化
MOV DX, 3FBH ;線路控制器
MOV AL, 1AH ;0001_1010 數據長7位, 1個停止位, 偶校驗
OUT DX, AL ;寫線路控制器
MOV DX, 3FCH ;Modem控制寄存器
MOV AL, 03H ;0000_0(out2=0,禁止中斷)01(請求發送)1(終端彙報)
OUT DX, AL ;寫入Modem控制寄存器
MOV DX, 3F9H ;中斷允許寄存器
MOV AL, 0 ;全部屏蔽
OUT DX, AL ;完成初始化
2、通信工作程序:用查詢方式進行通信
KEEP-TRY:
MOV DX, 3FDH ;線路狀態寄存器
IN AL, DX ;讀入AL
TEST AL, 1EH ;0001_1110 判斷BI/FE/PE/OE
JNZ ERROR-ROUTINE ;不等於0,處理error
TEST AL, 1 ;末位是1
JNZ RECEIVE ;去收
TEST AL, 20H ;0010_0000有沒有發的機會
JZ KEEP-TRY ;爲0,繼續try
MOV DX, 3F8H ;進入發的流程,發送寄存器
MOV AL, CL ;發的數據從CL來
OUT DX, AL ;發送數據
JMP SHORT KEEP-TRY ;繼續回到KEEP-TRY
RECEIVE: ;接受
MOV DX, 3F8H ;從數據寄存器中接受
IN AL, DX ;讀到AL中
...
3、綜合舉例
在 IBM PC
機上按查詢方式編寫發送程序,按中斷方式編寫接收程序。該程序能連續把符號 “*”
從串口 COM1
發送出去並在 CRT
上顯示;同時能把從串口 COM1
上接收到的字符顯示在 CRT
上,出錯時顯示標誌 “#”
。
;填寫中斷向量表
START: CLI ;關中斷
MOV AX, 0 ;
MOV ES, AX ;ES清0
MOV DI, 4*12 ;COM1口用中斷12號,12*4,偏移地址
MOV AX, OFFSET PRINT ;偏移地址
CLD ;
STOSW ;往中斷向量表中填寫偏移地址,將AX的內容寫入ES:DI指向的地方,DI+=2
MOV AX, CS ;MOV AX, SEG PRINT
STOSW ;往中斷向量表中填寫段地址,將AX的內容寫入ES:DI指向的地方
IN AL, 21H ;讀入屏蔽寄存器的內容
AND AL, 0EFH ;1110_1111
OUT 21H, AL ;對COM1的8259設置端口屏蔽,確保IR4不被屏蔽
;開始8250相關的操作
MOV DX, 3FBH ;DLAB線路控制器
MOV AL, 80H ;DLAB置爲1
OUT DX, AL ;寫入線路控制器
;寫除數
MOV DX, 3F8H ;
MOV AL, 0CH ;寫入的除數是12
OUT DX, AL ;
MOV AL, 0 ;
MOV DX, 3F9H ;
OUT DX, AL ;波特率設置爲9600
;正式初始化8250
MOV AL, 0BH ;DLAB=0,0000_1011奇校驗,1位停止位,8位數據位
MOV DX, 3FBH ;對LCR線路控制器寫入內容
OUT DX, AL ;
;
MOV DX, 3FCH ;設置Modem控制器
MOV AL, 0BH ;0000_1011OUT2打開,中斷方式
OUT DX, AL ;寫入內容
;
MOV DX, 3F9H ;IER操作中斷允許寄存器
MOV AL, 01H ;開啓接受數據中斷0000_0001
OUT DX, AL ;
;不用設置中斷識別器,因爲只有1箇中斷
STI ;開啓中斷
;主循環:發送
TR:
MOV DX, 3FDH ;線路狀態寄存器
IN AL, DX ;讀線路狀態
TEST AL, 20H ;0010_0000看看是否已經發送THRE=1
JZ TR ;繼續循環
MOV AL, '*' ;寫'*'
MOV DX, 3F8H ;
OUT DX, AL ;寫入THR/RBR
MOV AH, 02 ;通過中斷調用
MOV DL, AL ;顯示DL
INT 21H ;
JMP TR ;循環
;中斷服務程序, 接受數據,發起中斷
PRINT PROC
STI
PUSH DX
PUSH AX
;上面三句按部就班
MOV DX, 3FDH ;讀取線路狀態寄存器
IN AL, DX
TEST AL, 1EH ;和0001_1110相與
JNZ PERR ;不是0進入錯誤處理
MOV DX, 3F8H ;3F8數據口讀入
IN AL, DX ;接受數據
MOV DL, AL ;顯示數據
MOV AH, 02 ;
INT 21H ;
REND:
MOV AL, 20H ;對8259發送EOI命令
OUT 20H, AL
POP AX
POP DX
IRET ;上面5句按部就班
PERR: ;錯誤處理
MOV DX, 3F8H ;出了錯也要讀出來
IN AL, DX ;
MOV DL, '#' ;顯示'#'
MOV AH, 2 ;
INT 21H ;
JMP REND ;返回REND
PRINT ENDP