leicai05 发表于 2014-12-29 15:14:20

cpld,串口调试分享和疑问

本帖最后由 leicai05 于 2014-12-29 15:16 编辑

用epm240调试串口记录

用黑金开发板的串口调试程序,调试串口收发程序,过程就是用PC发送数据到cpld,然后cpld接收后保存到fifo,然后在回送给pc(通讯方式是9600波特率,1个起始位,8个数据位,一个校验位和一个停止位)。

黑金板的程序中fifo的深度设置的是16个字节,emp240没那么多资源,只使用了8个字节深度。我想,因为是边收边发,所有只要有一两个fifo也就足够正常收发了。因为收发的速度是一样的嘛。

但是在调节的过程中发现,pc调试助手发送少量的数据时(200个左右),没错误,但是发送超过400多个就会在后面部分出现乱码。但是如果把停止位改成两位,就收发正常了。我特意用示波器检查了我发送的波形,和pc下发来的波形,也是正确的。

后来分析cpld的发送时序
case(i)
       
        4'd0://起始位
        if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b0; end
       
        4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8://数据位
        if(BPS_CLK)begin i<=i+1'b1; rTX <= TX_Data; end

        4'd9://校验
        if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b1; end
       
        4'd10://停止位
        if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b1; end
       
        4'd11:
        if(BPS_CLK)        begin i<=i+1'b1; isDone <= 1'b1; end                               
       
        4'd12:
        begin i<=4'd0; isDone <= 1'b0; end
       
endcase

我想在case11的时候不需要等待if(BPS_CLK)了,所有把这里改成了
4'd11:
        begin i<=i+1'b1; isDone <= 1'b1; end

修改完后确实好了(可以发送大量数据了)。我的结论是这里的时序写的不严谨,导致发送时间长了导致的,但是黑金开发板的程序不应该犯这样的错误吧,又分析了下时序,确实时序是没问题的,收发都是9600的时钟产生的,那是什么问题了?

幸好调试的时候我有一个led灯,当fifo数据保存满的时候就把led点亮。再测试回到之前有问题的程序,果然发送较多的数据的时候,发现led亮了。原来是数据保存满了,rxpin的数据丢失了。所有才发送有故障的。

可是为什么会数据满了,难道是fifo的保存速度要快于读取速度?我现在只有这个结论了,不知道各位大神是否认可?

菜鸟分析,不对的地方希望指出。

附带工程文件

zxq6 发表于 2014-12-29 15:37:56

赶脚没那么头大,应该是程序部严谨导致的结果。

xh2008email 发表于 2015-1-2 09:04:31

在在为这些事儿发愁呢,及时雨呀,非常感谢!

advantech 发表于 2015-1-14 01:27:42

正学习呢,感谢。

again 发表于 2015-1-14 07:05:53

11应该在时钟下降沿

thyewfty 发表于 2015-9-19 23:42:32

{:smile:} 正学习,看看
页: [1]
查看完整版本: cpld,串口调试分享和疑问