在不懈追求更高系统性能的过程中,集成设备制造商(IDM)变得越来越精于开发数字接口,这些接口能够在充满挑战的电子环境中高速运行。诸如SPI和I2C之类的标准接口提供了一种相对简单的方式,以可靠且有效的方式将自不同供应商的设备连接起来。其它类型的接口亦如此。
对于想要使用“标准”技术快速构建复杂系统的开发人员来说,数字域无疑被视为避风港。的确,嵌入式行业在很大程度上依靠“正常工作”的标准接口,因为它们提供了可供创新的框架。但当它们不能“正常工作”时,就可能导致混乱,尤其是当错误原因被误判时。当根据规范应用时,接口开发一般都稳健且可靠,因此任何混乱都可理解。底层物理接口固定在芯片中的事实也保证了这一点。
各种形式的系统噪声
任何信号失真都可解释为为噪声,可以合理地假设噪声在通信环境中最明显,收到的信号已不是最初发送的信号。这种直接相关性相对容易发现,但在某些情况下,因果关系不太容易识别。当故障间歇性出现时,问题就更加复杂了。
如今的微控制器设计目标是以最少的配置提供可靠的操作。对串行接口来说,这可能包括预先设置I/O引脚上的高驱动电流,用以应对较长的PCB走线或高容性负载的影响。在某些情况下,这可能会导致接口过度驱动,进而导致并被误读为错误或故障的衍生结果。
例如,串行闪存器件提供了许多高级功能,以确保可靠的操作并允许设备被询问。这可能包括噪声滤波器、高级自适应编程以及管理存储单元裕度的擦除算法。一些制造商还将ECC设计在存储元素中,从而在每次写入操作时保存额外的元数据,以允许检测和纠正单个或多个位错误,但是当噪声破坏了通信接口总线上的基本消息传输时,采用ECC修复错误将于事无补。
SPI接口上的噪声可能会被误读为附加的时钟脉冲。由于SPI是时钟驱动接口,因此可能会产生一些不良影响,例如命令被忽略、数据被误读、错误命令被使用等。但是,噪声也携带能量,在某些情况下,这种能量本身会在设备在操作过程中引入错误。
电荷泵和过冲
大多数情况下,数字接口可以忽略信号中的某些过冲或欠冲。但是,不要忘记,曲线下的能量仍然存在,在某些电路中这可能具有破坏性。
一个典型的例子是串行闪存中的电荷泵电路。如果SPI总线信号包含很大的噪声,则该信号中的能量可能会传播到电荷泵并干扰其工作。
闪存中的电荷泵承担着一项关键任务,即提供用于改变存储单元偏置并有效存储逻辑1或逻辑0所需的电源。写/擦过程是闪存操作中的关键时刻,在此期间电荷泵的任何中断都可能导致写入/擦除错误,尽管这种错误可能被检测出来,但也有可能被隐藏。
上述类型的错误很容易被误解为闪存器件的故障。闪存应具有制造商保证的有限次数的读写周期,对这一点,嵌入式设计人员完全了解。但他们不太了解的是,一个没有太多过冲或欠冲的简洁接口有多么重要。
例如,图1中的曲线显示了六个闪存器件的正常单元裕度。用代表逻辑1(2V至5V)和逻辑0(> 6v)的数据进行编程的存储单元之间出现了两种不同的模式。相比之下,图2中的曲线显示了三个闪存器件的存储单元裕度数据,这些闪存器件因为控制线路上的过冲和欠冲而导致数据损坏。
图1:此图显示了编程和擦除两种情况下,良好的闪存存储单元裕度数据。(来源:Adesto)
图2:此图显示了当SPI线上存在明显噪声时,糟糕的闪存存储单元裕度数据。(来源:Adesto)
有多种因素会影响噪声水平,例如工作频率、信号幅度、MCU驱动级别以及噪声尖峰中包含的能量。PCB设计以及信号间的串扰也可能成为影响因素。
图2中的数据显示了串行接口上太多过冲和欠冲造成的影响,图3则展示了实际应用中过冲是怎样的。
图3:该迹线清楚表明了,SPI线上的过冲和欠冲,导致5.65V的峰-峰电压值,该值超过了闪存规范中提到的绝对最大值。(来源:Adesto)
这种噪声可能导致错误的设备操作,表现为串行闪存存储值的错误。最初,错误的真正影响被忽略了,因为以较低频率轮询STATUS寄存器,报告的错误也少,从而导致设计人员对故障的根本原因做出误判。
找出根源
尽管此故障表现为内存故障,但根本原因并不在闪存器件。Adesto工程师通过探测SPI信号并识别系统噪声表征发现了这一点。虽然噪声的产生部分归因于MCU与闪存之间的PCB迹线上存在阻抗不匹配,但这还不是全部。
噪声源实际上是MCU接口,其在电源启动时默认为高驱动电平。驱动过量足以在SPI线上引起过冲和欠冲,在某些情况下,这可能被误读为信号跳变,从而导致读取和写入错误。而且,在这种情况下,过冲保持了足够的能量来破坏Flash电荷泵,这反过来又导致了错误。
在客户设计中,微控制器为其I/O接口提供可配置的驱动电流,启动时默认为HIGH。由于应用程序代码在初始化期间不修改此电平,因此在正常操作中它仍保持高电平。
对于SPI总线上的其它器件,这种影响可能并不明显,因为数字接口通常设计地很稳健。 而闪存的敏感特性,以及在高频下运行的需求,特别是电荷泵的运行,使得该存储器极易受到过冲/欠冲的影响。这导致了错误的操作,一开始就将其错误地理解为闪存器件的故障。
纠错
降低流经固件的驱动电流,可将过冲和欠冲有效地减少到零(图4),进而实现闪存的无错运行。
图4:在没有明显过冲的情况下,串行闪存的电荷泵能够正确运行并提供可靠的功能。(来源:Adesto)
故障特性表明,闪存器件正在尽一切努力补偿错误造成的影响,即SPI接口上过多的系统噪声。
最重要的是,产生错误的原因实际上是MCU采用的一项设计功能,这项功能被默认设置为大多数情况下完全可接受的工作模式。高驱动输出和不完善的PCB电感的结合,为间歇性故障的产生创造了条件。一个简单的固件修改,减少MCU上的驱动输出,即可解决该问题。
真正的教训在于:看起来确定的组件故障可能实际上是设计的疏忽。最初的误判自然导致存储器件的更换,但是通过客户和供应商、以及硬件和软件工程团队之间的紧密合作,一定可以找到真正的原因,进而采用正确的解决方案。最终,设计得以完善,系统性能更高、可靠性更高。
结论
在没有明显影响的情况下,系统噪声很容易被忽略。在最佳条件下很难定位间歇性错误,但如果错误被误读,情况会更加糟糕。
过冲可能是最不明显的系统噪声形式,但是如上所述,其影响可能是巨大的。闪存是一种可靠的技术,但仍然取决于精心设计的接口。串行接口上的过多噪声有可能传播到电荷泵电路,可能损坏编程和擦除电路操作。由此产生的无法预料的特征很容易被误读为器件本身的故障,它表现为存储单元的故障,以及不一致或不可靠的编程和擦除操作。
在这种情况下,更换闪存以为问题已解决,可能会导致产品在某一时刻进入市场失败。反之,设计人员能够将编程和擦除一致性提高一个等级,使得有效容错能力从检测到错误之前不可接受的约20K个周期,跃升到超过2.5M个周期,并且没有错误,也不需要补充的错误检测和纠正程序。
现代微控制器提供的可配置水平是把双刃剑。在本文的示例中,驱动电流可配置也许是产生过冲的根本原因。不过,能够减小驱动强度对于解决该问题也有效。
(参考原文:How system level noise in digital interfaces can lead to spurious errors in serial Flash memory)
责编:Yvonne Geng
本文为《电子工程专辑》2020年2月刊杂志文章,版权所有,禁止转载。点击申请免费杂志订阅