内部上拉电阻失效是否常见?或者什么会导致它们变得断断续续?

电器工程 设计 拉起 可靠性 片上系统
2022-01-28 06:16:44

我有一个基于 ASIC ARM Cortex-M3 的电路板,经过几个月的工作突然开始报告虚假的按钮按下。ASIC 不是我们的设计,而是一家知名公司的设计。

按钮示意图如下。该引脚配置为输入,启用上拉电阻。电阻值约为 30KOhm。

用数字万用表测量引脚侧时,我看到值浮动。有时是 3.2V(=VCC,芯片范围:2.1V 到 3.6V),有时在 0.6V 到 1.0V 之间浮动。

没有湿度/冷凝问题(9% RH),痕迹上没有灰尘或其他物体。这是唯一遭受此问题的董事会。该板的其他制造克隆工作没有任何问题(到目前为止)。

我唯一能想到的是,有什么东西使内部上拉闪烁。内部引体向上让位是常见的吗?还有什么可能导致这种情况?

按键示意图

R9、R12 为 2.2Kohm,C10、C11 为 33nF。

4个回答

统计是你的朋友。我明白了,您的设备出现故障,您想知道这是我的错吗?批量运输安全吗?如果这确实是一个问题,我们将 10,000 台设备运送到现场会发生什么?所有迹象都表明您在胡说八道,并且您可能是一位尽职尽责的设计师/工程师。

但事实是,你有一个失败,确认偏见的人类弱点适用于消极情况和积极情况一样容易。你有过一次失败,没有明确的原因。除非您知道引发这种影响的事件,否则这只是焦虑。

这是 ESD。我可以证明它是ESD吗?- 也许/也许不是 - 如果你把零件寄给我,我会花大价钱把它拆掉,然后通过不同的测试,比如 SEM 和带有表面对比度增强的 SEM,也许。我有很多情况下,我故意破坏了一个设备作为 ESD 认证的一部分,该设备发生了故障,但花了 30 个小时才找到故障点。了解故障机制和活化能很重要,因此必须进行搜寻(如果显然是浪费),但有一半的时间我们看不到故障点。那是在 FMEA 分析和设计指导的位置消除之后。

人们有这样的错误观念,即 ESD 总是意味着爆炸和芯片内脏,到处都是熔融的硅和刺鼻的烟雾。您有时确实会看到这种情况,但通常只是栅极氧化物中的一个微小的纳米级针孔破裂。它可能发生在很久以前,随着时间的推移,由于参数偏移而失败。

事实上,在 ESD 测试期间,我们使用 Arrhenius 方程来预测失效。我们在不同级别和不同模型(源阻抗)上对设备进行破坏,然后我们将小 b***rds 煮几个小时,并随着时间的推移跟踪它们,以便能够收集故障模式,从而预测未来的性能。您可以轻松地让 1000 块板上的芯片在环境室中一次运行数月。这都是“合格”的一部分——即资格。

我们一直在寻找 _some_failure 模式的关键影响是 EOS(电气过载)。它可能由 ESD 或其他情况引起。我对芯片内部的门级 EOS 进行了现代化处理,最大可能为 15%。(这就是为什么在预期的 MAX Vss 轨道上运行芯片如此重要的原因)。EOS 可以在几个月后显现出来。运行产生的热量就像一个小型加速寿命测试(您只是没有应用 Arrhenius 方程,而且它不受控制)。

如果您想更好地理解,请查看描述测试探针和充电的 MM(机器模型)和 HMB(人体模型)的 JEDEC ESD22 标准。

这是来自 JEDEC JESD22-A114C.01(2005 年 3 月)的模型片段。

在此处输入图像描述

你有点注意到它看起来有点像你的电路?并且这些值甚至有点接近,这与正确的电压水平一起使用,可以将 ESD 结构中的废话吹掉。

所以你需要做的是:

-scrap that board
- track it's provenance, lot number and who handled it
- keep this info in a database (or spreadsheet)
- note in dB that you suspect ESD
- track all failures
- check the data over time.
- institute manufacturing controls so you can track.
- relax - you're doing fine.

看起来您已经努力将输入引脚与开关隔离,但是,压倒性的 ESD 事件可能已经损坏了芯片上引脚驱动器/接收器电路的某些部分(不一定是特别是上拉设备) .

如果你想让它更健壮,你可以考虑在开关和引脚之间添加外部钳位二极管、铁氧体磁珠,甚至晶体管缓冲器。

最有可能的情况是芯片遭受了一些损坏,其可见影响包括片状上拉行为,或者该代码出于某种原因导致上拉电阻有时被意外启用有时被禁用。如果主线代码执行以下操作,则可能经常出现后一种情况:

WIDGET_PIN_PORT->PULLUPS |= WIDGET_PIN_PULLUP_MASK;

并且中断会执行以下操作:

GADGET_PIN_PORT->PULLUPS |= GADGET_PIN_PULLUP_MASK;

其中 WIDGET_PIN 和 GADGET_PIN 是同一 I/O 端口上的不同位。主线代码将翻译为类似

ldr r0,= [[address of port pullup register]]
ldr r1,[r0] ; ***1
orr r1,#WIDGET_PIN_PULLUP_MASK
str r1,[r0] ; ***2

***1如果在 之后但之前发生中断***2,则 GADGET_PIN 的上拉电阻将被中断打开,但随后被主线代码错误地关闭。有两种方法可以避免这个问题:

  1. 使用可能允许使用单个指令而不是读取-修改-写入序列来设置上拉寄存器的位的硬件。我相信所有基于 Cortex-M3 的控制器都提供了可用于此目的的“bit-banging”功能,尽管除了手动定义位之外,我还没有从用 C 编写的代码中找到任何使用它的好方法带状地址。其他一些处理器可能具有特定于 I/O 端口的方法来完成类似的任务。
  2. 在端口读取-修改-写入序列期间禁用中断。例如,将上面的 C 代码替换为对方法的调用

    void set32(uint32_t volatile *dest, uint32_t value) { uint32_t old_int = __get_PRIMASK(); __disable_irq(); *dest = *dest | 价值; __set_PRIMASK(old_int); }

此代码将导致中断被非常短暂地禁用(可能大约 5 条指令);这足够简短,即使是相对时间关键的中断也不会引起问题。请注意,将上述方法编译为内联可能会减少调用它所需的时间,但可能会增加禁用中断的时间[例如,如果优化器碰巧重新排列代码,因此加载地址的指令dest不会直到 __disable_irq()] 之后才发生。

鉴于您说上拉行为是间歇性的,我认为代码问题可能比硬件问题更有可能。此外,会损坏上拉电路的损坏条件也可能对芯片造成其他损坏——有些可检测到,有些则不可检测。如果芯片发生任何类型的可证明的硬件损坏,最好将芯片丢弃并更换新芯片,而不是希望观察到的损坏是“唯一”问题。

之前的一些答案忽略了最明显的:检查按钮、电阻器、电容器和 uC 的焊点。在显微镜下,您可能会看到破裂的焊点。

如果您没有显微镜,请重新焊接一个和一个接头,看看它是否能解决问题。