[专业课笔记] 单片机 第七章 8951串行口
正文
基本知识
数据通信
本机的CPU到其他设备中间常常会有信息交换, 而本机和其他计算机之间常常也会进行信息的交换
通信的方式有两种:
- 并行通信
- 串行通信
往往通过数据传送距离来判断选择哪一种方式
对PC而言, 30m是一个分水岭, 小于30m, PC间往往采用并行通信, 反之, 就使用串行通信
8951这两种通信方式都具有
并行通信
指数据的各位同时进行传输的通信方式
优点是传送速度快, 缺点是数据有多少位, 传送线就需要多少根
因此, 并行通信在位数多且距离远时就不适用了
例如8951和打印机之间的数据传送就属于并行通信
下图为8951和外设间8位信息传送并行通信的连接方法
串行通信
串行通信的传送方式有3种
- 单工(单向)配置
只允许数据向一个方向传送 - 半双工(半双向)配置
允许数据在两个方向上传送, 但每次只能有一方在发送 - 全双工(全双向)配置
允许同时双向传送数据, 物理上是一对单向配置, 因此要求两端的通信设备都具有完整独立的发送接收能力
异步通信和同步通信
通常, 对于串行通信来说, 按双方时钟情况来分, 有两种通信方式
- 异步通信
- 同步通信
异步通信
此时通信双方的时钟是相互独立的, 双方的数据发送和接收可以不在同一时刻进行(即所谓异步), 但是双方必须遵守相同的通信协议, 包括相同的数据格式和相同的通信速率
在异步通信中, 数据是以帧为单位完成一次收发的传送的(通常包括 一字节\字符 的 数据\代码 )
一帧依次由四部分组成: 起始(标识)位, 数据位, 奇偶效验位, 和停止位
- 起始位 :占 1 位, 值为 0 , 路线上没有数据时保持为1, 当有数据到来时检测到0,就表示应当马上准备接收
- 数据位 :占 5~8 位, 规定低位在前高位在后
- 奇偶效验位:占 1 位, 可以在字符里指定省去, 也可以用来表示这帧的字符的性质(地址\数据)
- 停止位 :可以是占用 1 位, 1.5 位, 2 位, 值一定是 高电位 \ 1 , 如果停止位之后不是紧接着下一个字符则保持高电位
例如, 规定使用ascii码时, 字符数据占7位, 加起始停止各一位和1位奇偶校验位, 一共一帧10位
同步通信
此时通信双方的物理时钟是相同的, 数据的收发同时进行
同步通信中, 在数据开始传送之前用 同步字符 来指示(一般约定为 1~2 个字符), 并且由时钟来实现发送端和接收端同步, 当检测到规定的同步字符之后, 接下来就连续按顺序传送数据, 直到通信告一段落
同步通信期间, 字符之间没有间隙, 也不需要起始位和停止位, 仅在数据块开始传送时用同步字符SYNC来指示
可以采用ascii码的同步字符SYNC, 值为16h, 用户也可以自行约定同步字符
在同步传送时, 要求用时钟来实现发送端和接收端之间的同步, 为保证接收准确无误, 发送方就需在传送数据之外, 同时传送时钟信号
同步传送可以提高传输速率( 56kb\s 或 更高), 但硬件比较复杂
波特率
即数据传输速率, 指每秒发送的二进制码位数, 单位是b\s, 它的值的确定对CPU和外界的通信很重要
波特率计算方法: 每字符占二进制码位数 * 每秒发送字符数
则每位字符的传送时间即为波特率的倒数
串行通信的过程和通信协议
串并转换和设备同步
保证两个通信设备在串行线路上成功实现通信必须解决两个问题:
- 串并转换
即如何要发送的数据串行化, 又如何将将接收的数据并行化 - 设备同步
即同步发送设备和接收设备的工作节拍, 以确保发送的数据在接收端被正确读出
串并转换
发: 在串行发送前, 计算机将内部并行数据送入移位寄存器, 并一位一位地移出, 将内部并行数据转换成串行数据, 再通过一根通信线传送
收: 来自通信线路的串行数据被送入移位寄存器, 满8位后并行送到计算机内部
在串行通信控制电路中, 串并转换逻辑被集成到出现异步通讯控制芯片里, 8951的串行口和IBM-PC机中的8250芯片都能实现这一功能
设备同步
进行串行通信的两台设备必须同步工作, 才能有效地检测通信线路上的信号变化, 从而采样传送数据脉冲
设备同步的对双方的要求是:
- 采用同样的编码方法
以确定一个字符的二进制表示值的位发送顺序和位串长度, 以及电平信号高低和逻辑10的固定对应关系 - 双方必须产生相同的传送速率
串行通信协议
存在同步和异步两种协议, 此处只讨论异步串行通信协议和其规定的字符数据传送格式(按先后顺序)
- 起始位
- 数据位
- 奇偶校验位
取决于双方约定选择奇校验还是偶校验, 如果选择奇校验, 则字符数据位和校验位的逻辑1的位数和为奇数; 同理于偶校验, 字符数据位和校验位的逻辑1的位数和为偶数 - 停止位
- 波特率设置
数据传送时每位信号都保持一致的信号持续时间, 持续时间由数据传输速度(每秒多少位二进制位)决定, 即波特率 - 挂钩(握手)信号约定
串行口及其应用
8951单片机的串行口
8951有个可编程全双工串行通信接口, 可用作UART(), 也可用作同步移位寄存器
帧格式支持 8位, 10位 或 11位, 并能设置各种波特率, 具有很大的灵活性
结构
8951通过引脚RXD(p3.0, 串行数据接收端)和TXD(p3.1, 串行数据发送端)与外界进行通信
下图中由两个物理上独立的接收和发送缓冲器SBUF, 占用同一地址99h, 可同时发送接收数据(在一周期不同时期段里)
发送缓冲器只写, 接收缓冲器只读
串行口控制和控制寄存器
8951的串行口是可编程接口, 对他初始化编程只用两个控制字分别写入特殊功能寄存器SCON和电源控制寄存器PCON中即可
SCON(98h)
8951串行通信的方式选择, 收发控制, 和串行口状态标志均由scon控制和指示
- sm0和sm1(scon.7和scon.6):串行口工作方式选择位, 共构成0~3四种模式选择
- sm2(scon.5):多机通信控制位, 主要用于工作方式2和3
置1表示选择多机通信 - ren(scon.4):允许接收控制位, 由软件置1或清0, 相当于串行接收的开关
置1允许接收, 置0禁止接收 - tb8(scon.3):发送数据的第九位(d8)将装入td8中
在方式2或3中由发送的数据的需要由软件置1或清0
在多种通信协议中可用作奇偶校验位
也可在多机通信中作为发送地址帧还是数据帧的标志位, 此时, tb8置1表示为地址字节, 反之为数据字节
在工作方式0和1中, 该位未使用 - rb8(scon.2):接收数据的第九位
- ti(scon.1):发送中断标志, 在一帧数据发送完时(方式0串行发送第8位后, 或其他工作方式发送到停止位开始时)被硬件置1 , 可由软件查询
其置位消息即向CPU表示数据帧发送完成, sbuf已空, 可以准备发送下一帧数据
也可触发中断, 串行口中断被响应之后, ti不会自动置0 , 必须由软件置0 - ri(scon.0):接收中断标志位, 在接受到一帧有效数据后由硬件自动置1
在方式0, 字符第8位串行发送结束时, 或, 其他三种方式中, 当接收到停止位中间时, 由硬件自动置1
置1表示数据接收完成, 请求cpu将sbuf数据取走
ri也能触发中断, 但和ti同中断源, CPU事先不知道是发送还是接收产生的中断请求, 所以全双工时需要软件进行判别
PCON(87h)
pcon中只有smod位和串行口工作有关
smod(pcon.7):波特率倍增位
方式1, 2, 3的波特率和2的smod次方成正比(见波特率计算式), 因此在方式1, 2, 3时, 若smod置1 ,则波特率翻倍
smod复位时被置0
串行通信工作方式
串行方式0
同步 移位寄存器输入输出方式
常用于扩展并行IO口, 串行数据通过RXD输入和输出, TXD用作输出移位时钟, 作为外部部件的同步信号
这种方法不适用于8951之间的通信
但可通过外接移位寄存器实现单片机的接口扩展
例如
74HC164可以用于扩展并行输出口(8位串入、并出移位寄存器)
74HC165可以用于扩展输入口(8位并入、串出移位寄存器)
发送时
当执行一条数据写入SBUF的指令时,串行口会把sbuf中的8位数据以fosc/12的波特率从rxd(p30)端输出, 发送完毕置ti中断标志位为 1
写sbuf指令在本周期的s6p1产生正脉冲, 在下一个周期s6p2处, 数据的最低位输出到rxd针脚
输出帧每位数据的过程中, 每周期 TXD(在 方式0 中用作输出位移时钟) 在s3s4s5为低电平, s6和下一个周期的s1s2为高电平, 输出f/12的移位时钟
接收时 ,先由软件将scon.ren(接收允许标志位)置1, 同时接收中断标志ri置 0 , 产生一个正脉冲, 开始接收, 对应到电路上就是在下个周期s3p1~s5p2, txd(p31)发送低电位的移位脉冲, 并且在s5p2采样p30, 并在本周期的s6p2将串口采样值通过输入移位器 移位接收, 与此同时, 从本周期s6p1到下周期的s2p2, txd将置高电平
由此按位逐一接收, 直到ri清0后(下一个周期开始发送数据)的第10周期的s1p1(上一个周期发送了最后一位数据), ri被硬件置1, 表示这一帧接收完毕, 触发接收中断
串行方式1
真正常用于串行收发的方式, 为10位通用异步接口
txd和rxd分别用于发送和接收数据
收发一帧数据的格式为:
1 位起始位
8 位数据位(低位在前)
1 位停止位
共10位
注意, 接收时, 停止位写入 scon 的 rb8 位,此方式的传送波特率可调(pcon.7 smod, 置1 时波特率翻倍)
-
方式1发送时
数据从txd(p31)端输出
当执行数据写入sbuf(此时指物理意义上的 发送缓冲器 , sbuf这个名字被两个缓冲器共用)指令时, 就启动了发送器开始发送
发送器的定时信号, 由 定时器t1 的送来的溢出信号经过 16 或 32 分频(取决于smod位值)之后得到的, tx时钟就是发送波特率
发送开始的同时, 非send针脚被置有效, 将起始位向txd输出, 此后每一个tx时钟周期(16分频计数器溢出一次作为一个时钟周期, 因此tx时钟频率由波特率决定)产生一个移位脉冲, 并由txd输出一个数据位
当8位数据位全部发送完毕后, ti位置 1 并申请中断, 与此同时将停止位 1 置txd并发送, 在经过一个时钟周期, 非send失效 -
方式1接收时
数据从rxd(p30)端输入
接收的前提是scon.ren置1, 并且rxd检测到起始位(rxd检测到 1 到 0 的跳变)
接收时, 定时信号有两种- 接收移位时钟rx:
他的频率和波特率相同, 也是由 t1定时器 的溢出信号经过 16 或 32 分频得到的 - 位检测器采样脉冲:
频率是rx时钟的16倍, 即在一位数据期间有16位检测器采样脉冲, 为完成检测, 以16倍波特率的速率对rxd进行采样
为保证接收数据准确无误, 在正式接收数据之前还必须判定这个起始位1-0跳变是否是干扰引起, 因此
当一帧数据接收完毕后必须同时满足以下两个条件, 这次接收才被视为有效:
- ri=0 , 即上一帧数据接收完成后ri置1触发的中断请求被响应且ri由软件置0, 表示sbuf可用
- sm2=0 , 或者, 收到停止位(方式1时, 停止位将被装入scon.rb8)并且置位ri
如果不满足, 移位寄存器从rxd接收到的信息不能装入sbuf, 这意味着该帧信息将会丢失
值得注意的是, 在整个接收过程中, ren=1是先决条件, 只有ren有效时, 才能对rxd采样检测
- 接收移位时钟rx:
串行方式2和3
方式2和3均是每帧11位(在数据位和停止位之间多一位可编程位, 之前提到的奇偶校验位就是这位的一种用法)的异步通信格式, 由txd和rxd发送和接收, 不同之处是方式3波特率可变
每帧11位:
- 起始位, 1位
- 数据位, 8位
- 可编程的第9位数据( scon.tb8 ), 1位
可1可0
可以将奇偶校验位装入tb8, 软件 约定 进行奇校验或偶校验
接收方将此数据位装入 scon.rb 8中 - 停止位, 1位
接收时需置scon.ren = 1
采样器检测到rxd1-0跳变时开始接收9位数据输入移位寄存器(9位)
当满足 ri=0 且 sm2=0或sm2=1时
第九位接收到逻辑1, 前八位送入sbuf, 第九位送入rb8, 并将ri置1
如果不满足情况,则本次接收无效且不置位ri
波特率的设计
-
方式0 的波特率
串行口方式0波特率的产生
由上图可见, 方式0的收发移位脉冲由每机器周期的第六状态周期(s6)给出, 即每机器周期产生一个移位时钟, 接收或者发送一位数据
因此方式0的波特率固定为震荡频率fosc的十二分之一, 并且不受pcon.7(也就是smod)的影响 -
方式2 的波特率
串行口方式2波特率的产生
方式2的波特率产生方式和方式0不同(时钟源不同), 其时钟输出部分如上图所示, 收发移位时钟(脉冲)由震荡频率fosc的第二节拍给出(sxp2), 即时钟 = fosc/2, 且可知, 方式2的波特率取决于pcon.smod
当smod = 0时, 波特率 = fosc/64
当smod = 1时, 波特率 = fosc/32 -
方式 1和3 的波特率
串行口方式 1和3 波特率的产生
方式1和3的 移位时钟脉冲 由定时器t1的溢出速率决定
由图可得, 方式1和3 的波特率 = (1 + smod) * t1溢出(速)率 / 32
取决于 定时器t1的溢出率 和 smod-
定时器t1的溢出率
t1计数速率(focs/12, 也就是一个机器周期的时间) 和 t1 (的th1和tl1)预置的初值
不就是溢出所需要的时间取倒数吗
t1溢出(速)率 = (focs / 12) / ((2^16 或 2^8) - 定时器初值)
溢出率计算公式示意图 -
smod
smod置0时为32分频
smod置1时为16分频
-
串行通信工作方式的应用
方式0
可以采用中断方式, 也可以采用非中断程序中查询中断标志位的方式, 两者都需要借助ri和ti标志位, 且记得在使用前将scon初始化, 对于方式1, 将scon初始化为00h即可, 不需要将ren置1
-
中断方式 开启中断源和cpu中断之后可用
发送时
通过用串行口发送一次数据或置位ti来触发一次中断后, 在中断服务程序中发送下一组数据接收时
通过置ri位为1, 请求中断来在中断服务程序中进行一次数据的接收 -
(软件)查询标志位方式
发送时
循环查询, 直到ti = 1, 发送下一组数据接收时
循环查询, 直到ri = 1, 接收下一组数据(记得收发过程中, 在适当位置处理对应中断标志位)
方式1
通常定时器1为自动装填的模式2, 用于将溢出信号经过分频后用作移位器时钟脉冲
方式2 / 3
8951之间的点对点异步通信
通信协议
双方约定通信的时间,校验,收到之后的回报(重发请求等)等规定, 只有这样才能顺利地通信
波特率设置
一般(位检验采样)时钟频率都比较高, 以确保捕捉到的信号正确, 一般是波特率的16倍或者64倍
如果时钟频率正好等于波特率, 则若频率稍有偏差就会产生接收错误
程序设计举例
8951和pc的机间通信
利用pc机配置的异步通信适配器, 可以很方便地完成pc和8951之间的数据通信
最简单的连接是零调制3线经济型, 这是进行全双工通信所必须的最少数目的线路(可能是一收一发一时钟?)
- rxd对应r1out针脚
- rxd对应r1out针脚
- rxd对应r1out针脚
通信协议
pc发送文件子程序
send()
pc接收文件子程序
receive()
无线单片机及其点到多点通信
运作原理
应用场景
RFID技术和物联网的应用
物联网:
RFID技术: