实战篇:UART串口连续接收实现 |
您所在的位置:网站首页 › 如何接收串口数据传输 › 实战篇:UART串口连续接收实现 |
这篇博文主要解决在双通道幅频相可调的DDS信号发生器中串口连续接收一帧信息时时间间隔和接收实现问题。 1. 多个字节接收如何实现? 2. 目前常见的是uart传输8bit信息,但是如果要传输一帧,多个字节时,他们之间的间隔将多长? 一、UART接收协议代码编写: 主要包含波特率时钟生成、数据采样接收、标志信号生成; 1. 模块分析 时钟问题:1)为了避免使用组合逻辑产生的时钟触发导致的毛刺问题,所有的模块的时钟均采用系统时钟或者PLL产生的时钟,然后用组合逻辑产生的时钟作为使能; 2) 需要对波特率时钟产生,计数,用于接收每bit信号时判断; 3)为了对输入的每bit信号进行采样,需要在波特率时钟的基础上再计数并生成一个系统时钟高电平的采样时钟,方便再采样时钟到来时,将输入的数据寄存,并将所有采样点数据累加,判断 输入的 究竟是1还是0; 数据采样接收:专门用一个模块data_samp来对每一bit的信号进行6次采样,在每次波特率时钟clk_bps上升沿到来时开始计数,计满5028/6时采样计数+1,并使采样时钟为高电平(其余时间为低电平),以便每次采样时钟到来时对数据进行累加,并在最后一个采样时钟时对数据判断时1还是0; 标志信号生成:在串口信后接收或者每bit数据采样过程中,均需要产生_state的状态信号,以便在接收或者采样过程中对状态的判断或者计数,让不在过程中时,状态保持低电平。同时还能有效降低功耗,及波形分析复杂度。 2. 代码 如下是单bit采样模块及UART接收8比特数据模块。 /***************** file function: uart signal continuous receiver file cretor: MEMEME data:2021-06-09 ******************/ module uart_ctrl( input clk,rst_n, //clk=50M input data_in, output [7:0]uart_data_out, output wire rev_end, output reg rev_state); reg [12:0]bps_cnt; reg clk_bps; reg [4:0]clk_bps_cnt; reg error_state; reg [7:0]uart_data_out_r; wire uart_data_in; wire start_flag; assign uart_data_out=(rev_end)? uart_data_out_r:8'dZ; assign rev_end=(clk_bps_cnt==11)?1'b1:1'b0; /***********bps generate********************/ // different bps' timepiece parameter t_9600_cnt =5028, //9600 bps t_19200_cnt =2604, //19200 bps t_38400_cnt =1302, t_57600_cnt =868, t_115200_cnt=434; always @(posedge clk or negedge rst_n)begin if(~rst_n) bps_cnt |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |