I51开发板第二十七讲 STC15F2K60S2串行口工作方式简介

  • 开发
  • SingleYork
  • LV5工程师
  • |      2016-10-21 11:21:02
  • 浏览量 3329
  • 回复:5
本帖最后由 SingleYork 于 2016-10-21 11:54 编辑 bg7.png

I51开发板第二十六讲 STC15F2K60S2串行口通信相关寄存器

https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=69151

(出处: ICKEY BBS)

这一讲,SingleYork主要跟大家一起学习一下STC15F2K60S2单片机的串行口的工作方式,部分内容源自某教程和STC官方文档,如有雷同敬请谅解!

STC15F2K60S2单片机的串行通信接口有4种工作模式,可通过软件编程对SCON中的SM0、SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的字符都带有1个启动位和1个停止位。在模式0中,串行口被作为1个简单的移位寄存器使用。本讲主要以串行口1为例分别对这几种模式进行讲解。

1、 方式0:同步移位寄存器

方式0为半双工方式,又称为同步移位寄存器输出方式。在这种方式下,TxD引脚输出同步移位时钟,RxD用于发送和接收串行数据。串行口输出端可直接与移位寄存器相连,也可以用作扩展I/O口或外接同步输入输出设备。该方式下的数据帧为8位,低位在先,高位在后,没有起始位和停止位。串行口1方式0的功能结构及时序图如下图所示:

发送过程:当CPU将数据写入到发送缓冲区SBUF时,串行口即把8位二级制数以SYSclk/12或SYSclk/2(由UART_M0x6确定是12分频还是2分频)的波特率由RxD引脚输出(SYSclk为系统工作时钟),同时由TxD引脚输出同步移位脉冲。字符发送完毕,置中断标志TI为1.

当写SBUF信号有效后,相隔一个时钟,发送控制端有效,允许RxD发送数据,同时允许TxD输出同步移位脉冲。一帧数据发送完毕时,各控制端均回复原状态,只有TI保持高电平,呈中断申请状态。再次发送数据前,必须用软件将TI清0。

接收过程:控制字除方式0外,还应置允许接收控制位REN=1,并清除RI中断标志,接收过程启动后,RxD为数据输入端,TxD为同步信号输出端。串行接收的波特率为SYSclk/12或SYSclk/2(由UART_M0x6确定是12分频还是2分频)。接收完8位数据后重新置RI=1,当再次接收时,必须通过软件将RI清0。

工作于方式0时,必须是SCON控制字的SM2位为0,从而不影响TB8和RB8位。在该方式下,波特率仅取决于系统时钟和UART_M0x6的设置,无需使用定时器控制。以中断方式传送数据时,CPU相应中断并不会自动清楚TI、RI标志,在中断服务程序中必须由指令清0。

2、 UART方式

UART通信有3中工作方式,分别如下:

1) 方式1:8位可变波特率方式

方式1提供异步全双工通信,适合于点到点的通信。每个数据帧长度为10位:1个起始位(低电平)、8个数据位和1个停止位(高电平)。传输的数据首先是起始位,然后是8位数据(低位在前),最后一位是停止位。起始位和停止位是在发送时自动插入的。接收时,停止位进入SCON的RB8位。TxD为发送数据引脚,RxD为接收数据引脚。工作方式1的功能结构及接收/发送时序图如下图所示:

方式1的发送过程:发送数据时,数据由串行发送端TxD输出。当单片机执行一条写SBUF的指令时,就启动串行通信的发送,写SBUF信号还把1装入发送移位寄存器的第9位,并通知TX控制器开始发送。发送各位的定时时间由16分频计数器同步。

移位寄存器将数据不断右移送TxD端发送,在数据的额左边不断移入0作补充。当数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位“1”,在它的左边各位全为“0”,这个状态条件,是TX控制器作最后一次移位输出,然后使允许发送信号“SEND”失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向CPU请求中断处理。

方式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16分频的速度采样串行接收端RxD,当检测到RxD端口从1→0的负跳变时就启动接收器准备接收数据,并立即复位16分频计数器,将1FFH值装入移位寄存器。复位16分频计数器的目的是使它与输入位时间同步。

16分频计数器的16个状态是将每位的接收时间均为16等份,在每位时间的7、8、9状态由检测器对RxD端口进行采样,经“三中取二”后的值作为本次所接收的值,即3次采样至少2次值相同,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为0(低电平),则起始位无效,复位接收电路,并重新检测1→0的跳变。如果接收到起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。

接收的数据从接收移位寄存器的右边输入,已装入的1FFH向左边溢出,当起始位0移到移位寄存器的最左边时,使RX控制器作为最后一次移位,完成一帧的接收。若同时满足以下两个条件:

