调试DM9000过程中出现的认知与逻辑问题

在单片机项目中,很多难解的、涉及到硬件的bug,往往会采用对比实验的方式,即正常板子和异常板子跑同一份代码来对比现象。

这里有一个很重要的认知前提,就是这份代码不一定没有问题,只能说这份代码放在正常的硬件上没有体现出问题。如果认为软件部分就是完美的判官,那么软件在异常硬件上的行为,可能导致更复杂的现象,这时若认知里执着的认为是硬件的新问题,就跑偏了。

嵌入式的问题是综合而复杂的,而且在长时间的调试之后会产生甩锅思想,主打一个我没问题。其实自己已经在这个地方栽过多次跟头了,都是跟自己看数据手册不细致有关,明明经验不丰富,却又有着完全盲目自大的直觉,靠感觉写代码。

印象很深的一次,是调试一块SPI驱动的DAC,接线很多,看手册下意识认为SYNC是片选的作用,和往常一样直接下拉选中就好,实际上这个IC依靠SYNC的上升沿才会将数据输出为模拟量。

最近的一次是调试H7+DM9000,也正是这个恶心的调试过程,让我有了写这篇记录的想法。这个项目的软件demo是5月在开发板上写好测试过的,现在7月硬件板子打好了开始跑代码测试。说实话DM9000这块片子的背后全是新知识,涉及到H7中MPU与Cache的处理、FMC外设、网络基础、lwip协议栈还有MCU MAC PHY MDI之间的原理和硬件知识,任何一部分的认知不到位,出了问题就根本没法调试。

第一个问题,最开始读不到DM9000的ID,这个直觉看是MCU和DM9000的通信有问题,背后实际是俩问题,一个是DM9000被NE1选中后映射到0x6000 0000的区域,没有做No Cache的处理,另一个是FMC驱动时序,可能由于布线问题,之前在开发板上配置的时序没跑通,放宽了BusTurn这个参数才正常,而且也意识到,这种总线的时序,不能依赖数据手册,得用经验数值去试。

第二个问题是网口灯不亮,没办法,没调试过的片子,发现的问题都这么朴素。其实这个问题的背后是网口自协商的问题,也会引发第三个问题。围绕灯不亮的问题,确实研究了很久,因为同样是网口,LAN8720这种纯PHY的片子,没有程序也能亮灯来反应网线连接和收发情况(后面发现DM9000这种集成了MAC+PHY的片子,确实得先通过程序用FMC配置到工作状态才能亮灯,当然这里又武断了,没准别的集成片子上电后就处于工作状态了)。调试先看到了LED的限流电阻是2kΩ,开发板是510Ω,补习了LED的驱动电流后,发现这里就算电流有点小,也不会完全不亮。周末下午没开灯,像个没头苍蝇一样调试到晚上之后,惊奇的发现网口灯在黑暗中很微弱的闪灯,而按照配置的LED模式,反应连接的灯也在不停的闪,于是便研究网口的自协商协议,发现10M的PHY会以一定的间隔发送NLP时序,100M会在这个基础上插入表示FLP的时序,用于给对方识别再进一步协商。到这里,直觉上认为是RJ45那边过来的信号有问题,但先得排查保证后方的通信和功能正常,于是想起在数据手册瞥见的回环模式,正巧DM9000有PHY和MAC都可以LOOPBACK,摸索之后验证了一下,MAC自发自收正常,MAC+PHY的自发自收正常,同时网口灯也会正确的亮起来指示连接与收发,顺便也验证了FMC数据收发正常,经高手提示后面把自协商关了,锁定为10M,发现可以ping通了,长舒一口气,也算有进展。这里锁定了问题后,就带着问题和硬件同事一起调试,对比开发板发现100M的情况下TX RX差分信号的电平有异常,从2.5V上拉改为3.3V后,自协商显示正常,但实际这个目前还没很好的解决办法,也会导致问题三排查时的认知错误。

