2002年春天,我的公司着手开发新一代税控收款机(fiscal cash register)大约一年的时间;所谓的税控收款机需要经过营运所在地的***主管机关认证,并且符合相关的制造规格以及运作模式规范。通常主管机关会核发给收款机供货商一张期限三年的销售许可证,在期间内,供货商不能对硬件或韧体进行任何修改,有任何改变都需要重新认证,这不仅花时间也会产生额外成本,所以我们需要确保我们的设计没有潜在问题。
在某个长周末的前一天,每个人都很开心地期待放假;不过大约中午的时候,生产部门通知我们有一款收款机的主板在测试中出现问题,有超过一半的板子连初步基本测试都无法通过,也就是组装后的第一道测试程序。
过去这种测试失败案例通常是零件安装的问题,例如在组装过程中没有装好或是损坏;但是这次一切看来都很OK,我们的一个同事检查了电路板上的零件,都没有看到问题。于是我们的第二个想法是,测试机台可能坏了;而我们注意到,有的时候同一块电路板再试一次就会通过测试。在连结示波器并进行多次尝试后,我们发现问题的根源在于一颗可程序化逻辑芯片(GAL16V8),它不能总是把关键讯号传播至其他芯片。
乍看之下问题似乎很明显──那颗通用逻辑数组(GAL)组件在焊接前没有进行编程,或者是包含了错误的内容,因此无法正确运作。但是当我们把一些GAL组件拔下来检查,发现它们的内容都是正确的,也都通过了测试向量程序,但是在电路板上就无法运作…是零件本身的问题?因为我们在其他不同型号的收款机上也用同样的零件,所以我们决定去检查其他的电路板,但只发现其中有一款出现相同的症头。
于是我们准备了一个特别版本的故障电路板──配备GAL组件插槽,然后收集不同版本的GAL芯片开始测试;在几分钟之后,我们发现只有一个最新版的GAL组件会导致问题──这几乎是不可能的,一颗被妥善编程的GAL组件,在编程器中以特别准备的测试向量进行测试,有一半的时间却无法顺利运作?
分析了组件运作中的电路板配置,我们注意到该GAL组件只会在扮演地址译码器的功能时出问题;当GAL组件在电路板上的功能是多任务器与译码器时,问题就不存在。这个发现解释了为何只有两种采用了新款GAL组件的电路板有问题,但我们还是要找出电路板有时候无法通过测试的原因所在。
我们将电路板与测试机台连结,在重复测试中观察GAL组件的电源;事实证明,只有在重新开始测试前将GAL上的电源降到1V以下时(较旧版本的GAL组件是2V),电路板才能通过测试。这意味着收款机在这样的条件下无法运作,也就是如果有人很快关闭收款机又很快打开,这种情况就可能会发生。在一个快速的开关机周期中,GAL组件的电压不会降到1V之下,收款机就会挂点。
为了可靠地在生产测试中模拟这个问题,我们准备了一个特别的测试电路,并将我们对GAL行为的观察告知制造厂;在此同时,我们还得准备好一个补救措施,把GAL组件「修理好」,不会再出现相同的故障。经过多次尝试之后,我们发现只要(在通电后)改变GAL组件的输入状态,就足以让它恢复正常运作。我们小修改了电路板;该GAL组件有一个闲置的接脚,我们将之与微控制器的重设讯号链接。生产部门现在应该可以继续进行组装了。
几个礼拜之后,我们收到了GAL组件制造商对于该组件出现奇怪行为的可能原因;最新版本的GAL组件内部结构有过优化,再加上一些其他更动,改变了其内部电路的重设阈值,这可能是让我们的电路板发生问题之缘由。我们从这件事学到的教训是:单一零组件的改善,不一定会让整个系统设计也跟着改善。
在另一篇文章中,我会再跟读者们分享我们遇到的另一个收款机电路板问题,敬请期待!