实习项目1-串口IP升级调试
设计目标:设计一个串口IP,要求1:输入时钟频率任意,如0-400M时钟频率;要求2:波特率超过常见的115200,要求达到4M.
设计核心思路:波特率计算公式,divp10x = (10 * fsysclk) / (16 * baud),divp10x 是10倍分频系数,当给定一个参考时钟和波特率,那么分频系数就定了,这里16指16倍波特率时钟采样。
为何进行16倍过采样,防止误采样数据,即一般采样时钟频率大于波特率时钟频率的16倍,数据一般不出错。本次为了便于在实际中应用,采用8倍采样,故采样时钟仅为16倍的一半。波特率4M,本次的采样时钟仅需64M,此时分频系数为2.
做设计的思路:一:先搭建仿真环境,即能够测试串口IP,同时仿真包含顶层模块,主机的串口发送(调用串口IP),从机的串口发送和接收,SDRAM存储器给串口IP的相应寄存器地址和读写命令。看出仿真模块是重要的,并且模块众多和功能全面。二:仿真测试串口IP能够实现的功能和各模块的驱动逻辑。即波特率能支持到几兆,并且数据不出错。例如,刚开始测量常见波特率9600,115200等都能达到,后面上网一查才知道波特率和波特率参考时钟有对应关系,必须符合才能正确发送。还发现了高波特率低误差的实现,需要的条件,根据波特率计算公式,串口系数必须大于2等要求。第三步,在仿真测得相应参数,时钟 频率和波特率值后,下载程序到开发板验证,分别是发送端和接受端波特率都能达到4M,或者连接逻辑分析仪,设置触发条件和观察对应的数据波形。
核心代码:
|
module baudset( reg rxclk; |
问题及解决办法:
问题一:仿真测得波特率达到4M的参考时钟且数据正确接收时,下载到开发板出错:
方法是,首先得看看硬件支不支持,原来是开发板的串口模块不支持,RS232只能到115200,然后查阅资料直到USB转串口芯片CH340能够到2M,用网络调试助手测试还是发现出错,但仿真没有问题,原来多种方法测试,由于软件的问题,那就换成官方CH340的软件串口助手,发现波特率能够到达2M。启示:用一个电子器件时或学一样东西,用官方芯片的驱动和软件,才是最正确的。要到4M,又得换一个更强的硬件芯片,即USB2XX,一个串口转芯片,能到4M,并且看了这个芯片的手册和装了它的软件。再烧写程序到开发板验证,果然可以到4M,后面就是发现对应的时钟频率为200M,得用锁相环产生这个频率。
问题二:16倍波特率采样,波特率达到4M对应的时钟频率太高,得降一半才行。
仔细分析了一下,主要是这个波特率计算公式:divp10x = (10 * fsysclk) / (16 * baud);即参考时钟至少是波特率的16倍,那要波特率不变,降低参考时钟频率,只需将16倍改成8倍采样即可。首先就得找出实现16倍样的逻辑。看了模块的代码,波特率产生模块,产生了一个16倍波特率分频时钟Clk16X,传递给其他模块作为时钟信号。主要是在四个模块中用到:sram_slave(其实可忽略,没用到),Rxcver(做了很多模块的驱动时钟,)Txmitt(核心应用模块)baudset(波特率产生模块)。要看懂16倍波特率采样逻辑,那就得看懂baudset和Txmitt的代码。
问题三;怎么看懂源码?
步骤一:先画出这个模块的框图(区别输入输出),看看输出怎么被驱动,能大概找到输入与输出的逻辑。步骤二:关键一步,仿真。通过仿真看看数据流动,输入输出信号的关系。(很重要,自己理解往往不准确,波形很直观准确反映驱动条件和执行逻辑)。步骤三(学习的心态),在看懂别人的思路后,自己动手写,不断调试直到实现功能。
问题四:从机串口接收和发送模块的数据错误为为8'b8.正确该为8'6c
解决过程:
刚开始完全乱猜,就胡乱修改代码,以为是波特率问题或者divclk_en该延迟一个时钟周期,即主观臆断瞎蒙。改来改去发现还是错的。
后面觉得这种做法是错误的,又不是写作文或做梦,全凭自己胡乱想,正确的做法,该是看看世界是怎样的,自己怎么想不重要。即该认真看波形,数据出错,那就看看到底是哪个代码驱动条件导致它错的。即根据现象找到原因,逻辑分析,依据客观世界去活,而不是自己的主观世界。我就一级级找,根据驱动逻辑分析,直到Txmitt模块,TxCNT_R模块和uart_rxs模块的cnt_bit信号,两个模块的计数器信号没有对齐延迟了7个周期。(找到出错的地方)
3.11日,第二天,我又继续分析,,发现这两个计数信号的计数加一规律不一样,TxCNT_R一个是16个时钟周期。uart_rxs模块的cntbit信号是12个时钟。原来是这样的,那改成一样的加一规律即可。然后我再分析他们加一的驱动条件是啥,再次改成都是同样的驱动条件即可。

待发送的数据是8‘h6c,可以从波形看出,接受模块的发送线tx,发送的数据是从低位开始,直到最高位,故发送线是0011_0110.从波形看出,8位数据位计数器cnt_bit与发送线对应的数据相合,而且数据也是待发送的8‘h6c。
通过这次调试程序,最大感悟是:以分析现象明确原因,找出逻辑关系为原则(仿真,追根溯源,不断由输出到驱动条件一级级分析)。而不是自己猜想和胡乱改的。
参考博客:
长弓的坚持----为什么UART串口通信要16倍过采样数据
https://blog.csdn.net/wordwarwordwar/article/details/80178708?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163028678816780264043616%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163028678816780264043616&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-80178708.pc_v2_rank_blog_default&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%B2%E5%8F%A3%E8%A6%8116%E5%80%8D%E8%BF%87%E9%87%87%E6%A0%B7&spm=1018.2226.3001.4450
实习项目1-串口IP升级调试的更多相关文章
- React-Native项目在Android真机上调试
目录 1.确保你的设备已经成功连接.可以终端输入adb devices来查看: 2.终端运行npm start 开启本地服务,成功后运行react-native run-android来在设备上安装并 ...
- Vue项目无法使用局域网IP直接访问的配置方法
一般使用 vue-cli 下来的项目是可以直接访问局域网 IP 打开的,比如 192.168.1.11:8080 .但是最近公司的一个项目只可以通过 localhost 访问. 需要配置一下,才可直接 ...
- 七. jenkins部署springboot项目(4)-linux环境--远程调试
前提:linux环境,jenkins服务器和springboot服务器不在一台机器. linux环境,jenkins这里就不说了,主要说下和windows环境的不同. 1. jenkins服务器连接s ...
- Qt小项目之串口助手控制LED
Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...
- Linux中一个网卡含有多个IP,将从IP升级为主IP的方法
今天在查看虚拟机的时候,发现某一网卡含有多个IP地址: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fas ...
- vs2008 c#项目调试dll源码,问题:“若要调试此模块,请将其项目生成配置更改为“调试”模式” 的解决方案
情况: 1:有程序 Trans.exe 的vs2008 c#源码:Trans.exe项目里引用了 Water.dll: 2:有Water.dll的项目源码: 3:想在Trans.exe里调试Water ...
- Delphi 使用串口模拟工具进行串口程序开发调试
版权声明:本文为博主原创文章,如需转载请注明出处及作者. 本文由小李专栏原创,转载需注明出处:[http://blog.csdn.net/softwave/article/details/8907 ...
- 串口WIF简单调试
/*********************************************************************** Title:Wifi串口调试 Hardware: Wi ...
- 数据调试~~TCP转串口、串口转TCP调试
Android socket开发了一个socket客户端,当输入服务器ip以及端口,建立连接之后,Android可以发送数据到电脑接收服务器端. 如果电脑端没有socket服务器怎么办?方法如下: 1 ...
随机推荐
- CentOS7 下 ldap 部署
环境准备 # 关闭防火墙以及selinux,生产环境中,以实际需求为准 [root@localhost ~]# hostnamectl --static set-hostname ldap-serve ...
- 《深度探索C++对象模型》第二章 | 构造函数语意学
默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...
- 看SparkSql如何支撑企业数仓
企业级数仓架构设计与选型的时候需要从开发的便利性.生态.解耦程度.性能. 安全这几个纬度思考.本文作者:惊帆 来自于数据平台 EMR 团队 前言 Apache Hive 经过多年的发展,目前基本已经成 ...
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...
- [Matlab]求解线性方程组
转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方 ...
- Nexus6-刷LineageOS系统(Windows10处理环境下)
0.观前注意 本方法不一定保证正确,我只是通过了此方法进入了手机,但是仍然有少部分apk无法安装(比如v2rayNG),但是正常的浏览器和qq是能够正常运行的. 1.刷机准备 一台Nexus6手机(能 ...
- 【C# Task】System.Threading.Channels 生产者和消费者模式
前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在% dotnet add package System.Threading.Channels 而在Co ...
- 【C#Task】TaskCreationOptions 枚举
根据 TaskCreationOptions 的不同,出现了三个分支 LongRunning:独立线程,和线程池无关 包含 PreferFairness时:preferLocal=false,进入全局 ...
- 【C# 线程 】内存模型 与Volatile
CPU硬件有它自己的内存模型,不同的编程语言也有它自己的内存模型. 在 C# 的语言规范中 ECMA-334,对于Volatile关键字的描述: 15.5.4 Volatile fieldsWhen ...
- WPF中TreeView控件数据绑定和后台动态添加数据(二)
写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...