免责声明在多次尝试查找问题原因的基础上,我确定我可能面临的是硬件问题,而不是程序故障,因此我在这里发布此消息,而不是在Arduino频道中。这可能是我在职业生涯中遇到过的最奇怪的情况,涉及一个定制的Arduino董事会。请容忍我。我会尽可能简洁。
简而言之
我设计了一个基于骨干Arduino MEGA 2560的复杂数据采集和传输系统。我的代码基于自定义FSM,将近6000行。我的系统能够很好地响应一组命令,在闪存MCU后从板载SPI闪存SD卡读取和写入数据。即使在系统电源循环后,仍将UART-USB转换器连接到PC上。所有代码和命令都可以正常工作。然而,碰撞仅在以下情况下发生:
- 关闭系统电源(5V/3.3V),
- 拔下并插回UART-USB转换器(USB侧)
- 接通系统电源
- 发出一个特定命令,逐行读取SD卡并解码数据-->撞车发生了
我的系统由以下模块组成。
背景
启动后,系统进入一个简单的FSM,等待串行命令结束通用异步收发器3
(由驱动系列事件3
)以开始从一组I2C传感器获取数据。当例程启动时,值保存在SPI闪存SD卡在预先确定的时间内使用ASCII格式。USART1号机组
用作调试端口以打印常规事件、信息和值,以确定健康在任何时候都可以访问系统。
使用特定的指令(我们称之为数据XXX
),系统能够将所需文件转储到通用异步收发器3
通过使用将ASCII值转换为HEX表示的自定义算法逐行读取文件。当MCU最近被刷新时,这种算法可以完美地工作。循环电源似乎不会影响响应,董事会对数据XXX
命令。连续多次发出此命令效果很好,从而消除了怀疑RAM问题的可能性。
值得一提的是数据XXX
命令广泛使用SPI闪存卡在数据读取和转换过程中多次打开和关闭,因为数据是“实时”读取和处理的。这是由于缺少读一行
方法SD库,如前所述在这里。
系统描述、测试条件
- 该系统由定制设计的线性电源供电,额定电压为3.3V、5V,每个通道的最大电流为1.5A。用示波器测试,电源清洁。ATMEGA2560由5V供电。
- MCU使用带有22pF去耦电容器的16MHz晶体振荡器(汽车级)。
- 所有ATMEGA2560芯片均来自Mouser(同一批次)
- 使用ATMEL-ICE板和AVRDUDESS通过SPI(ICSP)闪存固件
- 使用10uF Tant+100nF陶瓷电容器对所有电源引脚进行适当解耦。
- PCB为4层设计,具有适当的接地和缝合。MCU还具有EMI屏蔽和适当的防护。
- SPI闪存卡在MOSI、SCK和CS线路上有一个电平移位器。它由3.3V电源供电,并适当解耦。
- 所有I2C传感器响应良好,在
数据XXX
命令。
美国第三季度
在与外部3.3V逻辑系统通信时,使用由每线Tx/Rx的BSS138高速MOSFET组成的电平移位器。
- 两个UART都使用UART-USB转换器连接到PC。一端使用杜邦电缆连接到UART引脚,USB连接器使用USB-a扩展插件插入。我测试了基于不同芯片的不同商业板,如CH340、CH341、FTDI和MCP2200,它们都是从不同供应商处购买的。行为是一样的。
- 我们已经在3个相同的系统(完全相同的硬件)上测试了相同的代码。
- 我们使用YAT公司作为不同计算机上所有测试的串行终端。
- 我们为ATMEGA2560尝试了不同的保险丝配置
- 我们尝试了使用和不使用引导加载程序(基于以前的报告). 我们已加载Optiboot(来自MEGACORE公司)尝试不同的配置都没有成功。股票
stk500boot_v2_mega2560.hex
由于以前版本中UART问题的旧报告,也重新刷新了。
- 我们已经测试了该系统,通过
通用异步收发器3
发布数据XXX
10秒后发出命令,此时板也会崩溃。
- 编辑:正如@Justme所指出的,将插脚从通电芯片插入非通电芯片并不是一个好做法,然而,我们也使用了系统的相同电源为UART-USB转换器供电(通过拆除馈送CH343的USB保险丝),获得了相同的结果。不过,还需要进行更多测试。
值得注意的是,我们观察到,当将UART-USB转换器连接到通用异步收发器1
(没有电平移位器的端口)MCU一直在向5V轨道泄漏电压,从而导致RST线路泄漏。电压约为3V。拔下转换器插头时,此电压消失。类似地,转换器打开通用异步收发器3
泄漏1.6V的较低电压。这种“幻影电源”可能会在内部缓冲区上产生问题,但是,由于其他指令响应良好,这一点还不完全清楚。
例如,在发出数据XXX
命令刷新固件后,系统接收指令并按预期处理文件:
此处,值以HEX表示形式显示,包括传输的命令:
最后两个屏幕截图以不同的表示形式显示了相同的信息。文件编号6从SDCard逐行读取并转换为HEX。即使在发送命令后,这种行为仍然存在好几次。
现在,在关闭系统电源后,拔下两个UART-USB转换器,将其中一个插回USB端口,再次打开系统电源,系统将正确加载,但是数据XXX
命令使系统崩溃,如下所示:
请注意,崩溃点是随机的。它在处理的不同阶段崩溃。
然而,当请求不存在的文件时,电路板仍会做出响应(在电源循环后),例如:数据070
抛出预期错误
消息:
这个数据XXX
命令搜索所需的文件,如果找不到错误
显示消息,指示SD卡可有效读取。
最后,即使在断开所有电源、拔下所有电缆并让电路板“放电”一段时间后,系统也不会做出相同的响应数据XXX
再次指挥。它每次都会崩溃。UART端口似乎正在已损坏在获得Vcc之前,通过UART端口“注入”电源。
请分享您的想法、评论和问题。
- 为什么按照前面描述的特定顺序插入板时,我的系统会崩溃于特定命令?
- 我的那批MCU有缺陷吗?
- 你认为我的代码仍然是问题的原因吗?
我肯定遗漏了一些相关信息。相信我,我已经尝试了我能想到的一切,并且我已经广泛搜索了所有与类似系统崩溃有关的问题,但是,我还没有找到与我的情况类似的问题。我只找到了一个类似情况发现Windows驱动程序可能是类似问题的原因。