RS232原理
注意:以下仅为学习笔记,借鉴网络各个知识点汇聚而成,如有错误请留言。
原理:RS232协议是UART的一种,只有两根数据线,分别是rx和tx,分别用来接收数据和发送数据,数据收发基于帧结构,每次按照8bit的大小来接收和发送数据。数据线空闲状态下为高电平,开始发送数据后将电平拉低一帧作为起始位,随后8帧的数据为数据内容,发送完毕后将数据线电平拉高一帧作为停止位,然后一直拉高回到空闲状态。
RS232缺点:1.传输数据的距离进; 2.传输数据慢。
优点:1.很多传感器CPU都带有串口功能,方便调试;
2.只有两条数据线,减少IO口。
串口RS232协议:位宽都是1bit。通过串口调试助手发送一个8bit的数据(一位一位的发送和接收);RS232串口在发送数据时将并行数据转换成串行数据来传输;在接收数据时将接收到的串行数据转换成并行数据。
串口发送接收1bit数据时间称一个波特,如:波特率9600,波特是1/9600s,系统时钟50Mhz,时钟周期是20ns,在9600波特率下,一个波特等于5208个系统时钟周期((1s * 10^9ns)ns/9600)/20ns,也就是说每个bit数据在50Mhz时钟下保持5208个时钟周期,起始位和停止位都是一个波特时间,本次实例采用9600波特率。
串口数据RX发送模块
该模块的功能是将并行数据转化为串行数据。
RX接收模块框图:
理想波形设计:
RX接收模块编程代码:
module uart_rx
#(
parameter UART_BPS = 'd9600, //波特率9600
CLK_FREQ = 'd50_000_000 //时钟频率50MHZ
)
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire rx ,
output reg [7:0] po_data ,
output reg po_flag
);
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS ; //接受1bit数据所需多少个脉冲周期
reg rx_reg1 ; //打一拍,同步时钟
reg rx_reg2 ; //打两拍,减小亚状态
reg rx_reg3 ; //打三拍,在次减小亚状态
reg start_flag ; //开始标志信号
reg work_en ; //计数使能信号
reg [15:0] baud_cnt ; //波特率计数器
reg bit_flag ; //bit计数信号
reg [3:0] bit_cnt ; //bit计数
reg [7:0] rx_data ; //传输移位bit
reg rx_flag ; //传输1帧完成信号
//rx_reg: 进行打拍操作,消除亚稳态
always @(posedge sys_clk or negedge sys_rst_n)
if( !sys_rst_n )
begin
rx_reg1 <= 1'b1;
rx_reg2 <= 1'b1;
rx_reg3 <= 1'b1;
end
else
begin
rx_reg1 <= rx ;
rx_reg2 <= rx_reg1 ;
rx_reg3 <= rx_reg2 ;