mcu_arm9 发表于 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                datain;                                                        //发送的一字节数据
        output                        clkout;                                                        //输出时钟
        output                  TXD;                                                        //串行数据,发送中断
        output          TI;
   
        reg                        datainbuf;                        //发送数据缓存
        reg                         WR_ctr,TI,TXD_reg;                                        //写标志、中断标志、一位发送寄存器
        reg                        bincnt;                                                        //发送数据计数器
        reg                        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,1'b0};                //读入数据,并把缓存组成一帧数据,10位 datain
                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 = 8'h1b;                //10+1
        txd0_test = 8'h10;                          //f1
        txd0_test = 8'h0b;                        //00+1
        txd0_test = 8'h55;                        //00+1
        txd0_test = 8'haa;                        //00+1
        txd0_test = 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+2'd1;
        end

        else
           cs_txd0 = 1'd0;

end

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

avr-qq 发表于 2011-6-4 16:52:22

多加一个停止位试试看

mcu_arm9 发表于 2011-6-4 17:00:47

回复【1楼】avr-qq 高级工程叁
-----------------------------------------------------------------------

加了一样的。

flamingwave 发表于 2011-6-4 23:46:40

always的敏感信号列表没有rst啊。
clk_equ为什么为要用组合逻辑来做呢?这里会产生一些时序上的问题。
clk_equ这样做的话是一个周期性的脉冲了,它不适合做发送时钟,脉宽太小接收端接收会有问题
最好是把那个CLK_OUT弄成百分之五十占空比的发送时钟。
页: [1]
查看完整版本: 串口发送的一个问题,发送的时候重是跳着发。好奇怪的问题,才学还望高手帮一下忙。