LV04-04-串口通信-01-UART基础

本文主要是串口通信——UART基础知识的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
Win32DiskImager Win32DiskImager v1.0
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
https://elixir.bootlin.com/linux/latest/source 在线阅读linux kernel源码
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)

一、UART简介

1. UART 通信格式

串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种, UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。

既然有异步串行收发器,那肯定也有同步串行收发器,叫USART。USART 的全 称 是 Universal Synchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。 相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。 一般 USART 是可以作为 UART使用的,也就是不使用其同步的功能。

UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:TXD(发送)、 RXD(接收)和 GND(地线)。 UART 之间为何能够准确可靠的的发送和接收数据?首先我们需要约定好传输速率(每一秒传输的数据位数,即波特率),一般选择 9600,19200,115200 等。确定好传输速率后,我们还需要确定传输数据的格式, UART 串口通信的数据包以帧为单位,常用的帧结构为: 1 位起始位+8 位数据位+1 位奇偶校验位(可选) +1 位停止位。举例说明,如下图:

image-20230729103935953

该图就是 UART通信中 1位起始位+8位数据位+1位偶校验位+1位停止位 的波形。 根据查找 ASCII 码表得知’ A ’字符的 ASCII 值为 41(十进制),将其转换成
二进制应该为 0100 0001,小端传输,即低位( LSB)在前,高位( MSB)在后,和上图所示一致。

(1)空闲位:平时没有数据时,数据线为高电平(逻辑 1);

(2)起始位:当需要发送数据时, UART 将改变 UARTx_TXD 的状态,变为低电平,即为上图中的起始位(逻辑 0);

(3)数据位:可以有 5、 6、 7 或 8 位的数据,一般我们是按字节(8 位)传输数据,发送方一位一位的改变数据线上的状态(高电平或低电平)将它们发送出去,传输数据时先传最低位,最后传送最高位。字符’ A ’的 8 位二进制字符是 0100 0001,先发送最低位 bit 0,其值为1;再发送 bit 1,其值为 0,如此继续;最后发送最高位 bit 7,其值为 0。

(4)奇偶校验位:如果使用了奇偶校验功能,有效数据位发送完毕后,还要发送1 个校验位(奇偶校验位)。有两种校验方法:奇校验,偶校验——数据位连同校验位中,“1”的数目等于奇数或偶数。奇偶校验只能检错,不能纠错的。而且只能检测 1 位误码,检测出有错后只能要求重发,没法纠正的。上图中使用的是偶较验,即 8 个数据位和 1 个校验位中,一共有偶数个“1”: 2 个。

(5)停止位:停止位(逻辑 1)用来表示当前数据传输完毕。停止位的长度有三种: 1 位, 1.5 位, 2 位,通常我们选择 1 位即可。

2. UART 硬件连接

2.1 TTL 电平三线连接

UART 串口最精简的连接是 TTL 电平三线连接

(1)UARTx_TXD:用于发送数据,应连接到接收设备的 UARTx_RXD 引脚上;

(2)UARTx_RXD:用于接收数据,应连接到发送设备的 UARTx_TXD 引脚上;

(3)GND:为双方提供一个相同的参考电平。

image-20230729104827593

上图为 UART 串口 TTL 电平硬件连接,此时使用标准的 TTL 电平来表示数据,高电平表示 1,低电平表示 0,标准 TTL 输入高电平最小 2V,输出高电平最小 2.4V,典型值为 3.4V,输入低电平最大 0.8V,输出低电平最大 0.4V,典型值为 0.2V。直接采用 TTL 电平进行串行通讯,由于其抗干扰能力差,导致传输距离短,且容易出现数据不可靠的情况。 为提高抗干扰能力和传输距离,一般采用下面的硬件连接方式:

image-20230729104903289

RS232 电平规定逻辑“ 1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V,选用该电气标准以提高抗干扰能力。常用的 TTL 转 RS232 芯片有:MAX232, SP3232 等。

RS-232 电平需要 DB9 接口, I.MX6U-ALPHA 开发板上的 COM3(UART3)口就是 RS-232 接口的,如图所示:

image-20230729105134577

2.2 TTL 电平转 USB 电平

image-20230729104956715

将 TTL 电平转换为 USB 电平( D+与 D-一对差分信号采用 NRZI 编码实现通讯),提高抗干扰能力,常用的 TTL 转 USB 芯片有: PL2303, CH340, CP2102等 ,常见的转换模块就是CH340啦,如下图所示:

image-20230729105052898

改模块就是 USB 转 TTL 模块, TTL 接口部分有 VCC、 GND、 RXD、 TXD、RTS 和 CTS。 RTS 和 CTS 基本用不到,使用的时候通过杜邦线和其他模块的 TTL 接口相连即可。

由于现在的电脑都没有 DB9 接口了,取而代之的是 USB 接口,所以就催生出了很多 USB转串口 TTL 芯片,就比如上边说的。通过这些芯片就可以实现串口 TTL 转 USB。I.MX6UALPHA开发板就使用CH340 芯片来完成UART1 和电脑之间的连接,只需要一条USB 线即可,如图所示。

image-20230729105432453

二、I.MX6ULL UART

接下来就来了解一下I.MX6ULL的UART吧。主要参考《i.MX 6ULL Applications ProcessorReference Manual》参考手册的Chapter 55 Universal Asynchronous Receiver/Transmitter (UART) 一节。

