總算把這個第七章復習完了,我把剩下一點關於8251A的發上來吧
本來在講解8251A書本上還有關於RS232和串口通信的講解,但是太淺了,就不放了,有興趣的朋友可以自行參考其他文章
串行通信芯片8251A
有以下特點
- 可以用於同步或者異步傳輸,同步0-64kbps,異步0-19.2kpbs
- 同步傳送的時候,5-8位/字符,可以用於內同步或者外同步,可自動插入同步字符
- 異步傳送的時候,5-8位/字符,有1,2,1.5個停止位
- 完全雙工,雙緩沖發送和接受數據
- 具有出錯檢查,奇偶校驗、溢出、和幀錯誤等檢測電路
好吧,為啥要這個8251A
因為計算機內部都是並行傳輸數據的,但是長距離通信都是用的串行通信的(這些概念不太明白的不懂的朋友可以自行百度一下概念或者看看書)
必須要個東西來轉化一下
8251
8251的內部結構
內部結構包括接收器,發送器,讀/寫控制邏輯,數據總線緩沖器和調制解調控制電路五大部分
接收器
包括接收緩沖器,並行轉換邏輯和接受控制電路三個部分
接收緩沖器對外引腳為RxD,功能是從此引腳上接收串行數據,然后轉換成並行數據,是由接受移位寄存器和接收數據緩沖器組成雙緩沖結構
接受控制電路是配合緩沖器工作的,作用如下
1 .在異步方式下,芯片復位后,先檢測輸入信號中的有效1,一旦檢測到到,就接着尋找有效的低電平來確定啟動位
2 消除假啟動干擾
3 對接收到的信息進行奇偶校驗,並根據校驗結果建立相應的狀態位
4 檢測停止位,並按檢測結構建立狀態位
發送器
和接收器差不多,也是有發送緩沖器,發送控制電路和並串轉換邏輯3個部分
發送緩沖器上面接的是TxD腳,發送數據緩沖器和發送移位寄存器組成了發送的雙緩沖結構,發送控制電路也是輔助發送緩沖器的,但是和接受的功能不一樣
發送控制電路作用如下
- 在異步方式下插入起始位,校驗位和停止位
- 在同步方式下,插入同步字符,在數據中插入校驗位
數據總線緩沖器
提供與8251A和CPU系統總線相連,在CPU執行輸入輸出操作的時候,進行數據交換或者讀寫命令
讀/寫控制邏輯電路
用來配合總線緩沖器工作
- 寫信號WR#,把數據總線的信號(數據/控制字)寫入8251A
- 讀信號RD#,將狀態/數據字發送到CPU(發到數據總線)
- 接收控制/數據信號C/D#,與讀。寫信號相結合,標識8251A正在處理的是數據還是控制字
- 接受時鍾信號CLK,完成8251內部定時
- 接受復位信號RESET,讓8251空閑
調制/解調控制電路
要進行遠程通信的時候,發送的時候調制器把數字信號轉化成模擬信號,接受的時候解調器把模擬信號轉化成數字信號,這些引腳也可以作為其他外設的控制數據傳輸的聯絡線
8251A外部引腳的定義
和CPU相連的信號
CS#,片選信號,由M/IO#和地址譯碼器得到
D0-D7 數據傳輸信號
RD# 讀信號,CPU從8251A中讀信息
WR# 寫信號,CPU寫入8251A
C/D# 控制/數據選擇信號,如果該信號為0,表示從數據總線中傳遞的是數據量,如果為1,表示現在數據總線上寫的是控制信息(用英文就很好記,control data)
8251只有兩個端口地址,數據端口是偶地址(輸入輸出是一個端口),控制信息是奇地址,在8086中是用A1來區分奇偶地址的,如果A1是0,就是偶地址,A1為1就是奇地址,這剛好和C/D#對應了,所以A1腳通常連接C/D#
TxRDY:發送器准備好,輸出,high,表示發送器已經准備好了,這表示發送數據緩沖器空的(沒空怎么發啊),CPU可以向8251A發送數據。如果用中斷形式的話,這個TxRDY也可以做中斷請求信號,如果是查詢方式就不斷查詢它就完事了
TxE 發送空信號,輸出,high,表示並串轉化器為空(數據要經過並串轉化器把並行數據轉化成串行數據才能發送)。如果8251獲得一個數據,TxE就為低。在同步方式下不允許字符串有間隔,但如果CPU來不及給8251A發送數據,則TxE就為1,插入同步字符
RxRDY,表示接受器准備好了,可以接受數據了,如果從外設接收到一個數據,等待CPU處理,當然也可以用中斷了,把這個當成中斷請求信號,程序查詢就查他就完事了
SYNDET:同步檢測/斷電檢測信號,高有效,輸出/輸入 同步方式時表示同步檢測,如果為內同步,作為輸出,輸出為1,表示找到同步字了;在外同步的時候,作為輸入,變高后,在RxC#(接收器時鍾)的下一個下降沿裝配字符,在異步方式下,作為空白檢測信號,輸出,如果接收到全0的字符,輸出高電平
和外設連接的信號腳
DTR# 數據終端准備好了,由8251A發給外設,表示CPU准備就緒
DER# 數據設備請求好了,由外設發給8251A,表示外設已經准備就緒
RTS# 請求發送信號,由8251A發送給外設,表示CPU已經准備好發送
CTS# 清除請求發送信號,由外設發送8251A,表示可以往外設發送數據
TxD 數據傳送端,CPU送到8251A的並行數據變成串行數據后,由TxD送往外設
RxD 數據接收端,數據從外設進入8251A后,變成並行數據
CLK 8251A的內部時序時鍾,同步要求是波特率的30倍,異步的話要求波特率的4.5倍
TxC,發送時鍾,輸入,控制字符的發送速度,同步是等於字符傳送的波特率,異步方式是初始化定義的
RxC,和TxC差不多,是控制接受端的接受速度
在實際中,把RxC和TxC連在同一個時鍾上,CLK是由另一個頻率更高的外部時鍾提供(啊引腳太多了,考試會給的)
8251A的工作方式
異步方式
- 接受
在異步方式准備接收一個字符的時候,RxD就在線上檢測低電平(沒有檢測的時候就是高電平),假如這個時候檢測到了低電平,8251A就會以這個低電平作為起始位,並且啟動內部定時計數器,當計數器到一半數位傳輸時間(比如初始設置時間脈沖為波特率的16倍),則定時器到第八個脈沖的時候,又重新對RxD進行取樣,如果仍為低電平就確定是一個有效的起始位,(如果這個時候為高電平了,8251A會認為剛剛低電平是一個干擾信號,這個過程就重頭開始了),8251就開始進行常規取樣並進行字符裝配(就是每隔一段時間對RxD進行采樣)數據進入移位寄存器后(並進行去掉奇偶校驗位和停止位),變成並行數據,在通過內部總線送到數據輸入寄存器,同時發出RxRDY信號到CPU,表示外設的數據已經收到了,是可用的。對於少於八位的,高位自動填零
- 發送
當程序把TxEn(允許發送信號)和CTS#(清除請求發送信號,不懂的朋友再仔細看看上文)后就開始發送。在發送的時候,發送器自動添加1個起始位,再按照初始化的格式添加奇偶校驗位,停止位。數據及起始位,校驗位,停止位總是在發送時鍾的TxC下降沿時發出
同步方式
- 接受
其實和異步也差不多,就是RxD先進行搜索同步字符,找到第一個數據了,送到移位寄存器移位,然后和同步字符的內容進行比較,相等就是找到了,SYNRET=1;開始接收數據塊,不相等就重新來(雙同步也差不多,就是第一次找到了再來一次,第二次找不到重頭開始找第一個字符) ,如果是外同步的話,如果SYNDET=1;的時候,直接開始,RxD就不用找起始位了直接開始采樣數據塊。
實現同步之后,就利用時鍾信號對RxD進行數據采樣,送到移位寄存器移位,然后從RxRDY引腳發出一個信號,表示已經收到了一個字符,一旦CPU讀完之后,這個RxRDY=0;
- 發送
發送也差不多,程序先對TxEN和CTS#初始化了,這個時候就開始發送,程序會先發1/2個同步字符,然后發送數據塊,發送數據塊的時候,發送器自動按初始化要求添加奇偶校驗位(沒有就不加)。如果8251正在發送的時候CPU來不及發送數據了(比如說遇到了中斷之類的),那么就會重新發1/2個同步字符,等待CPU。滿足了同步字符之間沒有空隙。
8251A的編程(當然是考試的重點啦)
必須按照下面的規定進行編程
- 芯片復位之后,第一次用奇地址寫控制字,在控制字中規定是同步還是異步
如果是同步,CPU會接着發1/2個字節就是同步字符,寫入同步字符寄存器,然后再把控制命令字寫入奇端口
如果是異步方式,CPU往奇端口輸出的一個字就是命令控制字
2. 在相關命令設置好了之后,只要不復位,用奇端口寫控制字,偶端口寫的是數據,送到數據輸出緩沖器中
工作模式字(寫入奇端口)
最低兩位如果為00,則為同步方式,否則就是異步方式
在同步方式下接受和發送的頻率同TxD和RxD相同,異步方式下,TxD/RxD=波特率因子*波特率
同步字符的控制命令字如下,從高到低說起
第一位是同步字符的位數,0是1個同步字符,1是2個同步字符
第二位決定是內同步還是外同步,0是內同步,1是外同步
第三位是奇偶校驗位,0是奇校驗,1是偶校驗
第四位是有沒有校驗,0是沒有校驗,1是有校驗
第五第六位是決定數據塊的位數,00是5位,01是6位,10是7位,11是8位
最后兩位必定是00
舉個例子,比如說現在要求發送的是同步方式,1個同步字符外同步,偶校驗,數據位是8位,那么初始化命令字就應該向奇端口(假如為FFF2H)寫01111100B,換成16進制就是79H
匯編初始化就應該是
MOV DX FFF2H
MOV AL 79H
OUT DX AL
現在看看異步通信的初始化命令字(從高到低)
前兩位是停止位的數目,00非法,01是1位,10是1.5位,11是2位停止位
第三位是EP(奇偶校驗類型),0為奇校驗,1為偶校驗
第四位是有無校驗,0是無,1是有
第五第六位是數據的大小,00是5位,01是6位,10是7位,11是8位
最后兩位是決定波特率因子(不能是00,00就表示同步通信了),01表示波特率因子為1,10表示波特率因子為16,11表示波特率因子為64
舉個例子,異步通信,1個停止位,無校驗,8個數據位(剛好最近在做單片機的串口通信,這就是8N1格式)波特率因子為16,則應該向奇端口(假設還是FFF2H吧)寫入01001110B,HEX格式為4EH
MOV DX, FFFEH
MOV AL, 4EH
OUT DX, AL
命令控制字格式
同步字符的控制命令字如下,從高到低說起
第一位是同步字符的位數,0是1個同步字符,1是2個同步字符
第二位決定是內同步還是外同步,0是內同步,1是外同步
第三位是奇偶校驗位,0是奇校驗,1是偶校驗
第四位是有沒有校驗,0是沒有校驗,1是有校驗
第五第六位是決定數據塊的位數,00是5位,01是6位,10是7位,11是8位
最后兩位必定是00
舉個例子,比如說現在要求發送的是同步方式,1個同步字符外同步,偶校驗,數據位是8位,那么初始化命令字就應該向奇端口(假如為FFF2H)寫01111100B,換成16進制就是79H
匯編初始化就應該是
MOV DX FFF2H
MOV AL 79H
OUT DX AL
現在看看異步通信的初始化命令字(從高到低)
前兩位是停止位的數目,00非法,01是1位,10是1.5位,11是2位停止位
第三位是EP(奇偶校驗類型),0為奇校驗,1為偶校驗
第四位是有無校驗,0是無,1是有
第五第六位是數據的大小,00是5位,01是6位,10是7位,11是8位
最后兩位是決定波特率因子(不能是00,00就表示同步通信了),01表示波特率因子為1,10表示波特率因子為16,11表示波特率因子為64
舉個例子,異步通信,1個停止位,無校驗,8個數據位(剛好最近在做單片機的串口通信,這就是8N1格式)波特率因子為16,則應該向奇端口(假設還是FFF2H吧)寫入01001110B,HEX格式為4EH
MOV DX, FFFEH
MOV AL, 4EH
OUT DX, AL
命令控制字格式
同步字符的控制命令字如下,從高到低說起
第一位是同步字符的位數,0是1個同步字符,1是2個同步字符
第二位決定是內同步還是外同步,0是內同步,1是外同步
第三位是奇偶校驗位,0是奇校驗,1是偶校驗
第四位是有沒有校驗,0是沒有校驗,1是有校驗
第五第六位是決定數據塊的位數,00是5位,01是6位,10是7位,11是8位
最后兩位必定是00
舉個例子,比如說現在要求發送的是同步方式,1個同步字符外同步,偶校驗,數據位是8位,那么初始化命令字就應該向奇端口(假如為FFF2H)寫01111100B,換成16進制就是79H
匯編初始化就應該是
MOV DX FFF2H
MOV AL 79H
OUT DX AL
現在看看異步通信的初始化命令字(從高到低)
前兩位是停止位的數目,00非法,01是1位,10是1.5位,11是2位停止位
第三位是EP(奇偶校驗類型),0為奇校驗,1為偶校驗
第四位是有無校驗,0是無,1是有
第五第六位是數據的大小,00是5位,01是6位,10是7位,11是8位
最后兩位是決定波特率因子(不能是00,00就表示同步通信了),01表示波特率因子為1,10表示波特率因子為16,11表示波特率因子為64
舉個例子,異步通信,1個停止位,無校驗,8個數據位(剛好最近在做單片機的串口通信,這就是8N1格式)波特率因子為16,則應該向奇端口(假設還是FFF2H吧)寫入01001110B,HEX格式為4EH
MOV DX, FFFEH
MOV AL, 4EH
OUT DX, AL
命令控制字格式
命令控制字還是寫入的是奇端口
看圖片吧,懶得打字了,一般EH位是用在內同步方式的,為1就開始搜索同步字,RTS(發送允許)(第三位)為1就讓RTS#有效(這初始化太容易混了),DTR,同理(數據終端准備好了),RxD接受有效,比如說0011 0111就是發送允許,接受允許,發送啟動,接受啟動,出錯復位,多看看前面引腳定義吧,我剛開始有點混,上面的例子是書上的,應該是不會錯的
還有一個狀態字格式(太多了…根本記不住啊)
DSR(這里對DSR#取了非)(表示外設准備好了的信號),如果為1就是准備好了
SYNDET (同步檢測/斷電端)
TxE 為1就是8251接收到CPU的數據了,正在向發送緩沖器發
FE 格式錯 OE 覆蓋錯誤,PE 奇偶校驗錯誤,這三個可以用命令控制字重新寫
大概就這些了,上面這些還是得多看看例子,書上例子,課后題多看看,這些就得看個人了,不多寫了,我就趕緊溜了去看題了,下個星期考試了