串口发送的一个问题,发送的时候重是跳着发。好奇怪的问题,才学还望高手帮一下忙。
这是串口发送程序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)。还希望高手帮一下忙,搞了好久都没有搞定。 多加一个停止位试试看 回复【1楼】avr-qq 高级工程叁
-----------------------------------------------------------------------
加了一样的。 always的敏感信号列表没有rst啊。
clk_equ为什么为要用组合逻辑来做呢?这里会产生一些时序上的问题。
clk_equ这样做的话是一个周期性的脉冲了,它不适合做发送时钟,脉宽太小接收端接收会有问题
最好是把那个CLK_OUT弄成百分之五十占空比的发送时钟。
页:
[1]