三大低速总线之一:UART
前言
三大低速总线:UART、IIC、SPI,其中IIC和SPI是同步通讯,UART是异步的。
优点:
简单:tx和rx都是一根线,使用简单的帧结构传输。 UART通信协议相对简单,易于实现和调试。
适用性广泛:UART被广泛应用于各种设备之间的通信,具有较好的兼容性。
距离:UART通信距离较远,适用于需要长距离传输的场景。
缺点:
速度较低:UART通信速度相对较低,不适用于对速度要求较高的应用。
双工:UART通信是双工的,可以进行低速双工传输数据,进行数据的发送和接收。
不可靠:由于UART是异步通信,可能会受到噪声和干扰的影响,导致数据传输不可靠。
为我们的项目选择合适的协议:
通信速度:SPI 提供高速度,UART 提供高灵活性,I2C 适用于速度要求较低,接线简单的配置。
电路设计:I2C 可实现多个设备的高效空间管理,SPI 可实现大型设计中的性能,而 UART 可实现简单性和多功能性。
距离和通信环境:UART 在长距离上具有稳定性,而 I2C 更适合短距离。
双工要求:SPI 和 UART 提供全双工功能,而 I2C 仅限于半双工。
小结:
- 使用帧传输,没有时钟的适合长距离,比如UART(如果是差分就更好了),但是帧传输会有冗余信息,传输相对较慢(但这个只针对一般接口,对于高速IO接口的工作频率会很高就不存在这个问题)
- 带有随路时钟的,因为可能存在各种干扰,对时钟不友好,不适合长距离。
- 使用哪种协议也要看使用的io资源,spi协议使用的端口就比较多,但是速度快
应用案例:
应用案例:
uart:
微控制器和外设之间的连接:用于简单直接的数据交换。
GPS 模块和与计算机的串行接口:用于可靠、低复杂性的通信。
工业机器:UART 通常用于工业设备中以实现稳定的通信。
使用 RS 标准(例如 RS-232、RS-485):这些标准支持更长距离的 UART 通信,并提供使用适当的收发器创建多从属网络的可能性,从而增加 UART 应用的灵活性和广度。
微控制器和外设之间的连接:用于简单直接的数据交换。
GPS 模块和与计算机的串行接口:用于可靠、低复杂性的通信。
工业机器:UART 通常用于工业设备中以实现稳定的通信。
使用 RS 标准(例如 RS-232、RS-485):这些标准支持更长距离的 UART 通信,并提供使用适当的收发器创建多从属网络的可能性,从而增加 UART 应用的灵活性和广度。
spi:
SPI 非常适合需要快速可靠的数据传输的情况,例如 TFT 显示器、SD 存储卡和无线通信模块。然而,在具有许多从站的复杂系统中,其有效性会降低。
IIC:
就其应用而言,连接方面,I2C在需要简单且经济的通信环境中表现出色。它尤其擅长在小型传感器、LCD 屏幕和 RTC(实时时钟)模块中使用。此外,I2C 由于其在紧凑电路中的效率,在温度控制设备、电池管理系统和 LED 控制器中很有用。但是,在需要快速或长距离数据传输的项目中,最好选择其他协议
一、UART协议
特点:
- 低速协议
- rx 和 tx两根线
帧结构
二、设计
1.整体说明
整体框图
模块说明
2.rx波形设计
TX波形设计
三 程序实现
RX设计思想:根据上面时序图的端口顺序
- 同步
- 帧起始位判断(边沿检测,并用中间控制信号en代替flag,只检测一次)
- 帧比特率计数(其他的都是依靠这个衍生的)
- bit标志位
- bit_cnt
- 每bit的数据接受输出
- 稳定数据输出(不输出正在接受变化的数据,而是接受完毕后,在用数据接受完毕的flag来输出最后的数据)
- 稳定数据flag输出(需要延迟一拍rx_flag)
需要注意的点有下面几个:
同步的时候需要两拍,但是用这两拍判断帧的沿是不稳定的,需要用第二排和第三拍的输出
数据采样的时候依靠flag,但是flag为高的时候,采的数据是flag变化之前的(是起始位),即实际上是从1bit开始采样,采样到8的时候,有效数据采集完毕,起始和结束是没有采样的
变化的数据不能传递给下一个模块,要稳定的时候去传递,因此rx_data,只是中间数据,po_data才是最后的数据,同时po_plag也要同步域po_data(相对于rx_flag沿延迟一拍)
`timescale 1ns/1ns
module uart_rx
#(
parameter UART_BPS = 'd9600, //串口波特率
parameter CLK_FREQ = 'd50_000_000 //时钟频率
)
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位
input wire rx , //串口接收数据
output reg [7:0] po_data , //串转并后的8bit数据
output reg po_flag //串转并后的数据有效标志信号
);
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//localparam define
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS ;
//reg define
reg rx_reg1 ;
reg rx_reg2 ;
reg rx_reg3 ;
reg start_nedge ;
reg work_en ;
reg [12:0] baud_cnt ;
reg bit_flag ;
reg [3:0] bit_cnt ;
reg [7:0] rx_data ;
reg rx_flag ;
//********************************************************************