介绍
设计条件通常限制了嵌入式系统可用的硬件外设。也许可用的硬件 UART 已经被分配,或者系统需要替代功能(当 UART 共享一个公共引脚时会产生冲突)。在软件中实现 UART 是一种常见的解决方案。
Microchip MPLAB C18 C 编译器库包含软件 UART 函数。实现此 UART 需要用户计算并满足所需波特率的特定时序要求。本应用笔记提供了串行数据采样例程中所需的时间延迟以及采样率与串行数据之间的关系的信息。
背景
MPLAB C18 编译器为 Microchip 的 PIC18 系列微控制器产品中的每个通信外设提供了硬件和软件库。硬件库充分利用了端口寄存器和分配的端口引脚,而软件库允许用户指定和配置 GPIO 引脚作为通信端口。假设用户熟悉 MPLAB IDE 环境、MPLAB C18 C 编译器和 RS232。
默认库函数期望主机串行端口配置为 8 个数据位、1 个停止位、无奇偶校验和无流控制。Microchip 提供了库的所有汇编文件,因此开发人员可以修改配置和/或端口引脚。
应用
C18 库提供了初始化端口和发送/接收串行数据的函数。然而,嵌入式开发人员必须提供库函数使用的延迟例程,即 DelayTXBitUART、DelayRXHalfBitUART 和 DelayRXBitUART。这些例程设置了与通信期间的位周期相对应的延迟。这提供了一种同步数据传输和采样接收数据的方法。
通过连续轮询接收引脚来识别传入数据。从高到低的转换表示串行数据帧的起始位。半位延迟将采样点设置在起始位的中点。在初始的半位延迟之后,使用全位延迟来采样剩余的数据。对每一帧接收到的数据重复此过程。图 1 展示了这种技术在一帧中的应用。
图 1 。 RS-232 逻辑电平信号采样和延迟
导致采样误差的因素包括对起始位的初始响应延迟、半比特和全比特延迟的不准确性,以及发射器和接收器时钟的容差。每个因素都会从每个比特的理想采样点引入一个小的**Δt 。这些偏差在整个数据帧中累积,并可能在数据比特位置之前或之后移动采样点,从而导致数据恢复错误。需要进行一些分析以确保可靠的通信。
初始响应延迟
初始响应延迟**t_ird 是起始位转换与其检测之间的最大时间。它由接收引脚被轮询的频率决定。因此,微控制器在轮询样本之间执行的指令数量会影响初始响应延迟的大小。t_ird为每个数据帧引入一次采样偏移。图2展示了时序误差。使用方程(1)计算轮询例程提供的时间延迟。
图 2 。 采样点变化
例如,标称时钟频率F_osc 为 4 MHz,轮询例程中有3个指令周期,则t_ird**为 3us 。
接收半比特和全比特延迟
接收半比特和全比特延迟决定了任何振荡器和比特率组合所需的指令周期数(另见C18库文档,第3.6章)。方程(2)和(3)分别定义了这些关系。
例如,标称时钟频率F_osc 为 4MHz ,波特率为 9600bps 时,需要 44 个指令周期的半比特延迟和 91 个指令周期的全比特延迟。
使用方程(4)和(5)分别计算半比特和全比特指令周期延迟提供的时间延迟。对于上述示例,半比特时间延迟为53us,全比特时间延迟为105us。
对于9600bps的接收数据,总时间周期(1个起始位,8个数据位)为937.5us,最后一个数据位的中心点在885.4us处。采样传入数据需要1个Thalfbit 和8个Tbit 延迟,总计893us。最后一个数据位的采样点与比特周期中心点偏移约7.6us。
时钟容差误差
发射器和接收器之间的时钟变化也会导致采样误差。时钟误差Tcte是采样点与传输数据帧的第n个数据位之间的时间。由于微控制器内部振荡器在环境温度下可能变化**±2% ,在操作温度范围内可能变化 ±10% ,因此由 Tcte 上限和 Tcte 下限界定的采样窗口会有所不同。 f_max 和 f_min 是应用环境中最坏情况下的时钟频率。方程( 6 )和( 7 )确定最终采样是否发生在数据帧第 n 位结束之前。
nbits是数据包中的位数(包括起始位和数据位)。方程(8)和(9)确保采样在第n位开始之后进行。
假设主机传输速率为9600bps,需要恢复9位(1个起始位,8个数据位),并且使用4MHz时钟,精度为±2%。接收微控制器的4MHz时钟精度也为±2%。使用方程(6)和(8)得到Tcte 上 限=-15.6us,Tcte 下 限=17.7us,满足方程(7)和(9)中的时序边界条件。
当传输时钟精度降低到±4%时,Tcte 上 限=2.0us,Tcte 下 限=0us,不满足边界要求,导致在最坏时钟频率下出现通信错误。
总接收误差
总接收误差**Ttre 是初始响应延迟、半位和全位延迟以及时钟容差误差的总和。实际上,由于时序误差的累积,受时钟变化限制的采样窗口在时间上会发生偏移。这种偏移可能导致采样窗口落在数据位边界之外,从而导致通信错误。方程(10)和(11)确定最终采样是否发生在数据帧第n位结束之前。方程(12)和(13)确保采样在第n位开始之后进行。
扩展前面的例子,假设主机传输速率为9600bps,需要恢复9位(1个起始位,8个数据位),并且使用4MHz时钟,精度为±2%。接收微控制器的4MHz时钟精度为±2%。将方程(1)、(4)、(5)、(6)和(8)的结果应用于方程(10)和(12),得到Ttre 上 限=-15.6us,Ttre 下限 =17.7us,满足方程(11)和(13)中的时序边界条件。
累积的时序效应可能将采样点移动到位周期的边缘。线路上的噪声或电容效应改变信号边沿速率可能会进一步减少采样余量,直到数据无法可靠恢复。
传输全位延迟误差
从目标设备传输数据也会引入全位延迟不准确性和时钟容差导致的时序误差。传输全位延迟,方程(14),确定任何振荡器和波特率组合所需的指令周期数。方程(15)计算由全位指令周期延迟提供的时间延迟。
对于4MHz的微控制器时钟频率F osc 和9600bps的波特率,需要93个指令周期的全位延迟。全位时间延迟为105us。
传输时序误差随着起始位、8个数据位和停止位的传输而累积,可能会影响主机接收器恢复数据的能力。
结论
必须保持保守的时序裕量,以确保可靠的数据传输。如果需要高比特率,严格的时钟容差可以增强时序裕量。增加时钟频率可以减少软件半比特和全比特延迟的不准确性。降低串行数据速率可以提供更长的比特周期,从而增加时序裕量。
使用软件UART并非没有陷阱。但是,一旦理解并改善了导致错误的因素,就可以使用任何一对GPIO引脚实现可靠的串行通信端口。
附加信息
MPLAB® C18 C编译器库,第3.6章;Microchip Technology, Inc.
英文原文链接:PIC18 Software UART Timing Requirements








