[专业课笔记] 第七章 8951串行口

[专业课笔记] 单片机 第七章 8951串行口

  • 正文
    • 基本知识
      • 数据通信
        • 并行通信
        • 串行通信
        • 异步通信和同步通信
          • 异步通信
          • 同步通信
          • 波特率
      • 串行通信的过程和通信协议
        • 串并转换和设备同步
          • 串并转换
          • 设备同步
        • 串行通信协议
    • 串行口及其应用
      • 8951单片机的串行口
        • 结构
        • 串行口控制和控制寄存器
          • SCON(98h)
          • PCON(87h)
        • 串行通信工作方式
          • 串行方式0
          • 串行方式1
          • 串行方式2和3
          • 波特率的设计
        • 串行通信工作方式的应用
          • 方式0
          • 方式1
          • 方式2 / 3
    • 8951之间的点对点异步通信
      • 通信协议
      • 波特率设置
      • 程序设计举例
    • 8951和pc的机间通信
      • 通信协议
      • pc发送文件子程序
      • pc接收文件子程序
    • 无线单片机及其点到多点通信
      • 运作原理
      • 应用场景
    • RFID技术和物联网的应用

正文

基本知识

数据通信

本机的CPU到其他设备中间常常会有信息交换, 而本机和其他计算机之间常常也会进行信息的交换
通信的方式有两种:

  1. 并行通信
  2. 串行通信

往往通过数据传送距离来判断选择哪一种方式

对PC而言, 30m是一个分水岭, 小于30m, PC间往往采用并行通信, 反之, 就使用串行通信

8951这两种通信方式都具有

并行通信

指数据的各位同时进行传输的通信方式

优点是传送速度快, 缺点是数据有多少位, 传送线就需要多少根

因此, 并行通信在位数多且距离远时就不适用了

例如8951和打印机之间的数据传送就属于并行通信

下图为8951和外设间8位信息传送并行通信的连接方法

通信引脚连接方式图

串行通信

串行通信的传送方式有3种

  1. 单工(单向)配置
    只允许数据向一个方向传送
  2. 半双工(半双向)配置
    允许数据在两个方向上传送, 但每次只能有一方在发送
  3. 全双工(全双向)配置
    允许同时双向传送数据, 物理上是一对单向配置, 因此要求两端的通信设备都具有完整独立的发送接收能力

3种串行的示例图

异步通信和同步通信

通常, 对于串行通信来说, 按双方时钟情况来分, 有两种通信方式

  1. 异步通信
  2. 同步通信
异步通信

此时通信双方的时钟是相互独立的, 双方的数据发送和接收可以不在同一时刻进行(即所谓异步), 但是双方必须遵守相同的通信协议, 包括相同的数据格式和相同的通信速率
在异步通信中, 数据是以帧为单位完成一次收发的传送的(通常包括 一字节\字符 的 数据\代码 )

数据帧图示

一帧依次由四部分组成: 起始(标识)位, 数据位, 奇偶效验位, 和停止位

  1. 起始位 :占 1 位, 值为 0 , 路线上没有数据时保持为1, 当有数据到来时检测到0,就表示应当马上准备接收
  2. 数据位 :占 5~8 位, 规定低位在前高位在后
  3. 奇偶效验位:占 1 位, 可以在字符里指定省去, 也可以用来表示这帧的字符的性质(地址\数据)
  4. 停止位 :可以是占用 1 位, 1.5 位, 2 位, 值一定是 高电位 \ 1 , 如果停止位之后不是紧接着下一个字符则保持高电位

例如, 规定使用ascii码时, 字符数据占7位, 加起始停止各一位和1位奇偶校验位, 一共一帧10位

同步通信

此时通信双方的物理时钟是相同的, 数据的收发同时进行

同步通信方式和数据(块)格式

同步通信中, 在数据开始传送之前用 同步字符 来指示(一般约定为 1~2 个字符), 并且由时钟来实现发送端和接收端同步, 当检测到规定的同步字符之后, 接下来就连续按顺序传送数据, 直到通信告一段落
同步通信期间, 字符之间没有间隙, 也不需要起始位和停止位, 仅在数据块开始传送时用同步字符SYNC来指示

可以采用ascii码的同步字符SYNC, 值为16h, 用户也可以自行约定同步字符

在同步传送时, 要求用时钟来实现发送端和接收端之间的同步, 为保证接收准确无误, 发送方就需在传送数据之外, 同时传送时钟信号

同步传送可以提高传输速率( 56kb\s 或 更高), 但硬件比较复杂

波特率

即数据传输速率, 指每秒发送的二进制码位数, 单位是b\s, 它的值的确定对CPU和外界的通信很重要

波特率计算方法: 每字符占二进制码位数 * 每秒发送字符数

则每位字符的传送时间即为波特率的倒数

串行通信的过程和通信协议

串并转换和设备同步

保证两个通信设备在串行线路上成功实现通信必须解决两个问题:

  1. 串并转换
    即如何要发送的数据串行化, 又如何将将接收的数据并行化
  2. 设备同步
    即同步发送设备和接收设备的工作节拍, 以确保发送的数据在接收端被正确读出
串并转换

发: 在串行发送前, 计算机将内部并行数据送入移位寄存器, 并一位一位地移出, 将内部并行数据转换成串行数据, 再通过一根通信线传送

收: 来自通信线路的串行数据被送入移位寄存器, 满8位后并行送到计算机内部

在串行通信控制电路中, 串并转换逻辑被集成到出现异步通讯控制芯片里, 8951的串行口和IBM-PC机中的8250芯片都能实现这一功能

设备同步

进行串行通信的两台设备必须同步工作, 才能有效地检测通信线路上的信号变化, 从而采样传送数据脉冲
设备同步的对双方的要求是:

  1. 采用同样的编码方法
    以确定一个字符的二进制表示值的位发送顺序和位串长度, 以及电平信号高低和逻辑10的固定对应关系
  2. 双方必须产生相同的传送速率
串行通信协议

存在同步和异步两种协议, 此处只讨论异步串行通信协议和其规定的字符数据传送格式(按先后顺序)

  1. 起始位
  2. 数据位
  3. 奇偶校验位
    取决于双方约定选择奇校验还是偶校验, 如果选择奇校验, 则字符数据位和校验位的逻辑1的位数和为奇数; 同理于偶校验, 字符数据位和校验位的逻辑1的位数和为偶数
  4. 停止位
  5. 波特率设置
    数据传送时每位信号都保持一致的信号持续时间, 持续时间由数据传输速度(每秒多少位二进制位)决定, 即波特率
  6. 挂钩(握手)信号约定

串行口及其应用

8951单片机的串行口

8951有个可编程全双工串行通信接口, 可用作UART(), 也可用作同步移位寄存器
帧格式支持 8位, 10位 或 11位, 并能设置各种波特率, 具有很大的灵活性

结构

8951通过引脚RXD(p3.0, 串行数据接收端)和TXD(p3.1, 串行数据发送端)与外界进行通信
下图中由两个物理上独立的接收和发送缓冲器SBUF, 占用同一地址99h, 可同时发送接收数据(在一周期不同时期段里)
发送缓冲器只写, 接收缓冲器只读

结构图

串行口控制和控制寄存器

8951的串行口是可编程接口, 对他初始化编程只用两个控制字分别写入特殊功能寄存器SCON和电源控制寄存器PCON中即可

SCON(98h)

8951串行通信的方式选择, 收发控制, 和串行口状态标志均由scon控制和指示

scon结构示意

  1. sm0和sm1(scon.7和scon.6):串行口工作方式选择位, 共构成0~3四种模式选择
  2. sm2(scon.5):多机通信控制位, 主要用于工作方式2和3
    置1表示选择多机通信
  3. ren(scon.4):允许接收控制位, 由软件置1或清0, 相当于串行接收的开关
    置1允许接收, 置0禁止接收
  4. tb8(scon.3):发送数据的第九位(d8)将装入td8中
    在方式2或3中由发送的数据的需要由软件置1或清0
    在多种通信协议中可用作奇偶校验位
    也可在多机通信中作为发送地址帧还是数据帧的标志位, 此时, tb8置1表示为地址字节, 反之为数据字节
    在工作方式0和1中, 该位未使用
  5. rb8(scon.2):接收数据的第九位
  6. ti(scon.1):发送中断标志, 在一帧数据发送完时(方式0串行发送第8位后, 或其他工作方式发送到停止位开始时)被硬件置1 , 可由软件查询
    其置位消息即向CPU表示数据帧发送完成, sbuf已空, 可以准备发送下一帧数据
    也可触发中断, 串行口中断被响应之后, ti不会自动置0 , 必须由软件置0
  7. ri(scon.0):接收中断标志位, 在接受到一帧有效数据后由硬件自动置1
    在方式0, 字符第8位串行发送结束时, 或, 其他三种方式中, 当接收到停止位中间时, 由硬件自动置1
    置1表示数据接收完成, 请求cpu将sbuf数据取走
    ri也能触发中断, 但和ti同中断源, CPU事先不知道是发送还是接收产生的中断请求, 所以全双工时需要软件进行判别
PCON(87h)

pcon结构图

pcon中只有smod位和串行口工作有关
smod(pcon.7):波特率倍增位
方式1, 2, 3的波特率和2的smod次方成正比(见波特率计算式), 因此在方式1, 2, 3时, 若smod置1 ,则波特率翻倍
smod复位时被置0

串行通信工作方式

选择串行口工作方式的sm0和sm1置位表

串行方式0

同步 移位寄存器输入输出方式

常用于扩展并行IO口, 串行数据通过RXD输入和输出, TXD用作输出移位时钟, 作为外部部件的同步信号
这种方法不适用于8951之间的通信
但可通过外接移位寄存器实现单片机的接口扩展
例如
74HC164可以用于扩展并行输出口(8位串入、并出移位寄存器)
74HC165可以用于扩展输入口(8位并入、串出移位寄存器)

他人的74HC164/74HC165相关博客链接

方式0的发送电路和时序

发送时
当执行一条数据写入SBUF的指令时,串行口会把sbuf中的8位数据以fosc/12的波特率从rxd(p30)端输出, 发送完毕置ti中断标志位为 1
写sbuf指令在本周期的s6p1产生正脉冲, 在下一个周期s6p2处, 数据的最低位输出到rxd针脚
输出帧每位数据的过程中, 每周期 TXD(在 方式0 中用作输出位移时钟) 在s3s4s5为低电平, s6和下一个周期的s1s2为高电平, 输出f/12的移位时钟

方式0的接收电路和时序示意图

接收时 ,先由软件将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 的跳变)
    接收时, 定时信号有两种

    1. 接收移位时钟rx:
      他的频率和波特率相同, 也是由 t1定时器 的溢出信号经过 16 或 32 分频得到的
    2. 位检测器采样脉冲:
      频率是rx时钟的16倍, 即在一位数据期间有16位检测器采样脉冲, 为完成检测, 以16倍波特率的速率对rxd进行采样
      为保证接收数据准确无误, 在正式接收数据之前还必须判定这个起始位1-0跳变是否是干扰引起, 因此

    当一帧数据接收完毕后必须同时满足以下两个条件, 这次接收才被视为有效:

    1. ri=0 , 即上一帧数据接收完成后ri置1触发的中断请求被响应且ri由软件置0, 表示sbuf可用
    2. sm2=0 , 或者, 收到停止位(方式1时, 停止位将被装入scon.rb8)并且置位ri

    如果不满足, 移位寄存器从rxd接收到的信息不能装入sbuf, 这意味着该帧信息将会丢失

    值得注意的是, 在整个接收过程中, ren=1是先决条件, 只有ren有效时, 才能对rxd采样检测