1. UART模块简介

IMX6ULL 共 8 个独立的 UART 通道,即 8 个 UART,主要特性如下:

①、兼容 TIA/EIA-232F 标准,速度最高可到 5Mbit/S。

②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。

③、支持 9 位或者多节点模式(RS-485)。

④、 1 或 2 位停止位。

⑤、可编程的奇偶校验(奇校验和偶校验)。

⑥、自动波特率检测(最高支持 115.2Kbit/S)。

2. 都有哪些寄存器?

我们可以看一下《i.MX 6ULL Applications ProcessorReference Manual》参考手册的Chapter 55 Universal Asynchronous Receiver/Transmitter (UART)

下的55.15 UART Memory Map/Register Definition ,这一节有一个表格汇总了UART的所有寄存器。

3. 寄存器简介

3.1 UARTx_URXD

image-20230729124950110

主要用于接收串口数据的寄存器,只有低八位的空间是存储接收数据的,其他是一些判断位,基本用不上;有数据时,读取这个寄存器就可以得到数据。

3.2 UARTx_UTXD

image-20230729125123876

用于发送串口数据的寄存器,只有低八位的空间用于发送数据,其他位保留不使用;要发送数据时,写入这个寄存器就可以了。

3.3 UARTx_UCR1

image-20230729125301922

控制寄存器 1,用于设置串口各类功能的使能,例如自动波特率检测的使能,发送中断,串口 DMA 使能,串口使能等。寄存器 UARTx_UCR1 我们用到的重要位如下:

**ADBR(bit14)**:自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能自动波特率检测。

**UARTEN(bit0)**: UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART。

3.4 UARTx_UCR2

image-20230729125444918

控制寄存器 2:主要用于设置串口的发送帧格式,帧长,是否奇偶校验,是否忽略有 RTS,软复位等 。寄存器 UARTx_UCR2 用到的重要位如下:

**IRTS(bit14)**:为 0 的时候使用 RTS 引脚功能,为 1 的时候忽略 RTS 引脚。

**PREN(bit8)**:奇偶校验使能位,为 0 的时候关闭奇偶校验,为 1 的时候使能奇偶校验。

**PROE(bit7)**:奇偶校验模式选择位,开启奇偶校验以后此位如果为 0 的话就使用偶校验,此位为 1 的话就使能奇校验。

**STOP(bit6)**:停止位数量,为 0 的话 1 位停止位,为 1 的话 2 位停止位。

**WS(bit5)**:数据位长度,为 0 的时候选择 7 位数据位,为 1 的时候选择 8 位数据位。

**TXEN(bit2)**:发送使能位,为 0 的时候关闭 UART 的发送功能,为 1 的时候打开 UART的发送功能。

**RXEN(bit1)**:接收使能位,为 0 的时候关闭 UART 的接收功能,为 1 的时候打开 UART的接收功能。

**SRST(bit0)**:软件复位,为 0 的是时候软件复位 UART,为 1 的时候表示复位完成。复位完成以后此位会自动置 1,表示复位完成。此位只能写 0,写 1 会被忽略掉。

3.5 UARTx_UCR3

image-20230729130059327

控制寄存器 3:一般只设置 bit2,官方要求设置,属于芯片特点。也就是RXDMUXSEL(bit2),这个位应该始终为 1,这个在《i.MX 6ULL Applications ProcessorReference Manual》第 3624 页有说明。

3.6 UARTx_USR2

串口状态寄存器,该寄存器里面主要是一些串口的状态位。寄存器 UARTx_USR2 用到的重要位如下:

**TXDC(bit3)**:发送完成标志位,为 1 的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也就是发送完成,向 TxFIFO 写入数据此位就会自动清零。

**RDR(bit0)**:数据接收标志位,为 1 的时候表明至少接收到一个数据,从寄存器UARTx_URXD 读取数据接收到的数据以后此位会自动清零。

3.7 UARTx_UFCR

image-20230729131032334

串口 FIFO 控制寄存器,设置发送与接收的 fifo 的大小,最大 32 字节,串口时钟分频系数等。寄存器UARTx_UFCR 中我们要用到的是位 RFDIV(bit9:7),用来设置参考时钟分频:

RFDIV(bit9:7) 分频值
000 6 分频
001 5 分频
010 4 分频
011 3 分频
100 2 分频
101 1 分频
110 7 分频
111 保留

3.8 UARTx_UBIR 与 UARTx_UBMR

用于设置波特率,即每秒可传输的位数 ,通过UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR 这三个寄存器,可以设置 UART 的波特率,波特率的计算公式如下 :

image-20230729131444598

Ref Freq:经过分频以后进入 UART 的最终时钟频率。

UBMR:寄存器 UARTx_UBMR 中的值。

UBIR:寄存器 UARTx_UBIR 中的值。

通过 UARTx_UFCR 的 RFDIV 位、 UARTx_UBMR 和 UARTx_UBIR 这三者的配合即可得到我们想要的波特率。比如现在要设置 UART 波特率为 115200,那么可以设置 RFDIV 为5(0b101),也就是 1 分频,因此 Ref Freq=80MHz。设置 UBIR=71, UBMR=3124,根据上面的公式可以得到:

image-20230729131538537