第七章终结篇——8251A的总结
总算把这个第七章复习完了,我把剩下一点关于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 奇偶校验错误,这三个可以用命令控制字重新写
大概就这些了,上面这些还是得多看看例子,书上例子,课后题多看看,这些就得看个人了,不多写了,我就赶紧溜了去看题了,下个星期考试了
第七章终结篇——8251A的总结的更多相关文章
- .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程
写在前面 这篇我们对用户权限进行极简设计并保留其扩展性.首先很感谢大家的阅读,前面六章我带着大家快速入门了ASP.NET Core.ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解 ...
- 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们 ...
- 我的OI生涯 第七章 终篇
11.10日. 我们TSOI再次来到了熟悉的燕山大学,只不过这次是真刀真枪的干了. 望着那座熟悉的小桥,身边的好友不知此行过后还有多少. 下午才到,出人意外的是这次没有住燕大宾馆而是选择了熟悉的格林豪 ...
- .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...
- Java语言程序设计(基础篇) 第七章 一维数组
第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...
- 一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档
接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方 ...
- 关于C++对汉字拼音的处理——终结篇
以前写过了3个博文,都是关于汉字转拼音的,后来发现都不是很“完美”的解决方案,第一个和第二个利用的unicode编码的范围进行确定汉字的拼音,但是难免有遗漏,这个在后面的实践中发现的,后来第三个方法是 ...
- JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)
前言:前面介绍了两篇关于bootstrap table的基础用法,这章我们继续来看看它比较常用的一些功能,来个终结篇吧,毛爷爷告诉我们做事要有始有终~~bootstrap table这东西要想所有功能 ...
随机推荐
- 02-MyBatis执行Sql的流程分析
目录 获取Mapper 简单总结 重要类 参考 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存.动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧. 还是以之前的 ...
- maven聚合(依赖聚合)
maven聚合工程 原文地址:http://juvenshun.iteye.com/blog/305865 http://blog.csdn.NET/woxueliuyun/article/detai ...
- [java] 计算时间复杂度
一.精算: 1.所有的声明,都不计时间: 2.赋值语句占1个时间单位(下称:单位),比如sum=0: 3.return占1个单位,比如,reeturn sum. 我怀疑范围一个链表头,不止占1 ...
- 这份最新Python面试精选问题你会几道?
相信很多小伙伴学python以后都想进大厂,但是进大厂前你得了解些大厂面试题,可以在面试前复习下,以下是精选的5道python面试题: 第一. Python 的特点和优点是什么? Python 可以作 ...
- mysql 创建用户及授权(1)
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...
- vim可视化模式
进入:v 移动光标选中 c剪切.y复制(自动退出v模式,进入插入模式) p粘贴
- shell脚本2——控制语句
1.顺序结构体 命令从上往下顺序执行 2.分支结构体 1)判断真假 test 表达式 或者 [ 表达式 ](必须有空格) 真返回0,假返回1 test的别名是[, 参数是] 判断表达式 记忆 解释 ! ...
- mongodb存储二进制数据
mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...
- NIO流的学习以及Buffer的相关操作
NIO的使用 一).什么叫NIO? 定义:是一套新的Java I/O标准, 在java1.4中被纳入JDK中. 二).NIO的实现方法 NIO是基于块的, 以块为基本单位处理数据. 标准的I/O是基于 ...
- 部署k8s集群监控Heapster
git clone https://github.com/kubernetes/heapster.gitkubectl apply -f heapster/deploy/kube-config/inf ...