模拟DS80C320和其他高速微控制器具有两个相同的串行端口。本应用笔记向用户介绍微控制器中使用的通用同步/异步接收器/发送器(USART)。应用笔记讨论了波特时钟源、轮询和中断模式、波特率生成、异步10位操作和双串行端口操作。代码示例用于突出显示用作波特率生成器的计时器的使用。
介绍
高速微控制器的串行接口在功能上与其他性能较低的8051处理器上的接口相同。它们基于通用同步/异步接收器/发射器 (USART) 实现。顾名思义,USART 将并行数据与同步或异步串行位流相互转换。器件的并行数据侧与处理器的内部数据总线接口,串行端与外界接口。本应用笔记描述了该接口最常见的工作模式的设置和操作。
由于其普遍适用性,高速微型串行通道最常用的配置是其10位异步模式。在本应用笔记中,将详细描述此配置。将提供港口操作的一般概述,并提供详细的软件示例。还将介绍说明使用双串行端口和11位地址识别功能的示例。通过这三个示例,将讨论串口操作的不同方面。
最常见的串行通信模式是基于异步数据传输。在这种传输模式下,没有单独的时钟信号。图1所示的经典串行异步数据通信格式无需时钟信号即可提供必要的同步。在这种格式中,8或9个数据位伴随着一个起始位和一个或两个停止位。第 9 个数据位经常用作奇偶校验位。开始位和停止位提供必要的同步信息。此模式下的串行比特流内容与流行的RS-232协议兼容。但是,信号电平不是。为了兼容信号电平,必须使用DS232A等电平转换器将TTL/CMOS电平转换为RS-232电平。
图1.异步数据格式。
请注意,高速微控制器系列的许多成员具有两个功能相同的串行端口。随着新成员添加到处理器家族中,有些成员可能没有两个串行端口。有关具体功能,请参阅各个器件的数据手册。本应用笔记将重点介绍单个串行端口(端口0)的使用,但在示例中,所介绍的想法同样适用于两个端口。一个示例程序演示了这两个串行端口的使用。
波特钟源
虽然本文档的目的不是讨论高速微型内部定时器的细节,但必须对它们进行一些讨论,因为它们经常被用作波特率时钟的来源。高速微型包含三个内部定时器,其中两个可用作波特率发生器。以下各节简要介绍这些定时器及其最常用于波特率的模式 代。
有关定时器设置的详细信息将通过下面的软件示例进行说明。
在这两个定时器上,自动重新加载模式经常用于波特率生成,因为它不需要处理器的干预。初始化后,定时器自动运行,根据加载到定时器重加载寄存器中的值生成波特率时钟。在此模式下,计时器 1 使用 SFR 寄存器 TL1 进行计数,使用 TH1 存储重新加载值。软件必须使用所需的重新加载值初始化 TH1,如果第一个时间间隔是正确的,TL1 也必须使用相同的值加载。定时器2使用寄存器TL2和TH2进行计数,并寄存器RCAP2L和RCAP2H用于保存重新加载值。同样,这些寄存器必须由软件初始化。启用后,计时器将根据所选时钟源开始计数。定时器1的时钟是振荡器/12或振荡器/4。对于定时器2,振荡器/2是波特时钟生成模式下的唯一可能性。当计数寄存器从其最大计数滚动到 0 时,它们将自动重新加载,并带有重新加载寄存器中的值。除非由软件修改,否则重新加载值保持不变。每次发生翻转时,都会产生一个时钟脉冲。该时钟脉冲被串行端口用作波特率时钟。通过改变重载值,可以实现多种波特率。
轮询模式与中断驱动模式
高速微型的串行通道在SFR地址空间中具有指示通道状态的标志位。对于每个串行通道,都有一个指示何时接收字符的标志 (RI) 和一个指示何时传输字符的标志 (TI)。无论是否启用关联的中断,都会设置这些标志,因此可以在轮询操作模式下使用。或者,如果启用了中断,则这些标志中的任何一个的设置都将导致跳转到串行通道的关联中断向量。
由于串行中断是异步的,基于与外部设备的串行通信,大多数应用将受益于使用中断驱动的通信方案。这样,处理器可以在等待接收中断时完成其他任务。如果使用轮询方法,则会花费时间不断检查标志位以查看是否已设置。本应用笔记的示例说明了这两种方法。第一个示例演示了典型的中断驱动操作模式。第二个示例执行一组非常结构化的事件,因此它非常适合轮询操作。
插入中断字符
中断字符是通信流中很长的 null。确切的长度因所使用的通信格式而异。软件可以通过将逻辑 0 写入相应串行端口的 RX 引脚的端口锁存位来轻松创建空值。请注意,将 00h 写入 SBUF0 或 SBUF1 不会达到预期效果,因为数据流中使用的开始位和停止位是逻辑 1。在断字符结束时,软件只需要将逻辑1写入相应串行端口的RX引脚的端口锁存位。
异步 10 位模式示例
异步 10 位工作模式可以说是 8051 系列中最常用的串行通信方法。这是因为此模式与熟悉的RS-232协议兼容。虽然信号电平不同,但使用简单的电平转换器将允许与任何个人计算机的标准串行端口进行通信。事实上,本应用笔记中的所有软件都使用PC与DS80C320测试板接口进行测试。
此特定串行模式可以使用定时器 1 为串行端口 1 生成波特率,或为串行端口 1 生成定时器 2 或 0。在本例中,定时器2在自动重新加载模式下运行,以生成串行端口0的波特率。
建立定时器的工作模式后,重新加载值必须存储在重新加载寄存器中。重载寄存器的内容可以使用以下公式计算所需的波特率和振荡器频率:
使用该公式,可以计算出任何所需波特率和振荡器频率的重载值。对于本软件示例,假设振荡器频率为 11.0592 MHz。下表显示了基于该晶体频率的几种常见波特率的重载值。应该注意的是,并非每个晶体值都会产生可接受的波特率。如果需要特定的波特率,则在为系统选择晶体之前,可能需要对上述方程进行一些评估。
波特率 | RCAP2H | RCAP2L |
57600 | 0FFh | 0FAh |
9600 | 0FFh | 0直流小时 |
2400 | 0FFh | 070小时 |
1200 | 0飞扬 | 0E0h |
一旦确定了重载值,就必须将其加载到定时器的重载寄存器中,以建立定时器的输出时钟频率。
初始化定时器后,可以根据需要设置串行端口。要为串行端口 0 建立正确的操作模式,必须正确设置 SCON 寄存器的 SM0 和 SM1 位(地址 098h)。下表显示了这些位的可能设置和生成的模式。如图所示,对于 0 位异步操作,SM1 和 SM0(SCON1.0 和 SCON0.0)必须分别设置为 1 和 10。
SM0 | SM1 | 模式 | 功能 | 长度 | 时期 |
0 | 0 | 0 | 同步 | 8 位 | 4/12 吨时钟 |
0 | 1 | 1 | 异步 | 10 位 | 定时器 1 或 2* |
1 | 0 | 2 | 异步 | 11 位 | 64/32 吨时钟 |
1 | 1 | 3 | 异步 | 11 位 | 定时器 1 或 2* |
*定时器2仅适用于串行端口0上的波特率生成。 |
由于串行端口将在中断驱动模式下运行,因此必须正确设置中断使能。通过将 ES0(地址 0ACh)和 EA(地址 0AFh)位设置为 1,串行端口 0 将在传输字符或接收字符时生成中断。
作为初始化的最后一步,通过设置位 TR2(地址 0CAh)来启动计时器。此时,串行通信可能开始。为了传输字符,将字符写入 SBUF(字节地址 099h),并执行其他任务,直到收到中断(在本例中为紧密循环)。在接收字符时,在发生中断之前不需要执行任何操作。由于发送或接收都可能导致跳转到同一中断向量,因此中断服务例程 (ISR) 必须确定哪个是原因。这是通过读取SCON寄存器的TI(位地址099h)和RI(位地址098h)状态位来完成的。如果设置了 TI,则“传输完成”会导致中断。如果设置了 RI,则“接收”会导致中断。如果传输导致中断,则 TI 位可能被清除并退出 ISR。如果接收导致中断,则必须清除 RI 位,并且必须从 SBUF 读取接收的字符。
下面示例 1 的软件列表说明了实现此串行操作模式的详细信息。
双串行端口示例
本例演示DS80C320上两个串行端口的用法。该示例的主要目的是说明如何初始化和使用第二个端口。如前所述,有关串行端口 0 的许多信息同样适用于串行端口 1。但是,此示例将有助于澄清有关使用此资源的任何混淆。
在此示例中,端口 1 (TXD1) 的输出以“环回”配置连接到其输入 (RXD1)。编写该软件以创建以端口 0 作为输入和输出的闭合串行环。运行终端仿真器的终端或 PC 连接到端口 0 的输入 (RXD0) 和输出 (TXD0)。最初,软件通过端口0向终端输出三行消息,DS80C320等待输入。当终端向DS80C320发送字符时,设置RI位。当软件识别出此位已设置时,它会读取接收到的字符并将其传输到端口 1 的传输缓冲区。出于说明目的,字符在传输之前将转换为大写(如果尚未转换为大写)。由于端口 1 的输出与其输入相关联,因此传输的字符会自动进入接收缓冲区。然后,软件将此字符复制到端口 0 的传输缓冲区,从而使其从处理器传输出去。最后,字符作为大写字符到达终端,从而完成循环。
在此软件示例中,两个串行端口都设置为从定时器1生成的波特时钟运行。定时器设置为自动重新加载模式,计数和重新加载寄存器加载适当的值。定时器 1 用于计算重载值的公式与定时器 2 的公式不同,如下所示:
使用上述公式,可以计算所需波特率和振荡器频率的重载值。可以看出,重载值是 2 提高到 SMOD 的幂的函数。由于 SMOD 可以是 0 或 1,因此该项可以是 1 或 2 (20= 1, 21= 2)。因此,将 SMOD 设置为 1 具有使波特率加倍的效果。同样,对于本软件示例,假设振荡器频率为11.0592 MHz。下表3显示了基于该晶体频率为几种常见波特率计算的重载值。
波特率 | SMOD | 重新加载 |
57600 | 1 | FF |
19200 | 1 | FD |
9600 | 0 | FD |
2400 | 0 | F4 |
1200 | 0 | E8 |
如上式所示,重载值是根据 SMOD 波特率倍增器位的设置计算的。如果该位对于所需的波特率为 0,则无需在初始化软件中清除它 因为这是它的重置默认设置。但是,为清楚起见,示例中包含了清除两个端口的此位的说明。由于SMOD位不是“位可寻址”的,因此必须写入整个PCON寄存器。示例代码显示了使用单个逻辑指令清除和设置 SMOD 位的指令。程序中未使用的指令被注释掉。
在该示例中,初始化定时器模式,加载计数和重新加载寄存器,清除两个SMOD位,并禁用定时器中断。这完全配置了波特时钟生成。将两个串行控制寄存器设置为所需模式后,定时器启动,串行通信开始。
此示例处理串行通信的方式与前面的示例所示不同。此示例使用轮询模式来监视串行状态。由于此示例的操作更加结构化,因此这种轮询方法是合适的。传输字符的基本函数是 GETCH 和 PUTCH。这两个函数都执行一个紧密循环,等待设置适当的标志。当它出现时,程序将继续。这通常被认为是浪费时间,但在此应用程序和其他类似应用程序中,轮询操作是有意义的。
示例 2 的软件列表说明了实现此串行操作模式的详细信息。
地址识别示例
本例演示了高速微型串行通道的地址识别功能。此外,它还说明了一种不涉及使用定时器(即 串行模式 2)。
高速微型的地址识别功能经常用于多处理器通信。总线上的每个处理器都可以分配一个唯一的地址。配置后,处理器将无法识别任何串行通信,除非其地址匹配。有关此工作模式的完整详细信息,请参阅《高速微控制器用户指南》。
在此示例中,地址设置为识别控件 C 字符 (03h)。在控件 C 之前接收的任何字符都将被忽略。但是,当收到控件 C 时,会立即打印一个字符串, 在 RXD0 上收到的后续字符将回显到 TXD0。
如前所述,图示的产生波特率的模式不涉及定时器(即串行模式2)。波特率可选,如下式所示:
从等式中可以看出,如果需要特定的波特率,则这种串行模式的晶体频率选择比其他模式受到更多的限制。事实上,产生标准波特率的晶体频率相对较少。在本例中,假设振荡器频率为 7.372 MHz,这将导致速率为 115,200 波特,SMOD 清除为 0。看到 12.0 MHz 的振荡器将产生 187,500 波特的速率,SMOD 清除为 0 是很常见的。
审核编辑:郭婷
-
微控制器
+关注
关注
48文章
7437浏览量
150825 -
计时器
+关注
关注
1文章
416浏览量
32597 -
发送器
+关注
关注
1文章
258浏览量
26777
发布评论请先 登录
相关推荐
评论