搜索
bottom↓
回复: 3

串口发送的一个问题,发送的时候重是跳着发。好奇怪的问题,才学还望高手帮一下忙。

[复制链接]

出0入0汤圆

发表于 2011-6-4 16:33:27 | 显示全部楼层 |阅读模式
这是串口发送程序
module send(
                        clk,                                                                        //时钟
                        clkout,                                                                        //输出
                        datain,                                                                        //需要发送的一个字节数据
                        TXD,                                                                        //uart发送引脚       
                        TI,                                                                                //发送中断
                        cs_txd,                                                                                //写控制信号
            rst                                                                                //复位                               
                               
                        );
        input           rst;
        input                        clk;                                                        //输入时钟
        input                        cs_txd;                                                                //写信号
        input        [7:0]        datain;                                                        //发送的一字节数据
        output                        clkout;                                                        //输出时钟
        output                    TXD;                                                        //串行数据,发送中断
        output          TI;
   
        reg                [9:0]        datainbuf;                        //发送数据缓存
        reg                         WR_ctr,TI,TXD_reg;                                        //写标志、中断标志、一位发送寄存器
        reg                [3:0]        bincnt;                                                        //发送数据计数器
        reg                [15:0]        cnt;                                                        //计数器

        wire                        clk_equ;                                                //分频时钟

        parameter       cout = 5208;                                    //根据具体的时钟来设定分频系数
                                                                                                    //这里是50M时钟,波特率选择是9600,所以分频系数为50000000/9600= 5208.3;                                               
/********************************************************************************
** 模块名称:
** 功能描述:波特率发生进程
********************************************************************************/
always@(posedge clk)                                                                               
begin
    if(!rst)
        cnt <= 16'd0;
    else
            if(clk_equ)        
                    cnt <= 16'd0;
            else
                    cnt<=cnt+1'b1;
end

assign clk_equ = (cnt == cout);
assign clkout = clk_equ;
/********************************************************************************
** 模块名称:
** 功能描述:读数据到缓存进程
********************************************************************************/

always@(posedge clk)
begin
    if(!rst)
     begin
        datainbuf <= 10'd0;
        WR_ctr <= 1'b0;
     end
    else   
        if(cs_txd)       
        begin
                datainbuf <= {1'b1,datain[7:0],1'b0};                //读入数据,并把缓存组成一帧数据,10位 datain[7:0]
                WR_ctr <= 1'b1;                                                                //置开始标志位
        end
        else if(TI==0)
                WR_ctr <= 1'b0;
end
       

/********************************************************************************
** 模块名称:
** 功能描述:主程序进程
********************************************************************************/

always@(posedge clk)
begin
    if(!rst)
    begin
        TXD_reg <= 1'b1;
        TI <= 1'b1;
        bincnt <= 4'd0;
    end
    else if(clk_equ)                                      //发送条件判断,保证发送数据的完整性
            begin
                    if((WR_ctr==1||TI==0))       
                            if(bincnt<4'd10)
                               begin
                                    TXD_reg <= (datainbuf>>bincnt);        //移位输出
                                    bincnt <= bincnt + 4'd1;        //发送数据位计数
                                    TI <= 1'b0;
                            end
                            else
                    begin
                                        bincnt <= 4'd0;
                        TI <= 1'b1;
                        TXD_reg <= 1'b1;
                    end

    end               
end
       
assign TXD = TXD_reg;                                                                //TXD连续输出

endmodule


下面是一个发送码
always@(posedge clk_equ)
        begin
        txd0_test[0] = 8'h1b;                //10+1
        txd0_test[1] = 8'h10;                          //f1
        txd0_test[2] = 8'h0b;                        //00+1
        txd0_test[3] = 8'h55;                        //00+1
        txd0_test[4] = 8'haa;                        //00+1
        txd0_test[5] = 8'hbb;                        //00+1
          
           if((txd0_two_number < 3'd6)&&TI)             //意思是连_发6次,有可能是这一句的问题,听说要在发送完一个数据后加点延时,问题是我不知道怎么加
           begin
           cs_txd0 = 1'd1;
           txddata0 = txd0_test[txd0_two_number];
           txd0_two_number = txd0_two_number+2'd1;
        end

        else
           cs_txd0 = 1'd0;

end

现在问题就是:我用电脑接收的,接收到的数据是:(数组的1.3.5)10 55 BB  还有三位不见了(就是数组的0.2.4位即:1B 0B AA)。还希望高手帮一下忙,搞了好久都没有搞定。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-6-4 16:52:22 | 显示全部楼层
多加一个停止位试试看

出0入0汤圆

 楼主| 发表于 2011-6-4 17:00:47 | 显示全部楼层
回复【1楼】avr-qq 高级工程叁
-----------------------------------------------------------------------

加了一样的。

出0入0汤圆

发表于 2011-6-4 23:46:40 | 显示全部楼层
always的敏感信号列表没有rst啊。
clk_equ为什么为要用组合逻辑来做呢?这里会产生一些时序上的问题。
clk_equ这样做的话是一个周期性的脉冲了,它不适合做发送时钟,脉宽太小接收端接收会有问题
最好是把那个CLK_OUT弄成百分之五十占空比的发送时钟。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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