2002年春天,我的公司著手開發新一代稅控收款機(fiscalcashregister)大約一年的時間;所謂的稅控收款機需要經過營運所在地的***主管機關認證,并且符合相關的制造規格以及運作模式規范。通常主管機關會核發給收款機供貨商一張期限三年的銷售許可證,在期間內,供貨商不能對硬件或韌體進行任何修改,有任何改變都需要重新認證,這不僅花時間也會產生額外成本,所以我們需要確保我們的設計沒有潛在問題。
在某個長周末的前一天,每個人都很開心地期待放假;不過大約中午的時候,生產部門通知我們有一款收款機的主板在測試中出現問題,有超過一半的板子連初步基本測試都無法通過,也就是組裝后的第一道測試程序。
過去這種測試失敗案例通常是零件安裝的問題,例如在組裝過程中沒有裝好或是損壞;但是這次一切看來都很OK,我們的一個同事檢查了電路板上的零件,都沒有看到問題。于是我們的第二個想法是,測試機臺可能壞了;而我們注意到,有的時候同一塊電路板再試一次就會通過測試。在連結示波器并進行多次嘗試后,我們發現問題的根源在于一顆可程序化邏輯芯片(GAL16V8),它不能總是把關鍵訊號傳播至其他芯片。
乍看之下問題似乎很明顯──那顆通用邏輯數組(GAL)組件在焊接前沒有進行編程,或者是包含了錯誤的內容,因此無法正確運作。但是當我們把一些GAL組件拔下來檢查,發現它們的內容都是正確的,也都通過了測試向量程序,但是在電路板上就無法運作…是零件本身的問題?因為我們在其他不同型號的收款機上也用同樣的零件,所以我們決定去檢查其他的電路板,但只發現其中有一款出現相同的癥頭。
于是我們準備了一個特別版本的故障電路板──配備GAL組件插槽,然后收集不同版本的GAL芯片開始測試;在幾分鐘之后,我們發現只有一個最新版的GAL組件會導致問題──這幾乎是不可能的,一顆被妥善編程的GAL組件,在編程器中以特別準備的測試向量進行測試,有一半的時間卻無法順利運作?
分析了組件運作中的電路板配置,我們注意到該GAL組件只會在扮演地址譯碼器的功能時出問題;當GAL組件在電路板上的功能是多任務器與譯碼器時,問題就不存在。這個發現解釋了為何只有兩種采用了新款GAL組件的電路板有問題,但我們還是要找出電路板有時候無法通過測試的原因所在。
我們將電路板與測試機臺連結,在重復測試中觀察GAL組件的電源;事實證明,只有在重新開始測試前將GAL上的電源降到1V以下時(較舊版本的GAL組件是2V),電路板才能通過測試。這意味著收款機在這樣的條件下無法運作,也就是如果有人很快關閉收款機又很快打開,這種情況就可能會發生。在一個快速的開關機周期中,GAL組件的電壓不會降到1V之下,收款機就會掛點。
為了可靠地在生產測試中模擬這個問題,我們準備了一個特別的測試電路,并將我們對GAL行為的觀察告知制造廠;在此同時,我們還得準備好一個補救措施,把GAL組件「修理好」,不會再出現相同的故障。經過多次嘗試之后,我們發現只要(在通電后)改變GAL組件的輸入狀態,就足以讓它恢復正常運作。我們小修改了電路板;該GAL組件有一個閑置的接腳,我們將之與微控制器的重設訊號鏈接。生產部門現在應該可以繼續進行組裝了。
幾個禮拜之后,我們收到了GAL組件制造商對于該組件出現奇怪行為的可能原因;最新版本的GAL組件內部結構有過優化,再加上一些其他更動,改變了其內部電路的重設閾值,這可能是讓我們的電路板發生問題之緣由。我們從這件事學到的教訓是:單一零組件的改善,不一定會讓整個系統設計也跟著改善。
在另一篇文章中,我會再跟讀者們分享我們遇到的另一個收款機電路板問題,敬請期待!