目录
一、串行通信基础
1.1 并行通信与串行通信
单片机的数据通信有并行通信与串行通信两种方式。
1.1.1 并行通信
并行通信是指多个进程或者任务同时进行通信的一种方式。在并行通信中,多个进程或者任务可以同时发送和接收消息,而不需要等待其他进程或者任务完成通信操作。
并行通信的好处是可以提高系统的吞吐量和响应速度。通过并行通信,不同的进程或者任务可以并行地进行通信操作,从而可以更快地完成任务。此外,并行通信还可以提高系统的可伸缩性,使系统能够处理更多的并发请求。
1.1.2 串行通信
串行通信是指只有一个进程或者任务在进行通信的一种方式。在串行通信中,进程或者任务按照一定的顺序来发送和接收消息,只有前一个进程或者任务完成通信操作后,下一个进程或者任务才能进行通信。
串行通信的好处是简单和直观,通信操作按照顺序进行,不需要考虑同步和资源竞争问题。此外,串行通信的实现成本相对较低,不需要考虑并行处理的复杂性。
单片机并行通信与串行通信示意图
1.2 同步通信与异步通信
串行通信又有两种方式:同步串行通信与异步串行通信。
同步串行通信是指发送方向接收方发送数据后,必须等待接收方接收完毕后才能继续进行其他操作。在同步串行通信中,发送方和接收方的操作是严格同步的,发送方发送一条消息后会阻塞等待接收方接收完成,接收方接收完消息后才会解除发送方的阻塞状态。
同步串行通信适用于需要保持严格顺序和一致性的场景,例如在传输重要数据或者进行精确计时的应用中。由于发送方必须等待接收方的反馈,同步串行通信的延迟较大,但可靠性较高。
同步通信和数据格式示意图
异步串行通信则是指发送方发送数据后可以继续进行其他操作,无需等待接收方的回应。在异步串行通信中,发送方无需等待接收方的响应,可以自由地进行其他操作。接收方则会在接收到消息后进行处理,并向发送方发送适当的确认或者回应。
异步串行通信则适用于需要高效利用系统资源和并发处理的场景。由于发送方无需等待接收方的反馈,可以继续进行其他操作,可以提高系统的吞吐量和响应速度。但异步串行通信需要考虑数据的一致性和错误处理,因此编程和调试的复杂性较高。
异步串行通信示意图
1.3 串行通信的传输模式
串行通信的传输模式按照数据传输的方向和时间关系可分为单工、半双工和全双工。
单工传输:在单工传输中,数据只能在一个方向上进行传输。一方作为发送方,只能发送数据,而另一方作为接收方,只能接收数据。这种传输模式类似于广播电视,只有单向传输,没有数据回传。
半双工传输:在半双工传输中,数据可以在两个方向上进行传输,但不能同时进行。两个通信方向上的传输是交替进行的,即一方发送数据时,另一方只能接收数据,然后再进行反向传输。这种传输模式类似于对讲机,只能单向传输,需要交替切换发送和接收方向。
全双工传输:在全双工传输中,数据可以在两个方向上同时进行传输。两个通信方向上的传输可以同时进行,即一方可以同时发送和接收数据。这种传输模式类似于电话通信,双方可以同时进行发言和听取。(51单片机——异步全双工)
单工、半双工和全双工的数据传输模式示意图
二、串行口的结构
串行口是一种用于数据通信的接口,可以实现单片机和外部设备之间的数据传输。串行口通常由几个关键组成部分构成。
串行口的发送器,它负责将单片机中的数据转换成串行信号,并通过串行通信线路发送出去。发送器通常包含一个移位寄存器,用于存储要发送的数据,以及一个时钟,用于控制数据的发送速度。
串行口的接收器,它负责接收外部设备发送过来的串行信号,并将其转换成并行数据供单片机使用。接收器通常也包含一个移位寄存器和一个时钟,用于接收和解码串行信号。
除了发送器和接收器,串行口还包含一些控制和配置寄存器,用于设置串行通信的参数,如波特率、数据位数、校验位等。这些寄存器可以通过编程设置,以适应不同的通信需求。
最后,串行口还包含一个中断控制器,用于处理串行口的中断请求。当接收到外部设备发送的数据时,中断控制器会触发中断请求,通知单片机进行数据处理。
串行口的内部结构图
2.1 串行口控制寄存器SCON
串行口控制寄存器(SCON)是单片机中用于控制串行通信的寄存器。
下面是SCON寄存器的位布局表格:
SCON 寄存器位 | 名称 | 描述 |
---|---|---|
Bit 7 | SM0 | 串行口工作模式选择位,用于选择串行口的工作模式 |
Bit 6 | SM1 | 串行口工作模式选择位,用于选择串行口的工作模式 |
Bit 5 | SM2 | 多机通信控制位,在方式2和方式3下进行的 |
Bit 4 | REN | 允许串行接收位,用于允许串行口接受数据 |
Bit 3 | TB8 | 发送的第9位数据位 |
Bit 2 | RB8 | 接收的第9位数据位 |
Bit 1 | TI | 发送中断标志位,用于指示发送操作是否完成 |
Bit 0 | RI | 接收中断标志位,用于指示接收操作是否完成 |
2.1.1 SM0、SM1
根据SM0和SM1的不同组合,可以选择以下四种工作模式:
SM1 | SM0 | 方式 | 功能说明 |
---|---|---|---|
0 | 0 | 0 | 同步移位寄存器方式(用于扩展 I/O口) |
0 | 1 | 1 | 8位异步收发,波特率可变(由定时器T1控制) |
1 | 0 | 2 | 9位异步收发,波特率为 晶振频率/64 或 晶振频率/32 |
1 | 1 | 3 | 9位异步收发,波特率可变(由定时器T1控制) |
2.1.2 SM2
- 当SM2=1时,串行口可以与多个设备进行通信,每个设备有独立的地址。当接收到RB8为1时,才是RI置1,产生中断请求,触发中断。
- 当SM2=0时,串行口只与单一设备进行通信,不使用地址识别功能。所有接收到的数据都被直接接收,并触发中断。
在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI。
在方式0时,SM2必须为0。
2.1.3 REN
REN位的不同设置可以选择两种不同的工作模式:
当REN位为1时,表示接收使能。串行口可以接收数据,并触发中断。
当REN位为0时,表示接收禁止。串行口不接收数据,也不会触发中断。
2.1.4 TB8
TB8用于控制是否传输第9位数据。
在使用TB8时,需要先设置SM2位为1,表示使用9位数据传输模式。当TB8为0时,表示只传输8位数据;当TB8为1时,表示传输9位数据。
2.1.5 RB8
RB8用于控制串行口接收数据的第9位。
当RB8位为1时,表示接收到的数据帧的第9位是1;当RB8位为0时,表示接收到的数据帧的第9位是0。通过判断RB8位的值,可以识别出接收到的数据帧是否是9位长,从而进行相应的处理。
2.1.6 TI
TI用于设置或检测串行口发送中断的状态。
当TI位为1时,表示串行口发送完成,并产生了中断请求。当TI位被置1时,表示要发送的数据已经全部发送完毕,并且硬件已经准备好发送下一个字节。在中断服务子程序中,可以通过检测TI位来确定数据是否全部发送完成。
2.1.7 RI
RI用于设置或检测串行口接收中断的状态。
当RI位为1时,表示串行口接收到了数据,并产生了中断请求。当RI位被置1时,表示收到了一个字节的数据,并且硬件已经准备好接收下一个字节。在中断服务子程序中,可以通过检测RI位来确定是否接收到了新的数据。
2.2 特殊功能寄存器PCON
PCON(Power Control Register)是用于控制单片机的低功耗模式和电源管理的特殊功能寄存器。
下面是特殊功能寄存器PCON的位表格:
位 | 功能 |
---|---|
7 | SMOD:串行波特率倍频控制位 |
6 | SMOD0:串行波特率倍频控制位 |
5 | LVDF:低电压检测标志位 |
4 | POF:电源故障标志位 |
3 | GF1:通用标志位1 |
2 | GF0:通用标志位0 |
1 | PD:掉电模式标志位 |
0 | IDL:IDLE模式控制位 |
每个位的具体功能如下:
SMOD(位7)和SMOD0(位6)用于控制串行通信的波特率倍频。当SMOD和SMOD0都为0时,波特率不进行倍频。当SMOD为0而SMOD0为1时,波特率倍频一倍。当SMOD为1而SMOD0为0时,波特率倍频两倍。当SMOD和SMOD0都为1时,波特率倍频四倍。
LVDF(位5)是一个低电压检测标志位,用于指示系统电压是否低于预设的阈值。当LVDF为1时,表示电压低于阈值;当LVDF为0时,表示电压正常。
POF(位4)是一个电源故障标志位,用于指示系统是否发生了电源故障。当POF为1时,表示发生了电源故障;当POF为0时,表示电源正常。
GF1(位3)和GF0(位2)是通用标志位,可供用户自定义使用。
PD(位1)是一个掉电模式标志位,用于进入或退出掉电模式。当PD为1时,表示系统进入掉电模式;当PD为0时,表示系统正常工作。
IDL(位0)是一个IDLE模式控制位,用于控制系统进入或退出IDLE模式。当IDL为1时,表示系统进入IDLE模式;当IDL为0时,表示系统正常工作。
三、串行口的4种工作方式
串行口(Serial Port)的工作方式有四种,分别是方式0、方式1、方式2和方式3。
3.1 方式0
方式0,也称为同步移位寄存器方式,是一个8位的同步移位寄存器,工作在同步通信模式下。在这种方式下,串行口不使用波特率发生器,因此数据的发送和接收速率取决于外部的时钟源。
在方式0中,数据从串行口的RXD引脚输入或输出,并且是低位先行。
方式0的特点包括:
- 采用8位数据格式,即每次传输8位数据。
- 串行数据的发送和接收是同步进行的,即通过外部时钟信号来控制数据的发送和接收速率。
- 数据的发送和接收是通过移位寄存器来完成的。在发送时,数据从内部的并行数据寄存器(通常是某个特殊功能寄存器)装载到移位寄存器中,然后逐位移出;在接收时,数据逐位移入移位寄存器,最后移位寄存器的内容被转移到并行数据寄存器中。
- 由于是同步方式,这种方式的数据传输速度比异步方式(如方式1)要快。
- 方式0不支持硬件的起始位和停止位设置,因为它是完全同步的,没有起始位和停止位。
3.2 方式1
方式1是一种可变波特率的8位UART(通用异步收发传输器)。
在方式1下,串行口以8位数据格式进行通信,其中低8位是有效数据位,高1位作为停止位,还有1位起始位。波特率则由定时器1产生,可以通过编程定时器1的初值来调整波特率,使其适应不同的通信需求。
波特率的计算公式为:波特率 = 1/12 * (2^SMOD / 32) * 定时器溢出频率。其中,SMOD是PCON寄存器中的串行口波特率倍增位,定时器溢出频率是定时器1或定时器2溢出频率。
3.3 方式2
方式2是一种8位数据+1位起始位、1位停止位和1位可程控为1或0的第9位数据的可变波特率异步通信方式。
其数据帧格式如下:
- 8位数据:指的是数据部分,通常是一个字节的数据,最高位(MSB)或最低位(LSB)先发送。
- 1位起始位:在数据传输开始前,发送器会发送一个逻辑“0”(低电平)作为起始信号,告知接收器数据即将开始发送。
- 1位停止位:在数据传输结束后,发送器会发送一个逻辑“1”(高电平)作为停止信号,告知接收器当前数据包已经发送完毕。
- 1位可程控为1或0的第9位数据:这个额外的位可以是校验位(如奇偶校验位),也可以用于其他控制目的,根据系统的设计进行编程设置。
可变波特率意味着通信双方可以协商或配置不同的传输速率,以适应不同的通信距离和环境要求。
3.4 方式3
方式3是波特率可变的9位异步通信方式。数据帧由9位组成,其中包括一个起始位、8位数据位(可配置为8位有效数据位加上1位奇偶校验位)和一个停止位。
方式3的特点是它的波特率是可变的,这意味着数据的传输速率可以根据需要进行调整,以适应不同的通信需求。
四、波特率的制定方法
4.1 波特率的定义
波特率是指在数字通信中,每秒传输的比特数。它通常用单位"波特"(Baud)来表示。波特率决定了数据传输的速度,也就是每秒钟可以传输的比特数。
波特率的单位可以理解为每秒钟发生的状态变化次数。在串行通信中,每个比特位都被分为多个时间间隔,称为波特周期或比特周期。波特率表示每秒钟波特周期发生的次数。
4.2 定时器T1产生波特率的计算
方式0波特率固定为:fosc / 12
方式1波特率的计算公式为:(串行口为波特率可变的8位异步通信接口,SMOD为PCON寄存器的最高位值(0或1))
方式1波特率 =(2^SMOD / 32) * 定时器T1的溢出率
(注:当SMOD=1时,要比SMOD=0时的波特率加倍,所以也称SMOD位为波特率倍增位)
方式2的波特率由下式确定:
方式2波特率=( 2^SMOD / 64) * fosc
方式3的波特率由下式确定:
方式3波特率 = (2^SMOD / 32) * 定时器T1的溢出率
相关知识点:
溢出速率 = 1 / 溢出时间
溢出时间(相当于定时时间)= (2^8 – TH1初值)* Tcy
机器周期Tcy = 12时钟周期 = 12*(1/fosc)
故:溢出速率 = 1 / 溢出时间 = 1 / [(256 - TH1初值)* (12 / fosc)] = fosc / [12 *(256-TH1初值)]
计数速率 = 1 / 计数时间 = 1 / (12 / fosc) = fosc / 12
故也可写成:溢出速率 = 计数速率 / (256-TH1初值) = fosc / [12 *(256-TH1初值)]
原文链接: