admin 发表于 2022-1-7 11:34:36

【实验说明】ACX720串口接收控制LED灯以及传图实验bug解析

本帖针对大家在学习我们的串口接收相关实验中遇到的问题,作一个分析贴,一步一步分析实验存在的问题和原因,并最终给出解决方案。


### 引入

部分学员在学习我们的ACX720 Xilinx教学视频课程的时候提到,按照我们的课程编写的串口接收程序,无法用来实现串口控制LED灯的实验。而且不仅是串口控制LED灯实验,串口传图实验也有问题,传输的图像会花。而且,即使是使用我们提供的课程随堂工程,也会存在这个问题,他们找不到原因,所以来咨询我们。



## 问题溯源

看到这个现象,我们首先怀疑的就是我们的程序问题,但是经过一番仔细排查,发现程序接收非常合理,各项时间参数都挺合理的。那么问题出在哪里呢?考虑到使用的USB转串口芯片为CH340E,这是一个没有使用外部晶振的小型串口芯片,我自然想到,会不会是因为该芯片没有使用外部高精度晶振,而是使用类似的误差较大的RC振荡器的方式(网上有人指正说,CH340E使用的是从USB总线恢复得到的时钟信号,理论上精度还是很高的,我没有去求证)产生内部工作时钟,从而导致的较大的误差呢。

不管是不是这个原因,既然有了这个方向,就先想办法验证下吧。

我在程序中加入了ILA,对uart_rx信号和Rx_done信号抓取波形分析。得到如下几张图:

下图为程序接收一个数据完成时的细节图,可以看到,当我们的程序接收一个数据完毕,产生Rx_done信号时,uart_rx信号已经变成了低电平,而这个低电平正是新一个数据的起始位。也就是说,当我们的程序还没完成前一个数据的接收时,新一个数据已经在传输了,起始位下降沿已经过去了。所以这个下降沿会被我们的程序忽略,导致错误的判断数据起始位,从而导致数据接收出错。

![错过时间.png](data/attachment/forum/202201/07/105837z55yexc5jz9ujxxx.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300上面"错过时间.png")

那么,这个问题纠结是怎么出现的呢,是哪里出了问题,才会导致这样的结果呢?是我们接收一个数据的时间超过了串口传输的时间,还是CH340芯片传输一个数据的时间小于标准的串口传输时间呢?以下又进行了进一步的分析。


![接收失败.png](data/attachment/forum/202201/07/105339h77l952c97b6k5a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300那么"接收失败.png")


上面这张图,展示了ILA抓取的uart_rx接收数据时两个起始位下降沿之间的时间差,为(8173-3856 + 1)*20 = 86340ns=86.34us。而标准串口,传输起始位+8位数据+停止位所耗费时间应该为10*x(1/115200)=86.805us。也就是说。CH340传输一个字节所耗费时间低于标准串口的时间。



下图为使用示波器抓取的信号传输波形图,通过光标测量也可以发现,两个起始位下降沿之间的时间差为86.4us左右,低于标准时间。

![示波器测量结果.png](data/attachment/forum/202201/07/112114e9mn8imndk9njf8y.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "示波器测量结果.png")



我们的程序是怎样的呢?下图为对我们的程序耗时进行测量的结果,图中用方框标记的下降沿位置为程序识别到的起始位起点,黄色光标位置为以该下降沿为起始,接收一个串口数据结束时的时间点(Rx_done产生高脉冲),两个时间点间的时间间隔为86.74us左右,依旧小于标准时间的86.805us。也就是说,接收错误的原因并不是因为我们的接收程序耗时超过了串口传输标准时间导致的。

![实际接收时间.png](data/attachment/forum/202201/07/110709p45exf56j0ybu5zm.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "实际接收时间.png")



### 问题解决方案

找到问题不是终点。终点是解决问题,既然知道了问题根源,解决问题的思路就很简单了,我们只要确保我们程序接收一个数据耗时小于CH340芯片传输一个数据的耗时就可以了。解决方案很简单,将我们uart_byte_rx.v程序中74行和162行的两个160改为159,就可以解决问题。如下图所示:

![修改1.png](data/attachment/forum/202201/07/113107bmvfvhl9kebr8bz5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "修改1.png")



![修改2.png](data/attachment/forum/202201/07/113114ajld76yj9d67az4u.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "修改2.png")



### 修改说明

我们提供的例程里,所有用到该串口接收模块的程序,例如串口控制LED灯,串口传图到RAM显示等案例,都需要对用到的这个uart_byte_rx.v文件的相应内容做相应修改。

二楼上传了几个我们修改好的随堂工程文件。请大家到二楼下载更新。

admin 发表于 2022-1-7 11:46:31

改好的V文件:
12课的基本接收工程源码:
14课的串口接收控制LED灯源码:
25课的串口传图源码:


以下附件为使用该串口接收模块,在不修复bug的情况下,实现的串口传图到ram缓存显示的工程,


大家可以下载该工程后烧写到开发板做测试,会发现传图时图像会花屏。如下图所示。


以下提供传图时需要使用的图片的数据文件,

使用时只需要使用记事本打开,全选内容并复制,然后粘贴到串口助手的发送框中,即可发送。如下图所示


以下为该数据对应的图片

页: [1]
查看完整版本: 【实验说明】ACX720串口接收控制LED灯以及传图实验bug解析