串口发送模块uart_tx详解
1. 原理介绍
本文是学习小梅哥串口模块教程后的整理总结。
用于数据接收与发送的常用通信协议: UART(通用异步收发传输器)、I2C(集成电路总线)、USB2.0/3.0(通用串行总线)、SPI(串行外围总线)、Ethernet(以太网) 等。
串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。
异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
这里讲解基于RS232接口标准规范的uart_tx异串口发送模块。
发送并行数据,转为串行数据送入上位机orPC等。
UART 是异步串行通信的总称。而** RS232、 RS449、 RS423、 RS422
和 RS485 等,是对应各种异步串行通信口的接口标准和总线标准,它们具体规定了通
信口的电气特性、传输速率、连接特性和接口的机械特性**等内容。
RS232的 DB9 接口的针脚定义
具体每个针脚的功能不再赘述,这里重点研究uart的传输时序图
2. UART串口发送数据的传输时序
需要设置数据位数、波特率、奇偶校验类型和停止位数
数据位( Data bits)
该参数定义单个 UART 数据传输在开始到停止期间发送的数据位数。 可选择为: 5、 6、 7 或者 8(默认)。
波特率( Baud)
是指从一设备发到另一设备的波特率,即每秒钟可以通信数据**比特(bit)**个数。 典型的波特率有 300, 1200, 2400, 9600, 19200, 115200 等,单位bit/s,也即是bps。一般通信两端设备都要设为相同的波特率,有些设备也可设置为自动检测波特率。
奇偶校验类型( Parity Type)
是用来验证数据的正确性。如果用户选择数据长度为 8 位,是因为没有多余的比特可被用来作为奇偶校验位,因此就叫做“无奇偶校验( Non)”。此处不再赘述。
停止位( Stop bits):
在每个字节的数据位发送完成之后,发送停止位,来标志着一次数据传输完成,同时用来帮助接受信号方硬件重同步。 可选择为: 1( 默认)、 1.5 或者 2 位。
在 RS-232 标准中, 最常用的配置是 8N1(即8数据位+无奇偶校验+1停止位), 其发送一个字节时序图如图
一个完整的字节包括1位起始位、8 位数据位、1位停止即总共10位数据来算,要想完整的实现这10位数据的发送,就需要11个波特率时钟脉冲, 第1个脉冲标记一次传输的起始, 第 11 个脉冲标记一次传输的结束。
BPS_CLK 信号的第一个上升沿到来时,字节发送模块开始发送起始位,接下来的 2 到 9 个上升沿, 发送 8 个数据位,第 10 个上升沿到第 11 个上升沿为停止位的发送。
也可以采用在每个起始位之前添加一位传 “1’b1” 的位,用来为START_BIT的最初变化显示为下降。,以便串口接收模块识别下降沿,开始接收数据。这样也就不用在最后再添加第11个脉冲来标记传输结束了。
3.模块设计
(1)波特率时钟模块
波特率计数值bps_DR计算原理:
以9600bps为例:bps_DR=[(10^9 ns)/(9600bps*20ns)]-1=5207(9600bps的分频计数最大值)
波特率时钟及计数模块代码
//baud_set
reg [15:0] bps_DR;//分频计数最大值
reg bps_clk; //波特率时钟
reg [15:0]div_cnt;//分频计数器
reg [15:0]bps_DR;//分频计数最大值
reg [3:0]bps_cnt;//波特率时钟计数器
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)bps_DR <= 16'd5207;
elsebegincase(baud_set)//之后要为baudset 设置LUT查找表0:bps_DR <= 16'd5207; //9600bps1:bps_DR <= 16'd2603; //19200bps2:bps_DR <= 16'd1301; //38400bps3:bps_DR <= 16'd867; //57600bps4:bps_DR <= 16'd433; //115200bpsdefault:bps_DR <= 16'd5207;//默认为9600bpsendcaseend//counter
always@(posedge Clk or negedge Rst_n)if(!Rst_n)div_cnt <= 16'd0;else if(uart_state)beginif(div_cnt == bps_DR)div_cnt <= 16'd0;elsediv_cnt <= div_cnt + 1'b1;endelsediv_cnt <= 16'd0;// bps_clk gen
always@(posedge Clk or negedge Rst_n)if(!Rst_n)bps_clk <= 1'b0;else if(div_cnt == 16'd1)bps_clk <= 1'b1;elsebps_clk <= 1'b0;
然后对baudset设置一个查找表LUT
(2)数据位数计数器模块
```
//bps counter,对每个字节数据传输位数进行计数,1~11位
always@(posedge Clk or negedge Rst_n)if(!Rst_n) bps_cnt <= 4'd0;else if(bps_cnt == 4'd11)bps_cnt <= 4'd0;else if(bps_clk)bps_cnt <= bps_cnt + 1'b1;elsebps_cnt <= bps_cnt;
(3) 传输一个字节结束标志Tx_Done 模块
output reg Tx_Done;
always@(posedge Clk or negedge Rst_n)if(!Rst_n)Tx_Done <= 1'b0;else if(bps_cnt == 4'd11)Tx_Done <= 1'b1;elseTx_Done <= 1'b0;
(4) 数据发送模块
由低位到高位依次发送,由10-1MUX构成;
根据 bps_cnt 的值来确定数据传输的状态。 不同的波特率时钟计数值时,有不同的传输数据对应。
1’b1;
START_BIT;(1’b0)
r_data_byte[0];
r_data_byte[1];
r_data_byte[2];
r_data_byte[3];
r_data_byte[4];
r_data_byte[5];
r_data_byte[6];
r_data_byte[7];
STOP_BIT;(1’b1)
localparam START_BIT = 1'b0;
localparam STOP_BIT = 1'b1;
always@(posedge Clk or negedge Rst_n)if(!Rst_n)Rs232_Tx <= 1'b1;else begincase(bps_cnt)0:Rs232_Tx <= 1'b1;1:Rs232_Tx <= START_BIT;2:Rs232_Tx <= r_data_byte[0];3:Rs232_Tx <= r_data_byte[1];4:Rs232_Tx <= r_data_byte[2];5:Rs232_Tx <= r_data_byte[3];6:Rs232_Tx <= r_data_byte[4];7:Rs232_Tx <= r_data_byte[5];8:Rs232_Tx <= r_data_byte[6];9:Rs232_Tx <= r_data_byte[7];10:Rs232_Tx <= STOP_BIT;default:Rs232_Tx <= 1'b1;endcaseend
(5)异步数据同步化模块(一级寄存)
由于 RS232 是一个异步的收发器, 因此为了保证发送的数据在时钟到来的时候是稳定的,这里也需要对输入数据进行寄存.可以一级也可以两级,这里一级就足够了
reg [7:0]r_data_byte;
always@(posedge Clk or negedge Rst_n)if(!Rst_n)r_data_byte <= 8'd0;else if(send_en)r_data_byte <= data_byte;elser_data_byte <= r_data_byte;
(6) uart_state状态标志 模块
output reg uart_state;
always@(posedge Clk or negedge Rst_n)if(!Rst_n)uart_state <= 1'b0;else if(send_en)uart_state <= 1'b1;else if(bps_cnt == 4'd11)uart_state <= 1'b0;elseuart_state <= uart_state;
仿真部分
将所有数据变化与系统时钟错开 1ns,是为了能更清楚看到输入输出数据与时钟的时序关系.
根据需要,生成复位信号、使能信号send_en、待传输数据。
initial beginRst_n = 1'b0;data_byte = 8'd0;send_en = 1'd0;baud_set = 3'd4;#(`clk_period*20 + 1 )Rst_n = 1'b1;#(`clk_period*50);data_byte = 8'haa;send_en = 1'd1;#`clk_period;send_en = 1'd0;@(posedge Tx_Done)#(`clk_period*5000);data_byte = 8'h55;send_en = 1'd1;#`clk_period;send_en = 1'd0;@(posedge Tx_Done)#(`clk_period*5000);$stop; end
在这里插入图片描述
串口发送模块uart_tx详解相关推荐
- HS6621 串口透传 模式 - [详解]
文章目录 HS6621串口透传模式详解 遇到的问题现象 UART发送源码 HS6621CG 内核的中断优先级 本人项目中的透传代码 UART0_Recv_IRQ UART1_Recv_IRQ 按照以上 ...
- python标准库对象导入语句_Python标准库之Sys模块使用详解
sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...
- 窗口发送消息参数详解
窗口发送消息参数详解 // 窗口.发送消息 函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg ...
- Windows 窗口发送消息参数详解
窗口发送消息参数详解 // 窗口.发送消息 函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果中文函数原型: 发送消息(hwnd,msg,wparam ...
- KBQA_多轮对话——模型源码解析(一)Pickle模块功能详解
KBQA_多轮对话--模型源码解析(一)Pickle模块功能详解 pickle --- Python 对象序列化的基本功能 1.pickle基本概念 2.pickle 与 json 模块的比较 3.p ...
- Java调用SMSLib用单口短信猫发送短信详解
技术园地 当前位置:短信猫网站主页 > 技术园地 > [转载]Java调用SMSLib用单口短信猫发送短信详解 发布时间:2017/02/09 点击量:620 SMSLib是Apache的 ...
- FPGA学习之串口发送模块设计与验证
FPGA学习之串口发送模块设计与验证 1.实验目的: 实现一个串口输出,通过上位机PC查看接收到的是否是串口发送的数据. 2.实验介绍: 学习UART通信原理及其硬件电路设计,使用FPGA实现UART ...
- 迅为linux下串口,迅为iMX6UL开发板多路串口开发平台接口详解
原标题:迅为iMX6UL开发板多路串口开发平台接口详解 iMX6UL开发板 核心板参数 尺寸:38mm*42mm CPU:iMX6UL 主频528MHz ARM Cortex-A7架构 单核 内存:5 ...
- matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...
最新文章
- ASP 连接Access2013的accdb文件
- javascript高程3 学习笔记(二)
- 2022.4.9 mac os M1 芯片 12.3.1 Monterey 安装cocoapods
- Python学习---面向对象的学习[深入]
- 变量、属性、函数、方法总结
- 解决桌面右键无NVIDIA控制面板选项
- pc端自适应不同屏幕
- 天南星科系统发育及全基因组复制事件的研究取得新进展
- phpunit 基境
- 中职计算机c语言课程,中职计算机C语言教学探讨
- 怎么定义电子商务,电子商务这个词是如何进入大众视线的?
- InvokeRequired and Invoke
- 人工智能教程第二课 目标检测OverView和RCNN
- 在OpenGL中利用shader進行實時瘦臉大眼等臉型微調
- android手机和包支付,和包支付app下载 和包支付(手机支付软件) for Android V9.1.48 安卓手机版 下载-脚本之家...
- 如何确认芯片是被MTK验证过
- Table 9-5 -- coeff_token mapping to TotalCoeff(coeff_token) and TrailingOnes(coeff_token)
- java让电脑死机怎么办,win7系统Java活动脚本出错导致电脑死机的解决方法
- (整理)CAD快捷键
- ucla 计算机科学和数学专业,UCLA的CS「加州大学洛杉矶分校计算机科学系」