方式1的收发电路和时序示意图

串行方式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

方式2和3的收发电路和时序示意图

波特率的设计
  1. 方式0 的波特率
    串行口方式0波特率的产生
    由上图可见, 方式0的收发移位脉冲由每机器周期的第六状态周期(s6)给出, 即每机器周期产生一个移位时钟, 接收或者发送一位数据
    因此方式0的波特率固定为震荡频率fosc的十二分之一, 并且不受pcon.7(也就是smod)的影响

  2. 方式2 的波特率
    串行口方式2波特率的产生
    方式2的波特率产生方式和方式0不同(时钟源不同), 其时钟输出部分如上图所示, 收发移位时钟(脉冲)由震荡频率fosc的第二节拍给出(sxp2), 即时钟 = fosc/2, 且可知, 方式2的波特率取决于pcon.smod
    当smod = 0时, 波特率 = fosc/64
    当smod = 1时, 波特率 = fosc/32

  3. 方式 1和3 的波特率
    串行口方式 1和3 波特率的产生
    方式1和3的 移位时钟脉冲 由定时器t1的溢出速率决定
    由图可得, 方式1和3 的波特率 = (1 + smod) * t1溢出(速)率 / 32
    取决于 定时器t1的溢出率smod

    1. 定时器t1的溢出率
      t1计数速率(focs/12, 也就是一个机器周期的时间) 和 t1 (的th1和tl1)预置的初值
      不就是溢出所需要的时间取倒数吗
      t1溢出(速)率 = (focs / 12) / ((2^16 或 2^8) - 定时器初值)
      溢出率计算公式示意图

    2. smod
      smod置0时为32分频
      smod置1时为16分频

常用波特率与其他参数的选取关系

串行通信工作方式的应用
方式0

可以采用中断方式, 也可以采用非中断程序中查询中断标志位的方式, 两者都需要借助ri和ti标志位, 且记得在使用前将scon初始化, 对于方式1, 将scon初始化为00h即可, 不需要将ren置1

  1. 中断方式 开启中断源和cpu中断之后可用

    发送时
    通过用串行口发送一次数据或置位ti来触发一次中断后, 在中断服务程序中发送下一组数据

    接收时
    通过置ri位为1, 请求中断来在中断服务程序中进行一次数据的接收

  2. (软件)查询标志位方式

    发送时
    循环查询, 直到ti = 1, 发送下一组数据

    接收时
    循环查询, 直到ri = 1, 接收下一组数据(记得收发过程中, 在适当位置处理对应中断标志位)

方式1

通常定时器1为自动装填的模式2, 用于将溢出信号经过分频后用作移位器时钟脉冲

方式2 / 3

8951之间的点对点异步通信

通信协议

双方约定通信的时间,校验,收到之后的回报(重发请求等)等规定, 只有这样才能顺利地通信

波特率设置

一般(位检验采样)时钟频率都比较高, 以确保捕捉到的信号正确, 一般是波特率的16倍或者64倍
如果时钟频率正好等于波特率, 则若频率稍有偏差就会产生接收错误

程序设计举例

8951和pc的机间通信

利用pc机配置的异步通信适配器, 可以很方便地完成pc和8951之间的数据通信
最简单的连接是零调制3线经济型, 这是进行全双工通信所必须的最少数目的线路(可能是一收一发一时钟?)

max232单芯片结构示意图

  1. rxd对应r1out针脚
  2. rxd对应r1out针脚
  3. rxd对应r1out针脚

通信协议

pc发送文件子程序

send()

pc接收文件子程序

receive()

无线单片机及其点到多点通信

NRF9E5单片机示意图

运作原理

工作原理图

应用场景

测温装置图

RFID技术和物联网的应用

物联网:

RFID技术:

你可能感兴趣的:(#,单片机)