UART协议

一、UART简介

UART 通常是指通用异步串行收发传输器( Universal Asynchronous Receiver/Transmitter)。UART 是一种通用的数据通信总线,也是串行总线接口的总称。我们通常所说的 UART 只有两根信号线,一根是发送数据端口线(TX),一根是接收数据端口线(RX)。

发送数据:发送设备将数据转换成串行数据来传输(并转串)。

接收数据:接收设备将接收到的串行数据转换成并行数据(串转并)。

1)协议层:通信协议(包括数据格式,传输速率等);

2)物理层:接口类型,电平标准等。

二、UART原理

2.1协议层

2.1.1 数据格式

一帧数据由4 部分组成,

• 起始位(1bit)

• 数据位(6\7\8 bit)

• 奇偶校验位(1bit)

• 停止位(1bit\1.5bit\2bit)

数据帧格式

空闲位:

UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。

起始位:

每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。

数据位:

起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。

奇偶校验位:

数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。 校验位其实是调整个数,以下是奇偶校验两种方式:

  • 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
  • 偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。

在代码设计中我们采用一位异或,将每两位相邻数据位异或后得到一位数据,再根据设置的奇校验偶校验来判断校验位的值。

停止位:

它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

2.1.2 传输速度

波特率:单位时间内传输的码元数量(码元:携带数据的信息单元)

2.1.2.1 什么是波特率

波特率等于每秒钟传输的数据位数,假如我们的全局时钟频率为100MHz,波特率设置为9600,那么意味着每秒该UART传输协议可以传输9600bits的数据,换句话说传输1比特需时间约为:10^9(ns)/9600=104166(ns)。

2.1.2.2 如何换算波特率

如上,时钟频率假如为100MHz,这意味着我们的时钟周期为10ns,因此10416个时钟周期我们就可以传输1bit数据,换言之我们需要一个大小为10416的分频电路来对100MHz时钟进行处理,因此在设计UART的过程中,我们需要使用分频电路依据波特率处理全局时钟,依据分频后的时钟节奏来发送数据和接收数据。

2.2 物理层

接口类型、电平标准

串口电平标准:

TTL电平的串口(3.3v)

RS232电平的串口(+3~+15v为低电平,-5~-15v为高电平)

串口按电气标准分包括:

• RS-232-C:TXD/RXD/GND、15 m/9600bps (全双工)

• RS-422:TX+/TX-/RX+/RX-/GND (全双工,差分信号)

• RS485:A/B/G 、1200 米/9600bps (半双工,差模信号)

三、工程实践

3.1系统框图

3.2时序图

3.2.1 发送时序

3.2.2 接收时序

3.3 代码设计

3.3.1 UART_RX
module uart_rx #(
    parameter   CLK_FREQ = 50_000_000,
                BPS      = 115200    ,
                CHECK    = "NONE"       //"Odd"为奇数校验,"Even"为偶数
### UART协议的介绍与使用方法 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种广泛应用于嵌入式系统和微控制器领域的串行通信协议。它通过TX(传输)和RX(接收)两根线实现全双工通信,支持点对点数据传输[^3]。 #### 协议UART协议属于异步通信协议,这意味着在数据传输过程中不需要同步时钟信号。发送端和接收端通过预先设定的波特率来同步数据传输速率。UART协议的数据帧通常由以下部分组成: - 起始位:用于标识数据帧的开始。 - 数据位:可配置为5到9位,表示实际传输的数据。 - 奇偶校验位(可选):用于检测传输错误。 - 停止位:用于标识数据帧的结束[^2]。 #### 物理层 UART协议本身并不定义具体的电平标准,而是依赖于不同的电平标准实现实际通信。以下是几种常见的UART电平标准及其应用场景: - **TTL UART**:直接使用MCU的UART引脚进行通信,适合短距离的模块对接。 - **RS-232 UART**:通过电平转换芯片(如MAX232),实现UART信号到RS-232信号的转换,用于计算机与设备的通信。 - **RS-485 UART**:通过电平转换芯片(如MAX485),将UART信号转换为RS-485差分信号,用于远距离多设备通信[^4]。 #### 技术特点 UART协议具有以下主要特点: - 简单易用:硬件结构简单,仅需两根线即可实现全双工通信。 - 异步通信:无需同步时钟信号,降低了系统复杂度。 - 配置灵活:支持多种数据位、停止位和奇偶校验位的组合,适应不同应用场景[^1]。 #### 示例代码 以下是一个简单的UART通信代码示例,展示如何在嵌入式系统中初始化和使用UART协议: ```c #include <stdio.h> #include <stdint.h> // 初始化UART void uart_init(uint32_t baud_rate) { // 设置波特率 // 配置数据位、停止位和校验位 // 启用发送和接收功能 } // 发送一个字符 void uart_send_char(char data) { while (!(/* 检查UART发送寄存器是否为空 */)); /* 将数据写入UART发送寄存器 */; } // 接收一个字符 char uart_receive_char() { while (!(/* 检查UART接收寄存器是否有数据 */)); return /* 从UART接收寄存器读取数据 */; } int main() { uint32_t baud_rate = 9600; // 设置波特率为9600 uart_init(baud_rate); char send_data = 'A'; uart_send_char(send_data); char receive_data = uart_receive_char(); printf("Received: %c\n", receive_data); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值