UART 使用指南
1. 模块介绍
1.1. 术语定义
术语 | 定义 | 注释说明 |
---|---|---|
UART | Universal Asynchronous Receiver/Transmitter | 通用异步收发传输器 |
TTL | Transistor-Transistor Logic | 逻辑门电路 |
DCD | Data Carrier Detect | 载波侦听 |
DTR | Data Terminal Ready | 数据终端准备好 |
DSR | Data Set Ready | 数据准备好 |
RTS | Request To Send | 请求发送 |
CTS | Clear To Send | 清除发送 |
RI | Ring Indicator | 响铃指示 |
THR | Transmit Holding Register | 发送保持寄存器 |
RBR | Receive Buffer Register | 接收缓冲寄存器 |
ACPI | Advanced Configuration and Power Interface | 高阶配置和电源接口 |
1.2. 模块简介
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作 UART,是一种通用串行数据总线。
串行通信是指利用一条传输线将数据一位位地顺序传送,通信线路非常简单。
UART 为双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART 用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,也用于 PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。
在 UART 上追加同步方式的序列信号变换电路的产品,被称为 USART(Universal Synchronous Asynchronous Receiver Transmitter)
1.3. 通信协议
UART 作为异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其协议中添加了一些特殊的表示位:
-
-
起始位 Start bit
先发出一个逻辑“0”的信号,表示传输字符的开始
-
-
-
数据位 Data bits
紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用 ASCII 码。从最低位开始传送,靠时钟定位。
-
-
-
奇偶校验位 Parity
数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
-
-
-
停止位 Stop bits
它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。停止位的位数越多,时钟同步的容忍程度越大,但是数据传输率会越慢
-
-
-
流控 Flow contorl
管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失,我们会在一些上位机上看到 RTS /CTS、DTR /DSR和 XON /XOFF的选项,这是对流控制的选项
-
-
-
空闲位
处于逻辑“1”状态,表示当前线路上没有数据传送,该位为协议位,自动产生
-
-
-
波特率 BaudRate
是衡量数据传送速率的指标。表示每秒钟传送的bit数。比如波特率 115200,表示传输速率是 115200 bps
-
1.4. 参数信息
在 UART 进行通信的时候,双方需要协商相关参数,否则无法进行信息解析,因此在通信之初,需要对所使用的工具设置上述的所有参数
1.5. 常用接口
- 串口、COM 口是指的物理接口形式(硬件)。
- TTL、RS-232、RS-485 是指的电平标准(电信号)。
1.5.1. TTL
- TTL标准是低电平(0V)为0,高电平(+5V)为1。
- TTL 接口需要对端接口也为 TTL,但诸如 PC 等设备无 TTL 接口的UART口,一般转 TTL 为 USB 等 PC 更通用的接口。
- TTL 接口为全双工,连接设备的时候一般只接 GND/RX/TX。不会接Vcc或者 +3.3v 的电源线,避免与目标设备上的供电冲突,但 GND 可以保证源设备和目标设备供地,有助于信号稳定。
- 信号线采用交叉的方式,即源端的 RX 连接目标设备的 TX,源端的 TX 连接目标设备的 RX。
1.5.2. RS232
- RS232 标准是正电平(+3V~+15V)为0,负电平(-13V~-15V)为1。
- RS232 接口在总线上只允许连接1个收发器,单站能力。
- RS232 传输线采用屏蔽双绞线,最高传输距离一般为 15M,最大速率为 20Kbps。
- RS232 接口为全双工,连接设备的时候一般只接 GND/RX/TX。
- 信号线也采用交叉的方式,即源端的RX连接目标设备的 TX,源端的 TX 连接目标设备的 RX。
1.5.3. RS422
- RS422 标准采用差分信号负逻辑,逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比 RS232 降低了,就不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与TTL电路连接。
- RS422 接口在总线上是允许连接多达128个收发器,多站能力。
- RS422 的数据最高传输速率为 10Mbps,100米长双绞线的最大速度为 1Mb/s。
- RS422 采用平衡发送和差分接收,因此具有抑制共模干扰的能力。RS422 接口的最大传输距离标准值为4000英尺(约1219米),实际上可达3000米。
- RS422 是全双工,连接设备的时候一般接 RX+/RX-/TX+/TX-/GND。
- 信号线也采用交叉的方式,即源端的 RX-/RX+ 连接目标设备的 TX-/TX+,源端的 TX-/TX+ 连接目标设备的 RX-/RX+。
1.5.4. RS485
- RS485 的电气性能和 RS422 完全一样,主要区别是 RS485 是半双工。连接设备的时候一般接 A-/A+/GND,DB9 接口定义了两组,同时必须使用同一组的+/-。
- 信号线也采用交叉的方式,即源端的 A- 连接目标设备的A-,源端的 A+ 连接目标设备的 A+。
1.6. 插头
1.6.1. 公母之分
- 针形的为公头,孔形的为 母头
- PC 串口一般为公头,设备的一般为母头
1.6.2. DB-9接口
RS232DB9 的信号分分四组:
- DCD/RI:电气 Ready 参数
- DTR/DSR:模块 Ready 参数
- RTS/CTS:流控参数
- RXD/TXD:数据收发
针序 | RS232 | 说明 | RS422 | 说明 | RS485 | 说明 |
---|---|---|---|---|---|---|
1 | DCD | 数据载波检测 | RXD- | 接收 | A- | 组1 |
2 | RXD | 接收数据 | ||||
3 | TXD | 发送数据 | ||||
4 | DTR | 数据终端准备好 | TXD+ | 发送 | A+ | 组2 |
5 | GND | 信号地 | GND | 信号地 | GND | 信号地 |
6 | DSR | 数据准备好 | RXD+ | 接收 | A+ | 组1 |
7 | RTS | 请求发送 | RTS | 请求发送 | RTS | 请求发送 |
8 | CTS | 清除发送 | CTS | 清除发送 | CTS | 清除发送 |
9 | RI | 响铃指示 | TXD- | 发送 | A- | 组2 |
1.7. 流控
这里讲到的 “流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失。
当接收端的数据缓冲区已满,无法处理数据来时,就发出 “不再接收” 的信号,发送端则停止发送,直到发送端收到 “可以继续发送” 的信号再发送数据。
计算机中常用的两种流控制分别是硬件流控制(RTS /CTS、DTR /DSR等)和软件流控制(XON /XOFF)。
1.7.1. 硬件流控
RTS/CTS 属于硬件握手的一种,最初是设计为电传打字机和调制解调器半双工协作通信的,每次它只能一方调制解调器发送数据。终端必须发送请求发送信号然后等到调制解调器回应清除发送信号。
A 端的 DTR(数据设备就绪)发出信号, 当 B 端准备好后,B 端的 DTR(数据设备就绪)向 A端的 DSR(通讯设备就绪)发出信号。 接下来就可以通过 RTS(请求发送)和 DTR(允许发送)来控制通信。
1.7.2. 软件流控
软件流控制(Software flow control)是在计算机数据链路中的一种流控制方法,特别适用于 RS232 串口通信;它是采用特殊字符来传输带内信令,特殊编码字符称作 XOFF 与 XON(分别表示 “transmit off” 与 “transmit on”)。因此,也被称作 “XON /XOFF流控制”。
码的名字 | 含义 | ASCII | 十进制 | 十六进制 |
---|---|---|---|---|
XOFF | 暂停传输 | DC3 | 19 | 13 |
XON | 恢复传输 | DC1 | 17 | 11 |
1.8. RAW模式
UART 作为tty设备工作的时候,有两种工作方式:
-
-
Canonical Input
RX端接收到数据之后不会直接反馈给用户态的read函数,而是要一直等到一个回车,意即对一些特殊字符进行语意解析
-
-
-
Raw Input
RX端接收到什么直接返回到用户空间的read函数里面
-
两种工作模式均为kernel层逻辑,和驱动/硬件无关,对于普通的uart应用,建议Canonical方式,对于RS485应用,建议使用Raw方式,二者通过termios的lflag参数的ICANON 位进行区分。
1.9. 模块特性
- 兼容工业标准16550 UART
- 256x8bit发送与接收FIFO
- 传输速度可达3Mbps
- 支持5-8数据位以及1/1 ½/2停止位
- 支持奇校验,偶校验或者无奇偶校验
- 支持DMA控制器接口
- 支持软件/硬件流控
- 支持IrDA 1.0 SIR
- 支持RS-485/9bit 模式
- RS-485支持硬件使能
- Compact-IO 精简2线模式
2. 使用指南
2.1. 内核配置
内核配置主要是通过 make km (make kernel_menuconfig) 命令进行 kernel 的功能选择:
Device Drivers
Character devices
Serial driver
<*> 8250/16550 and compatible serial support
<*> 8250/16550 support for ArtInChip serial ports
[*] Support 8250_core.* kernel options (DEPRECATED)
[*] Support for variants of the 16550A serial port
[ ] Support for Fintek F81216A LPC to 4 UART RS485 API
[*] Console on 8250/16550 and compatible serial port
(8) Maximum number of 8250/16550 serial ports
(8) Number of 8250/16550 serial ports to register at runtime
[ ] Extended 8250/16550 serial driver options
2.2. 系统参数配置
D211 提供最多8个 UART 端口
这些参数主要在文件 target/d211/common/d211.dtsi 中,模块系统参数随 SoC 的设定而定,一般不能进行更改,除非更换了新的 SoC,则需要在专业人士的指导下进行更改。
uart1: serial@18711000 {
compatible = "artinchip,aic-uart-v1.0";
reg = <0x0 0x18711000 0x0 0x400>;
interrupts-extended = <&plic0 77 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
clocks = <&cmu CLK_UART1>;
clock-frequency = <48000000>;
resets = <&rst RESET_UART1>;
dmas = <&dma DMA_UART1>, <&dma DMA_UART1>;
dma-names = "rx", "tx";
};
-
-
reg-shift
UART控制器兼容8250标准, 寄存器寻址使用索引而不是偏移描述,reg-shift 用来进行索引和地址的转换计算,该值不能修改
-
-
-
reg-io-width
为寄存器的位宽,
4
表示采用32位标准位宽,该值不能修改
-
-
-
clock-frequency
D211 UART 模块的父时钟为 48M, UART 模块时钟的频率通过对其父时钟的进行除频来设置,clock-frequency 即用于设置 UART 的模块时钟, 不同的模块时钟时波特率的误差可能不同,因此可以根据目标波特率进行模块时钟的设置,详情参看 UART 波特率与误差率
-
2.3. 功能参数配置
功能参数主要针对某一个使用方案而定,因此随着方案的不同,参数很可能不同,
这些参数主要在文件 target/d211/xxx/board.dts 中,功能参数的设置必须和硬件原理图相匹配
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins_a>;
linux,rs485-enabled-at-boot-time;
aic,rs485-compact-io-mode;
status = "okay";
};
-
-
pinctrl-names
SDK 一般会把要使用的某一功能的端口组预先定义,后期直接使用即可,定义一般放在 target/d211/common/aicxxx-pinctrl.dtsi 文件中,目前 “pinctrl-names” 均设置为 “default” 即可
-
-
-
pinctrl-0
即指示 UART 预先定义的端口组,其中包括用于进行发送/接收选择的 GPIO 端口
-
-
-
linux,rs485-enabled-at-boot-time
该端口配置为 RS485
-
-
-
aic,rs485-compact-io-mode
使用 AIC 独有的精简 IO 模式, 只使用2个端口,一个用作发送接收,一个用作发送和接收控制
-
其中 rs485 功能还有其他一些可选配置项,如 time delay 等,目前 SoC 内部对此类参数做了很好的兼容,除非特殊的 rs485 模组,否则均不需要额外配置参数
2.4. 调试端口
调试端口的配置除了要使能相应的 UART 端口,还要在 target/aicxxx/common/env.txt 文件中配置波特率等相关参数
earlycon=smh
console=ttyS0,115200n8
3. 调试指南
3.1. 调试开关
3.1.1. Log等级
调试的时候需要设置 log 等级为最高8,有两种设置方法:
-
-
bootarg
target/aicxxx/common/env.txt 中设置 loglevel=8
-
-
-
kernel menuconfig
make kernel_menuconfig 或者 make km 命令打开 kernel 的 menuconfig
-
Kernel hacking
printk and dmesg options
(8) Default console loglevel (1-15)
(7) Default message log level (1-7)