RI=0;

SM2=0或接收到的停止位为1。

则接收到的数据有效,数据载入SBUF,停止位进入RB8,置位RI,向CPU请求中断。若上述两条件不能同时满足,则接收到的数据作废并丢弃,无论条件满足与否,接收器重新检测RxD端口上的1→0的跳变,继续下一帧的接收。接收有效,在响应中断后,必须由软件将RI清0。通常情况下,串行口工作于方式1时,SM设置为0。

串行口通信方式1的比特率是可变的,比特率由定时器1或定时器2的溢出率决定。定时/计数器的溢出率定义为:单位时间(秒)内定时器/计数器溢出的次数。

串行口1用定时器1作为波特率发生器且定时器1工作于模式0(16位自动重装模式)时,波特率=(定时器1的溢出率)/4。

注意:此时波特率与SMOD无关。

当定时器1工作于模式0(16位自动重装模式)且T1x12=0时,

定时器1的溢出率=SYSclk/12/(65536-)

此时

串口1的波特率= SYSclk/12/(65536-)/4

当定时器1工作于模式0(16位自动重装模式)且T1x12=0时,

定时器1的溢出率=SYSclk/(65536-)

此时

串口1的波特率= SYSclk/(65536-)/4

其中,RL_TH1TH1的自动重装载寄存器,TL_TL1TL1的自动重装载寄存器。

当串行口1用定时器1作为波特率发生器且定时器1工作于模式28位自动重装模式)时,波特率=(2SMOD/32) ×定时器1的溢出率

当定时器1工作于模式2(8位自动重装模式)且T1x12=0时,

定时器1的溢出率=SYSclk/12/(256-TH1)

此时

串口1的波特率=(2SMOD/32)×SYSclk/12/(256-TH1)

当定时器1工作于模式2(8位自动重装模式)且T1x12=1时,

定时器1的溢出率=SYSclk/(256-TH1)

此时

串口1的波特率=(2SMOD/32)×SYSclk/12/(256-TH1)

T2x12=0时,

定时器2的溢出率= SYSclk/12/(65536-)

此时

串口1的波特率= SYSclk/12/(65536-)/4

T2x12=1时,

定时器2的溢出率= SYSclk/(65536-)

此时

串口1的波特率= SYSclk/(65536-)/4

其中,RL_TH1是TH1的自动重装载寄存器,TL_TL1是TL1的自动重装载寄存器。

2) 串行口方式2:9位固定波特率方式

方式2提供异步全双工通信,适合于固定波特率的多机通信。每个数据字节长度为11位,1个起始位、8个数据位(低位在前)、1个可编程的第9位(TB8/RB8)和1个停止位。与方式1相比,没帧增加了一个第9位。发送时,第9位数据由TB8提供,可以置位也可以清0。TB8既可以作为多机通信中的地址数据标志位,也可以作为奇偶校验位(将PSW寄存器中的奇偶校验位P的值装入TB8)。接收时,第9位进入RB8位。TxD/P3.1为发送端口,RxD/P3.0为接收端口。

方式2的波特率为

串行通信方式2波特率=(2SMOD/64)×SYSclk,SYSclk为系统工作时钟频率

PCON寄存器中的SMOD为波特率加倍位,当SMOD=1时,波特率为SYSclk/32;当SMOD=0时,波特率为SYSclk/64。

串行通信方式2的功能结构图及其接收/发送时序图如下所示:

由上图可知,方式2和方式1相比,除波特率发生源略有不同,发送时由TB8提供给移位寄存器第9数据位不同外,其余功能结构均基本相同,其接收/发送操作过程及时序也基本相同。

当接收器接收完一帧信息后必须同时满足下列条件:

RI=0

SM2=0或SM=1,并且接收到的第9数据位RB8=1。

当上述两条件同时满足时,才将接收到的移位寄存器的数据装入SBUF和RB8中,并置位RI,向CPU请求中断处理。如果上述条件有一个不满足,则刚接收到的移位寄存器中的数据无效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始检测RxD输入端口的跳变信息,接收下一帧的输入信息。

在方式2中,接收到的停止位与SBUF、RB8和RI无关。

通过软件对SCON中的SM2、TB8的设置已经通信协议的约定,为多机通信提供了方便。

3)串行口方式3:9位可变波特率方式

该方式也适合与多机通信。方式3的每个数据字节长度为11位:1个起始位、8个数据位(低位在前)、1个可编程的第9位(TB8/RB8)和1个停止位。发送时,第9位数据由TB8提供,可以置位也可以清0。TB8既可以作为多机通信中的地址数据标志位,也可以作为奇偶校验位(将PSW寄存器中的奇偶校验位P的值装入TB8)。接收时,第9位进入RB8位。TxD/P3.1为发送端口,RxD/P3.0为接收端口。

