OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5101|回复: 4

串口发送模块

[复制链接]

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-10-18
在线时间
15 小时
发表于 2019-5-5 19:45:36 | 显示全部楼层 |阅读模式
最近想把数据通过串口发送到上位机,正点原子里有串口程序,里面是回环测试的,我想实现串口发送数据,然后对它发送模块进行修改,如下,上位机不能接收数据uart_bin=8'd11,是怎么回事呢?程序哪部分需要修改呢?谢谢指教
module uart(
    input              sys_clk,                  //系统时钟
    input         sys_rst_n,                //系统复位,低电平有效

    output  reg   uart_txd                  //UART发送端口
    );

//parameter define
parameter  CLK_FREQ = 50000000;             //系统时钟频率
parameter  UART_BPS = 9600;                 //串口波特率
localparam BPS_CNT  = CLK_FREQ/UART_BPS;    //为得到指定波特率,对系统时钟计数BPS_CNT次

//reg define
reg  [15:0]  clk_cnt;                         //系统时钟计数器
reg  [ 3:0]  tx_cnt;                          //发送数据计数器
reg          tx_flag;                         //发送过程标志信号
reg  [ 7:0]  tx_data;                         //寄存发送数据
reg  [ 7:0]  uart_din;
//wire define
reg       en_flag;

//*****************************************************
//**                    main code
//*****************************************************
//当脉冲信号en_flag到达时,寄存待发送的数据,并进入发送过程         
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n) begin                                 
        tx_flag <= 1'b0;
        tx_data <= 8'd0;
                  en_flag<=1'b1;
                   uart_din<=8'd11;
    end
    else if (en_flag) begin                 //检测到发送使能上升沿                     
            tx_flag <= 1'b1;                //进入发送过程,标志位tx_flag拉高
            tx_data <= uart_din;            //寄存待发送的数据
        end
        else
        if ((tx_cnt == 4'd9)&&(clk_cnt == BPS_CNT/2))
        begin                               //计数到停止位中间时,停止发送过程
            tx_flag <= 1'b0;                //发送过程结束,标志位tx_flag拉低
            tx_data <= 8'd0;
        end
        else begin
            tx_flag <= tx_flag;
            tx_data <= tx_data;
        end
end

//进入发送过程后,启动系统时钟计数器与发送数据计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n) begin                             
        clk_cnt <= 16'd0;                                 
        tx_cnt  <= 4'd0;
    end                                                      
    else if (tx_flag) begin                 //处于发送过程
        if (clk_cnt < BPS_CNT - 1) begin
            clk_cnt <= clk_cnt + 1'b1;
            tx_cnt  <= tx_cnt;
        end
        else begin
            clk_cnt <= 16'd0;               //对系统时钟计数达一个波特率周期后清零
            tx_cnt  <= tx_cnt + 1'b1;       //此时发送数据计数器加1
        end
    end
    else begin                              //发送过程结束
        clk_cnt <= 16'd0;
        tx_cnt  <= 4'd0;
    end
end

//根据发送数据计数器来给uart发送端口赋值
always @(posedge sys_clk or negedge sys_rst_n) begin        
    if (!sys_rst_n)  
        uart_txd <= 1'b1;        
    else if (tx_flag)
        case(tx_cnt)
            4'd0: uart_txd <= 1'b0;         //起始位
            4'd1: uart_txd <= tx_data[0];   //数据位最低位
            4'd2: uart_txd <= tx_data[1];
            4'd3: uart_txd <= tx_data[2];
            4'd4: uart_txd <= tx_data[3];
            4'd5: uart_txd <= tx_data[4];
            4'd6: uart_txd <= tx_data[5];
            4'd7: uart_txd <= tx_data[6];
            4'd8: uart_txd <= tx_data[7];   //数据位最高位
            4'd9: uart_txd <= 1'b1;         //停止位
            default: ;
        endcase
    else
        uart_txd <= 1'b1;                   //空闲时发送端口为高电平
end

endmodule                  

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

202

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
839
金钱
839
注册时间
2018-7-29
在线时间
128 小时
发表于 2019-5-6 23:48:42 来自手机 | 显示全部楼层
en_flag信号没有上升沿,是不会执行发送程序的。可以看下视频,把代码理解了,再去作修改
回复 支持 反对

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2019-5-9 11:00:35 | 显示全部楼层
SunML 发表于 2019-5-6 23:48
en_flag信号没有上升沿,是不会执行发送程序的。可以看下视频,把代码理解了,再去作修改

你好,我这边en_flag=1'b1 ,有上升沿
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n) begin                                 
        tx_flag <= 1'b0;
        tx_data <= 8'd0;
               en_flag<=1'b1;
                   uart_din<=8'd11;
    end
    else if (en_flag) begin                 //检测到发送使能上升沿                     
            tx_flag <= 1'b1;                //进入发送过程,标志位tx_flag拉高
回复 支持 反对

使用道具 举报

9

主题

202

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
839
金钱
839
注册时间
2018-7-29
在线时间
128 小时
发表于 2019-5-14 11:16:52 | 显示全部楼层
CASEYNAOMI 发表于 2019-5-9 11:00
你好,我这边en_flag=1'b1 ,有上升沿
always @(posedge sys_clk or negedge sys_rst_n) begin          ...

你这不是上升沿,是在复位的时候给的高电平,但是没有上升沿(由低电平到高电平的跳变)
回复 支持 反对

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2019-5-15 15:09:15 | 显示全部楼层
SunML 发表于 2019-5-14 11:16
你这不是上升沿,是在复位的时候给的高电平,但是没有上升沿(由低电平到高电平的跳变)

好的,真是感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表