4
\$\开始组\$

免责声明在多次尝试查找问题原因的基础上,我确定我可能面临的是硬件问题,而不是程序故障,因此我在这里发布此消息,而不是在Arduino频道中。这可能是我在职业生涯中遇到过的最奇怪的情况,涉及一个定制的Arduino董事会。请容忍我。我会尽可能简洁。

简而言之

我设计了一个基于骨干Arduino MEGA 2560的复杂数据采集和传输系统。我的代码基于自定义FSM,将近6000行。我的系统能够很好地响应一组命令,在闪存MCU后从板载SPI闪存SD卡读取和写入数据。即使在系统电源循环后,仍将UART-USB转换器连接到PC上。所有代码和命令都可以正常工作。然而,碰撞仅在以下情况下发生:

  1. 关闭系统电源(5V/3.3V),
  2. 拔下并插回UART-USB转换器(USB侧)
  3. 接通系统电源
  4. 发出一个特定命令,逐行读取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发布数据XXX10秒后发出命令,此时板也会崩溃。
  • 编辑:正如@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驱动程序可能是类似问题的原因。

\$\端组\$
12
  • 1
    \$\开始组\$ 框图不够详细,无法解决问题。请张贴示意图。MCU电源是在3.3V还是5V电压下运行?此外,您不应该将通电和未通电芯片的数据引脚连接在一起,这将导致类似这样的问题。 \$\端组\$ 5月12日0:20
  • \$\开始组\$ @只是我改进了方块图。MCU由5V供电。不幸的是,我无法分享原理图,因为设计是由客户委托给我的。我理解你关于连接引脚的观点,但是,我也尝试过用相同的电源为两个芯片供电,结果相同。我将在描述中对此进行澄清。 \$\端组\$ 5月12日0:26
  • \$\开始组\$ @只是请让我知道关于硬件的缺失信息可能与您有关。谢谢你的意见。 \$\端组\$ 5月12日0:29
  • 2
    \$\开始组\$ 这真的不是我们能解决的问题。它可以在堆栈中的任何位置:在您的状态机中,支持例程、中断、缓冲区或堆栈溢出、SD卡等。您的软件如何处理UART通信中的错误?标准偏差?内部构件?你把问题细分了吗?导致它失败的最小情况是什么?您是否确定了这是哪种故障,您的整个系统是否只是没有响应但仍在运行,CPU是否完全崩溃,您是否可以通过备用UART上的中断运行调试终端,等等。? \$\端组\$ 5月12日0:31
  • 1
    \$\开始组\$ @丹尼尔·梅伦德雷斯(Daniel Melendrez)我已经提到了,实际的示意图缺失了。任何想要复制您的设置的人都必须阅读描述示意图的文本墙,然后绘制示意图以查看它们。这将减少您描述示意图以及更新所需细节的工作量。但是,如果在将通电的UART芯片连接到无电源的MCU时出现问题,那么这就是问题所在,不要这样做。无论涉及什么芯片,这样做都是错误的。修复示意图,以防止MCU从UART引脚一半供电。 \$\端组\$ 5月12日9:27

3个答案

重置为默认值
5
\$\开始组\$

这个答案试图记录一些关于故障模式、调试和潜在修改的建议。虽然这有点投机,但它太长了,无法发表评论。

幻影力量的可能原因

ATmega2560数据表显示了I/O引脚上的ESD保护二极管:

在此处输入图像描述

连接到无电源ATmega2560的供电USB UART的输出将尝试通过I/O引脚和V之间的保护二极管为ATmega2560供电立方厘米。这可能是导致幻象电源在问题标题中。

幻影电源如何导致故障

最后,即使在断开所有电源、拔下所有电缆并让板“放电”一段时间后,系统也不会再次响应相同的DATA XXX命令。它每次都会崩溃。

我不使用ATmega2560微控制器,但在出现故障后,是否可以使用ICSP验证闪存中的内容是否仍然包含预期的程序?

也就是说,如果在主电源之前插入UART-USB转换器,并通过其I/O引脚为ATmega2560供电,则会导致闪存损坏。一种潜在的故障模式可能是通过其I/O引脚为ATmega2560供电,导致指令执行错误,从而损坏闪存中的程序。

针对幻影电源的可能保护

美国第三季度在与外部3.3V逻辑系统通信时,使用由BSS138高速MOSFET(每条线路Tx/Rx)组成的电平移位器。

可能使用支持指定的水平移位器部分断电将避免出现问题。例如TI电压电平转换指南有一些设备描述为:

设备完全指定用于使用I的部分断电应用关闭I关闭电路会禁用输出,防止设备断电时损坏的电流回流。

While期间通用异步收发器1目前没有使用电平移位器,可能会使用与支持部分断电相同的电平移位器美国第三季度,但为了通用异步收发器1两侧工作且输入/输出电压相同。

\$\端组\$
5
\$\开始组\$

将有源IC连接到无电源IC将通过数据引脚为无电源IC提供反向馈电。

您的MCU有一个16 MHz的时钟,根据数据表,它至少需要4.5V才能在16 MHz下运行。

如果您正在将未供电的MCU连接到另一个供电的IC,无论它是5V IO还是3.3V IO(通过电平移位器),并且您使用从MCU到数据引脚的上拉电阻,那么您的MCU都会从另一个芯片的数据引脚获得弱漏电路径。

因此,AVR开始运行,可能看起来工作正常。如果它需要更多电流,电源可能会降得太低,无法工作。问题是在16 MHz时,电压需要至少为4.5V。如果它以8 MHz的频率运行,它将在低得多的电压下工作。

也许可以防止数据引脚的电源回馈来解决问题。使用适当的电平移位器,该移位器不会将电流传递到未通电的MCU。

也许可以启用低压检测器,使AVR保持重置,直到真正通电,这样,在施加足够的电压之前,AVR不会开始运行。

可能会添加重置电路,以保持AVR外部处于重置状态,直到电源正常。

基本上,如果AVR在仅通过数据IO引脚通电的情况下开始运行代码,并且电源引脚上没有足够的电压来运行AVR本身或任何外部组件,则AVR执行的任何代码都可能执行不正确,或者AVR想要与之通信的任何外部组件也可能由于没有电源或欠压运行而无法运行,或者当与之通信时,它可能开始消耗更多的电流,足以将电源电压降至AVR无法正确执行任何操作码的水平,或者由于欠压而处于重置状态,即使打开主要供应也不会恢复。

此外,当通信接口为AVR供电时,传输的任何数据都会导致电压下降。因此,根据您发送的命令,发送足够的零位,AVR就不会在零位上通电,电压也会下降。

\$\端组\$
1
\$\开始组\$

问题出在复位电路中

当主电源重新接通时,它应该能够向MCU发出重置。

该重置应导致软件命令重置所有外部前置器(因此闪存卡)

\$\端组\$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策

不是你想要的答案吗?浏览标记的其他问题问你自己的问题