方式3和方式1一样,其波特率可通过软件对定时器/计数器1或定时器2的设置进行波特率的选择,是可变的。方式3的波特率计算方法与方式1的方法相同,在此就不再赘述。

串行口工作方式3的功能结构及其数据接收/发送时序图如下图所示:

由上图可知,方式3和方式1相比,除发送时由TB8提供给移位寄存器第9位数据位不同外,其功能结构和数据接收/发送操作过程及时序和方式1基本相同。

发送过程:CPU执行数据写入缓冲器SBUF的指令即可启动发送。串行口自动将发送缓冲区中的内容送入发送移位寄存器。发送移位寄存器先发送一个起始位,接着按程序设定的字符代码,先低位后高位。数据字加上奇偶校验位或可控位(方式2、3中即为程序设定的TB8位的值),再发送停止位,从而完成一帧数据的发送。串行数据均由TxD端输出,发送完毕,将发送中断标志位置1,以提供查询及向CPU申请中断之用。CPU相应中断后必须在中断服务程序中使IT清0.

接收过程:接收数据由RxD输入,串行口以所选定波特率的16倍速率采样RxD端状态。当RxD端电平由1到0的跳变时,就启动接收器。串行口按程序规定的格式接收一帧代码,并把此代码的数据位拼成并行码送入接收缓冲寄存器中(在方式1时,把停止位送入RB8;在方式2、3时,把程控的第9位数据送入RB8),等待CPU取走。为保证可靠无误,对每一帧数据进行连续3次采样,取3次采样中至少两次相同的值。接收完毕,置接收中断标志RI=1。CPU的相应中断后必须在中断服务程序中使RI清0。

当接收器接收完成一帧信息后必须同时满足以下两个条件:

RI=0;

SM2=0或SM2=1,并且接收到的第9数据位为RB8=1。

当上述两条件同时满足时,才将接收到的移位寄存器的数据载入SBUF和RB8中,并置位RI,向CPU请求中断。若上述两条件不能同时满足,则接收到的数据作废并丢弃,无论条件满足与否,接收器重新检测RxD端口上的1→0的跳变,继续下一帧的接收。

在方式3中,接收到的停止为与SBUF、RB8和RI无关。

通过软件对SCON中的SM2、TB8的设置以及通信协议的约定,为多机通信提供了方便。

下面给出了几种常用的典型帧格式:

在实际应用中,应根据实际需要选择串行口的工作方式。由于方式1和方式3的波特率可以通过定时器控制,通信波特率的设定比较灵活,因此,方式1和方式3使用较多,其中,方式1常用于点对点通信的情况,而方式3常用于多机通信的情况。

下面给出串行口1工作方式一览表:

从上表可以看出,方式1与方式2、3的区别如下

1方式1中,数据字是8位异步通信接口,串行口发送/接收共10位信息,第0位为起始位,1-8位是数据位,最后是停止位;方式2、3中,数据字为9位的异步通信接口,1位起始位,8位数据位,第9位是可程控位1或0,最后是停止位,共有11位信息。

2方式1、3的波特率是可变的,其波特率取决于定时器1的溢出率或定时器T2的溢出率和特殊功能寄存器PCON中的SMOD位的值,PCON寄存器中的SMOD是1还是0决定波特率是否加倍。

此外,方式2和方式3中还可以通过控制TB8位的方法,使其传送中附加的第9位数据可以作为多机通信中的地址/数据标志位,或作为数据的奇偶校验位。若以TB8作为奇偶校验位,在数据写入SBUF之前,先将数据的奇偶位写入TB8。

编写接收程序时,均应使REN=1,允许串行接收。只有在最后的移位脉冲产生并同时满足下列条件时,接收数据才会装入SBUF和RB8并置位RI:

1对于方式1:SM2=0或接收到的停止位=1;

2对于方式2、3:SM2=0或接收到的第9个数据=1。

这一讲主要跟大家一起学习了STC15F2K60S2单片机的串行口1的4种工作方式,至于串行口2的工作方式就留给小伙伴们自行去学习了,值得注意的是,串行口2只有两种工作方式,它们都是UART方式,跟串行口1的工作原理基本类似,在此就不再赘述,下一讲SingleYork将会跟大家一起来学习串行口1的几种工作模式的程序的编写,敬请关注!

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:3
IT民工 2016-12-23
谢谢分享
0   回复
举报
发布
SingleYork 回复 2017-03-04
感谢支持……:)
0   回复
举报
7943603 2016-10-28
好详细,支持一个!
0   回复
举报
发布
SingleYork 2016-10-24
:sleepy::sleepy::sleepy::sleepy:不教……
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子