无论单片机开发还是嵌入式 Linux 开发,串口都是最常用到的外设。可通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。还有很多的模块,比如蓝牙、GPS、 GPRS 等都使用的串口来与主控进行通信的,在嵌入式 Linux 中一般使用串口作为控制台。本篇记录了如何驱动 I.MX6U 的串口,并使用串口和电脑进行通信。
UART 简介
1、 UART 通信格式
串口全称叫做串行接口,通常也叫 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。既然有异步串行收发器,那肯定也有同步串行收发器,比如:STM32除了有 UART 外,还有另外一 个叫做 USART 的东西 。USART 全称是 UniversalSynchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。 相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。 一般 USART 是可以作为 UART使用的,也就是不使用其同步的功能。
UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少需要三条线: TXD(发送)、 RXD(接收)和 GND(地线)。如下图UART 的通信格式:
上图中各位的含义如下:
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,无数据传输。
起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。
数据位: 数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
奇偶校验位: 这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
停止位:数据传输完成标志位,停止位的位数可以选择 1 位、 1.5 位或 2 位高电平,一般选择 1 位停止位。
波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、 115200 等。
2、UART 电平标准
之前学习STM32时候笔记有所记录,本处重复记录。
UART 一般的接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RXD 这样的引脚,这些引脚低电平表示逻辑 0,高电平表示逻辑 1,这个就是 TTL 电平。 而RS-232 采用差分线, -3~-15V 表示逻辑 1, +3~+15V 表示逻辑 0。一般如下图中的接口就是 TTL 电平,图中就是 USB 转 TTL 模块, TTL 接口部分有 VCC、 GND、 RXD、 TXD、RTS 和 CTS。 RTS 和 CTS 基本不用,用的时候通过杜邦线和其他模块的 TTL 接口相连即可。
而RS-232 电平需要 DB9 接口, I.MX6U-ALPHA 开发板上的 COM3(UART3)口就是 RS-232 接
口的,如下图:
现在的电脑都没有 DB9 接口了,取而代之的是 USB 接口,所以催生出很多 USB转串口 TTL 芯片,比如 CH340、PL2303 等。通过这些芯片就可以实现串口 TTL 转 USB。I.MX6UALPHA 开发板就使用 CH340 芯片来完成 UART1 和电脑之间的连接,只需要一条USB 线即可,如下图:
I.MX6U UART 简介
UART 特性
前面介绍了 UART 接口,现在具体看一下 I.MX6U 的 UART 接口, I.MX6U 共有 8 个 UART,其主要特性如下:
- 兼容 TIA/EIA-232F 标准,速度最高可到 5Mbit/S。
- 支持串行 IR(红外) 接口,兼容 IrDA,最高可到 115.2Kbit/s。
- 支持 9 位或者多节点模式(RS-485)。
- 1 或 2 位停止位。
- 可编程的奇偶校验(奇校验和偶校验)。
- 自动波特率检测(最高支持 115.2Kbit/S)。
UART 几个重要寄存器
UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit6)位来选择的,当为 0时 UART 的时钟源为 pll3_80m(80MHz),为 1 时 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,则最终进入 UART 的时钟为 80MHz。
6ULL的UARTx_URXD寄存器保存着串口接收到的数据,要获取串口接收到的数据,读取此寄存器的低8位即可。UARTx_UTXD是串口发送数据寄存器,若需要通过串口发送数据,只需要将数据写入到此寄存器即可。
UART 的控制寄存器 1,即UARTx_UCR1(x=1~8),寄存器 UARTx_UCR1 中用到的重要位如下:
ADBR(bit14):自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能自动波特率检测。
UARTEN(bit0): UART 使能位,为 0 时关闭 UART,为 1 时使能 UART。
此寄存器的结构如下图:
UART 的控制寄存器 2: UARTx_UCR2。寄存器 UARTx_UCR2 用到的重要位如下:
IRTS(bit14):为 0 的时候使用 RTS 引脚功能,为 1 的时候忽略 RTS 引脚。
PREN(bit8):奇偶校验使能位,为 0 的时候关闭奇偶校验,为 1 的时候使能奇偶校验。
PROE(bit7):奇偶校验模式选择位,开启奇偶校验以后此位如果为 0 的话就使用偶校验,此位为 1 的话就使能奇校验。