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 位停止位。举例说明,如下图:
该图就是 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:为双方提供一个相同的参考电平。
上图为 UART 串口 TTL 电平硬件连接,此时使用标准的 TTL 电平来表示数据,高电平表示 1,低电平表示 0,标准 TTL 输入高电平最小 2V,输出高电平最小 2.4V,典型值为 3.4V,输入低电平最大 0.8V,输出低电平最大 0.4V,典型值为 0.2V。直接采用 TTL 电平进行串行通讯,由于其抗干扰能力差,导致传输距离短,且容易出现数据不可靠的情况。 为提高抗干扰能力和传输距离,一般采用下面的硬件连接方式:
RS232 电平规定逻辑“ 1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V,选用该电气标准以提高抗干扰能力。常用的 TTL 转 RS232 芯片有:MAX232, SP3232 等。
RS-232 电平需要 DB9 接口, I.MX6U-ALPHA 开发板上的 COM3(UART3)口就是 RS-232 接口的,如图所示:
2.2 TTL 电平转 USB 电平
将 TTL 电平转换为 USB 电平( D+与 D-一对差分信号采用 NRZI 编码实现通讯),提高抗干扰能力,常用的 TTL 转 USB 芯片有: PL2303, CH340, CP2102等 ,常见的转换模块就是CH340啦,如下图所示:
改模块就是 USB 转 TTL 模块, TTL 接口部分有 VCC、 GND、 RXD、 TXD、RTS 和 CTS。 RTS 和 CTS 基本用不到,使用的时候通过杜邦线和其他模块的 TTL 接口相连即可。
由于现在的电脑都没有 DB9 接口了,取而代之的是 USB 接口,所以就催生出了很多 USB转串口 TTL 芯片,就比如上边说的。通过这些芯片就可以实现串口 TTL 转 USB。I.MX6UALPHA开发板就使用CH340 芯片来完成UART1 和电脑之间的连接,只需要一条USB 线即可,如图所示。
二、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
主要用于接收串口数据的寄存器,只有低八位的空间是存储接收数据的,其他是一些判断位,基本用不上;有数据时,读取这个寄存器就可以得到数据。
3.2 UARTx_UTXD
用于发送串口数据的寄存器,只有低八位的空间用于发送数据,其他位保留不使用;要发送数据时,写入这个寄存器就可以了。
3.3 UARTx_UCR1
控制寄存器 1,用于设置串口各类功能的使能,例如自动波特率检测的使能,发送中断,串口 DMA 使能,串口使能等。寄存器 UARTx_UCR1 我们用到的重要位如下:
**ADBR(bit14)**:自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能自动波特率检测。
**UARTEN(bit0)**: UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART。
3.4 UARTx_UCR2
控制寄存器 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
控制寄存器 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
串口 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 的波特率,波特率的计算公式如下 :
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,根据上面的公式可以得到: