第七章终结篇——8251A的总结

总算把这个第七章复习完了,我把剩下一点关于8251A的发上来吧

本来在讲解8251A书本上还有关于RS232和串口通信的讲解,但是太浅了,就不放了,有兴趣的朋友可以自行参考其他文章

 串行通信芯片8251A

有以下特点

  1. 可以用于同步或者异步传输,同步0-64kbps,异步0-19.2kpbs
  2. 同步传送的时候,5-8位/字符,可以用于内同步或者外同步,可自动插入同步字符
  3. 异步传送的时候,5-8位/字符,有1,2,1.5个停止位
  4. 完全双工,双缓冲发送和接受数据
  5. 具有出错检查,奇偶校验、溢出、和帧错误等检测电路

 好吧,为啥要这个8251A

因为计算机内部都是并行传输数据的,但是长距离通信都是用的串行通信的(这些概念不太明白的不懂的朋友可以自行百度一下概念或者看看书)

必须要个东西来转化一下

8251

8251的内部结构

内部结构包括接收器,发送器,读/写控制逻辑,数据总线缓冲器和调制解调控制电路五大部分

 

 

 

接收器

包括接收缓冲器,并行转换逻辑和接受控制电路三个部分

接收缓冲器对外引脚为RxD,功能是从此引脚上接收串行数据,然后转换成并行数据,是由接受移位寄存器和接收数据缓冲器组成双缓冲结构

接受控制电路是配合缓冲器工作的,作用如下

1 .在异步方式下,芯片复位后,先检测输入信号中的有效1,一旦检测到到,就接着寻找有效的低电平来确定启动位

2 消除假启动干扰

3 对接收到的信息进行奇偶校验,并根据校验结果建立相应的状态位

4 检测停止位,并按检测结构建立状态位

 

 

发送器

和接收器差不多,也是有发送缓冲器,发送控制电路和并串转换逻辑3个部分

发送缓冲器上面接的是TxD脚,发送数据缓冲器和发送移位寄存器组成了发送的双缓冲结构,发送控制电路也是辅助发送缓冲器的,但是和接受的功能不一样

发送控制电路作用如下

  1. 在异步方式下插入起始位,校验位和停止位
  2. 在同步方式下,插入同步字符,在数据中插入校验位

 

数据总线缓冲器

提供与8251A和CPU系统总线相连,在CPU执行输入输出操作的时候,进行数据交换或者读写命令

 

读/写控制逻辑电路

用来配合总线缓冲器工作

  1. 写信号WR#,把数据总线的信号(数据/控制字)写入8251A
  2. 读信号RD#,将状态/数据字发送到CPU(发到数据总线)
  3. 接收控制/数据信号C/D#,与读。写信号相结合,标识8251A正在处理的是数据还是控制字
  4. 接受时钟信号CLK,完成8251内部定时
  5. 接受复位信号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的工作方式

异步方式

  1. 接受

在异步方式准备接收一个字符的时候,RxD就在线上检测低电平(没有检测的时候就是高电平),假如这个时候检测到了低电平,8251A就会以这个低电平作为起始位,并且启动内部定时计数器,当计数器到一半数位传输时间(比如初始设置时间脉冲为波特率的16倍),则定时器到第八个脉冲的时候,又重新对RxD进行取样,如果仍为低电平就确定是一个有效的起始位,(如果这个时候为高电平了,8251A会认为刚刚低电平是一个干扰信号,这个过程就重头开始了),8251就开始进行常规取样并进行字符装配(就是每隔一段时间对RxD进行采样)数据进入移位寄存器后(并进行去掉奇偶校验位和停止位),变成并行数据,在通过内部总线送到数据输入寄存器,同时发出RxRDY信号到CPU,表示外设的数据已经收到了,是可用的。对于少于八位的,高位自动填零

  1. 发送

当程序把TxEn(允许发送信号)和CTS#(清除请求发送信号,不懂的朋友再仔细看看上文)后就开始发送。在发送的时候,发送器自动添加1个起始位,再按照初始化的格式添加奇偶校验位,停止位。数据及起始位,校验位,停止位总是在发送时钟的TxC下降沿时发出

同步方式

  1. 接受

其实和异步也差不多,就是RxD先进行搜索同步字符,找到第一个数据了,送到移位寄存器移位,然后和同步字符的内容进行比较,相等就是找到了,SYNRET=1;开始接收数据块,不相等就重新来(双同步也差不多,就是第一次找到了再来一次,第二次找不到重头开始找第一个字符) ,如果是外同步的话,如果SYNDET=1;的时候,直接开始,RxD就不用找起始位了直接开始采样数据块。

实现同步之后,就利用时钟信号对RxD进行数据采样,送到移位寄存器移位,然后从RxRDY引脚发出一个信号,表示已经收到了一个字符,一旦CPU读完之后,这个RxRDY=0;

  1. 发送

发送也差不多,程序先对TxEN和CTS#初始化了,这个时候就开始发送,程序会先发1/2个同步字符,然后发送数据块,发送数据块的时候,发送器自动按初始化要求添加奇偶校验位(没有就不加)。如果8251正在发送的时候CPU来不及发送数据了(比如说遇到了中断之类的),那么就会重新发1/2个同步字符,等待CPU。满足了同步字符之间没有空隙。

 

8251A的编程(当然是考试的重点啦)

必须按照下面的规定进行编程

  1. 芯片复位之后,第一次用奇地址写控制字,在控制字中规定是同步还是异步

如果是同步,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 奇偶校验错误,这三个可以用命令控制字重新写

大概就这些了,上面这些还是得多看看例子,书上例子,课后题多看看,这些就得看个人了,不多写了,我就赶紧溜了去看题了,下个星期考试了

posted on 2019-12-11 14:46  Kevin_Weng  阅读(4443)  评论(0编辑  收藏  举报