第三个问题是DM9000发送UDP包给PC,PC抓包出现以太网帧整体数据错位,原本地址的位置会错位成数据。MAC帧的结构是 前导码+AAA+BBB+DDDDDDDDDD+CRC,PC这边用的是Windows+Wireshark,CRC错误的包已经被网卡丢弃,所以能抓到的以太网帧都是CRC没问题的,而CRC是DM9000自动生成的,说明从DM9000差分线到网线,数据原原本本的送到了PC,而拿开发板跑同样的程序对比,之前确实通信抓包是没问题的。那就奇了怪了,软件没问题,FMC读写没问题,MAC和PHY回环没问题,外部的MDI到PC也没问题,难道硬件还有别的问题?这里犯了两个认知错误,之前问题二真的靠3.3V电压解决了吗,软件层面就没问题吗。研究了各种例程发现,自己的DM9000发送驱动是有问题的,发送数据前或后,应该判断并死等寄存器里发送完成的标志位,才能进行下一次的发送。之前软件在开发板跑没问题,是因为开发板硬件正常,能够跑到100M的速率,H7 400M主频的应用层只管通过协议栈将UDP数据包塞给DM9000,DM9000完全可以通过100M速率消化这些数据包,通信瓶颈本身在于CPU,所以没有判断发送完成也是正常的。但目前带问题的板子,显然是没跑到100M,后面加上死等发送完成后,没有了数据错误的现象,但速率只有7M。所以一股脑的塞数据包,DM9000消化不及时,旧的数据在SRAM中被新数据覆盖,就导致了数据整体错位的现象。

DM9000硬件的问题仍然需要进一步研究,这个过程虽然恶心,但确实能够反应出自己一贯的思维方式的问题,加油吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决jupyter argparse报错

jupyter argparse报错 文章目录 一、jupyter argparse报错 一、jupyter argparse报错 args parser.parse_args()这行代码改为: args parser.parse_args(args[])完整的代码为: import argparseparser argparse.ArgumentParser() parser.add_argumen…

力扣题解(零钱兑换II)

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 3…

sourcetree中常用功能使用方法及gitlab冲突解决

添加至缓存:等于git add 提交:等于git commit 拉取/获取:等于git pull ,在每次要新增代码或者提交代码前需要先拉取一遍服务器中最新的代码,防止服务器有其他人更新了代码,但我们自己本地的代码在我们更新前跟服务器不…

Java实战中如何使用多线程(线程池)及其为什么使用?

这个话题在入行之前就想过很多次,很多8古文或者你搜索的结果都是告诉你什么提高高并发或者是一些很高大上的话,既没有案例也没有什么公式去证明,但是面试中总是被问到,也没有实战经历,所以面试时一问到多线程的东西就无…

JAVA零基础小白自学日志——第十九天

文章目录 1.private(私有)2.static(静态)3.final(最终)[1].fianl修饰变量[2].fianl修饰方法[3].fianl修饰类[4].为什么需要fianl关键字修饰类和方法 4.private\static\final的共同点5.同名变量6.方法重载和…

深度学习入门——与学习相关的技巧

前言 本章将介绍神经网络的学习中的一些重要观点,主题涉及寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定方法等 此外,为了应对过拟合,本章还将介绍权值衰减、Dropout等正则化方法,并进行实现。 最后将对近年来…

细说MCU用单路DAC模块设计和输出锯齿波的实现方法

目录 一、STM32G474RE的DAC模块 二、配置 1.配置DAC 2.选择时钟源和Debug 3.配置系统时钟 三、代码修改 1.启动DAC 2.给DAC的数据输出寄存器赋值 3.运行并观察输出 一、STM32G474RE的DAC模块 有些MCU本身就带有数/模转换器(Digital to Analog Converter,DAC)模块&am…

昇思25天学习打卡营第20天|Diffusion扩散模型

Mindspore框架利用扩散模型DDPM生成高分辨率图像(生成高保真图像项目实践) Mindspore框架利用扩散模型DDPM生成高分辨率图像|(一)关于denoising diffusion probabilistic model (DDPM)模型Mindspore框架利…

