使用ADuCM3027/ADuCM3029串行端口实现UART
使用ADuCM3027/ADuCM3029 处理器上的同步串行端口(SPORT)可以实现全双工异步端口,以最小的软件开销与通用异步接收品/发送器(UART)通信。本应用笔记介绍如何实现适用于多个标准波特率的全双工UART接口。
SPORT概述
SPORT接口不仅支持各种串行数据通信协议,而且还能与诸多工业标准数据转换器、编解码器以及其他处理器(包括数字信号处理器(DSP))实现无缝硬件接口。
SPORT接口的主要特性和功能包括
l持续运行的时钟
l串行数据字长3位到32位,MSB或LSB优先
l两个同步发送数据信号和两个同步接收数据信号
l支持总数据流两倍的缓冲区
l可配置帧同步信号
有关SPORT接口的更多信息,请参见https://wiki.analog.com/resources/eval/sdp/sdp-b/ peripherals/sport 。
图1.SPORT信号
异步通信
同步串行通信与异步串行通信的差别在于是否存在时钟信号和帧同步信号。同步串行端口具有一个时钟信号和一个可选的帧同步信号。异步端口没有时钟信号和帧同步信号。没有时钟信号时,异步端口必须以预定的数据速率(比特率)进行通信。没有帧同步信号时,字帧信息嵌入在数据流中。起始位标记传输开始。停止位标记传输结束。字长在接收器和发送器之间预先确定。
异步SPORT发送器
对于时钟速率等于UART所需比特率的内部生成时钟,必须配置串行端口的发送端。在时钟分频器寄存器(SPORT_div_A)中将CLKdiv位置位,便可对SPORT_A模块进行这一配置。
SPORT_div_A寄存器中的CLKdiv位=
波特率
其中,PCLK 是外设时钟信号。
SPORT_A时钟仅用于将串行端口同步到所需的比特率。实际时钟信号(SPORT_ACLK)不连接任何端口。 将帧同步信号(SPORT_AFS)配置为内部生成,并使信号悬空。SPORT_A模块必须始终优先发送LSB以仿真UART发送。在SPORT_CTL_A寄存器SLEN字段编程设定SPORT_A模块要发送的位数。在SPORT_NUMTRAN_A寄存器中编程设定要传输的总字数,其中每个字的大小通过SLEN字段确定。
在SPORT_A模块向UART器件发送数据的SPORT发送中,UART始终接收首个传输数据作为0x00,这一数据是可丢弃的,后跟SPORT_A模块发送的正确数据序列。发生该序列的原因在于,开始发送时(配置完成后),UART Rx线路处于空闲高电平(逻辑1),SPORT数据线路处于空闲低电平(逻辑0)。UART在传输开始时将这一逻辑0解读为起始位并接收逻辑0的整个帧。
异步SPORT接收器
在没有内部帧同步信号时,串行端口必须确定新数据发送的开始位置。UART器件的发送引脚与ADuCM3029/ ADuCM3027的SPORT_B模块上的数据线路引脚(SPORT_BD0)和帧同步引脚(SPORT_BFS)相连。SPORT_B模块配置用于内部生成的时钟和低电平有效外部帧同步信号。
由于SPORT无法保证与输入位流的任何相位同步,因此有必要对输入异步数据流进行过采样。SPORT上的接收时钟必须设置为所需波特率的三倍。例如,如果ADuCM3029/ADuCM3027 SPORT与UART器件的通信速率为9600 bps,那么SPORT接收时钟的波特率必须设置为28,800 bps。计算相应的除数并在时钟分频器寄存器(SPORT_div_B)中编程设定CLKdiv位即可为SPORT_B模块进行此设置。
SPORT_div_B寄存器中的CLKdiv位=
波特率
低电平有效帧同步信号(SPORT_BFS)在内部生成时钟(SPORT_BCLK)的有效沿上进行轮询。如果UART数据包的低电平起始位导致SPORT_BFS信号置位,SPORT_B模块开始接收UART器件发送的字,并且在接收完UART数据包的所有N位(N由SPORT_CTL_B寄存器中的SLEN字段设定)之前不会检查SPORT_B线路。SPORT将过采样的起始位用作帧同步位以开始接收输入的异步数据流。
硬件和软件概述
硬件概述
图2显示ADuCM3029/ ADuCM3027 SPORT与另一器件上基本UART端口的发送(Tx)引脚和接收(Rx)引脚的连接。
图2.ADuCM3029/ADuCM3027 微控制器单元(MCU)与UART接口的连接
软件概述
管理进出SPORT的异步数据所需的软件最少。在"SPORT_UART_Emulator专用代码"一节中对SPORT发送和接收专用的C函数进行了介绍。该代码针对UART主机与ADuCM3029/ADuCM3027 SPORT在两个传输方向上的多个波特率和多次传输进行测试。
异步SPORT发送器(SPORT_A模块)
在发送端,必须将待发送的N位数据格式化成一个UART发送包。在字中必须加入一个起始位和一个停止位,以便UART器件能够正确接收。
数据格式的示例如下:
l对于8-N-1发送格式(8位数据 + 0奇偶校验位 + 1个停止位),数据 = 0xAA (b#1010 1010)。
l修改后的数据 = b# 1 10101010 0 1 (1个停止位 + 8位数据 + 1个起始位 + 1个停止位)
开始发送时必须附加一个停止位,这是因为在发送一个完整字时,SPORT_AD0线路会保留LSB的值(如果LSB被优先发送)。必须将UART Rx线路设置为空闲高电平才能避免连续字节之间生成的信号中产生会导致数据损坏的毛刺。