差分进化算法原理及其MATLAB/Python代码

1.算法简介 引用自:Storn R, Price K. Differential evolution–a simple and efficient heuristic for global optimization over continuous spaces[J]. Journal of global optimization, 1997, 11: 341-359. 今天给大家带来的是一个非常经典的智能优化算法–差分…

【多模态】42、LLaVA-UHD | 支持任意纵横比和大分辨率图像输入的 LLaVA

论文:LLaVA-UHD: an LMM Perceiving Any Aspect Ratio and High-Resolution Images 代码:https://github.com/thunlp/LLaVA-UHD 出处:清华 | 新加坡国立大学 | 中国科学院大学 一、背景 现有的很多 LMM 都是将图像处理成固定的纵横比&…

Ubuntu编译ffmpeg并添加cmake工程

文章目录 前言前提须知为什么要自己编译 FFmpeg前提软件包与工具的安装编译ffmpeg写CMakeList.txt包含ffmpeg到我们项目中 总结 前言 FFmpeg 是一个领先的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包…

探索Web世界:WebKit的地理位置API

探索Web世界:WebKit的地理位置API 在数字时代,地理位置信息已成为许多在线服务和应用的关键组成部分。WebKit,作为众多流行浏览器的内核,如Safari、QQ浏览器等,提供了强大的地理位置API(Geolocation API&a…

设计模式11-原型模式

设计模式11-原型模式 写在前面对象创建模式典型模式原型模式动机结构代码推导应用特点要点总结 原型模式与工厂方法模式对比工厂方法模式原型模式什么时候用什么模式 写在前面 对象创建模式 通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支…

数学建模--国赛备赛---TOPSIS算法

目录 1.准备部分 1.1提交材料 1.2MD5码相关要求 2.TOPSIS算法 2.1算法概述 2.2基本概念 2.3算法核心思想 2.4拓展思考 3.适用赛题 3.1适用赛题说明 3.2适用赛题举例 4.赛题分析 4.1指标的分类 4.2数据预处理 4.2.1区间型属性的变换 4.2.2向量规范化 4.3数据加…

基于 Three.js 的 3D 模型加载优化

作者:来自 vivo 互联网前端团队- Su Ning 作为一个3D的项目,从用户打开页面到最终模型的渲染需要经过多个流程,加载的时间也会比普通的H5项目要更长一些,从而造成大量的用户流失。为了提升首屏加载的转化率,需要尽可能…

IDEA的断点调试(Debug)

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

【内网安全】横向移动-Kerberos-SPN-WinRM-RDP

目录 环境介绍与横向移动前置域横向移动-WinRM-WinRS移动条件: 步骤0、攻击机开启winrm服务:1.CS探针5985端口:2.连接目标主机并执行命令:3.上线CS&MSF:4.CS内置横向移动-winrm 域横向移动-RDP简介与条件RDP横向移动连接的三种…

(C++二叉树06) 二叉搜索树的最小绝对查和众数 二叉树的最近公共祖先

530、二叉搜索树的最小绝对差 递归法&#xff1a; class Solution { public:vector<int> vec;void traversal(TreeNode* root) {if(root NULL) return;traversal(root->left);vec.push_back(root->val);traversal(root->right);}int getMinimumDifference(Tr…

TCP状态转换详解

1.什么是TCP的状态转换 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中&#xff0c;连接的状态会随着不同阶段的通信而发生变化&#xff0c;这些变化被称为状…

嵌入式Linux入门知识点汇总-启动过程、设备树、设备框架、锁

目录 1.BootLoader启动过程? 引导加载程序(Bootloader) 补充u-boot的理解 通用的bootloader 2.系统调用过程? 3.设备驱动模型的三个重要成员? 4.驱动和设备注册是否存在先后顺序? 5.framebuffer机制? 6.字符设备和块设备的区别并分别举例? 1.字符设备 2.块设备…