【楼主按曰】这段文字,故事虽未见新颖,但词汇覆盖广泛,可做台版术语阅读材料之用。
這個故事要講的是一個類比工程師與一個數位工程師攜手合作,利用各自的專長技術,出人意料地解決了他們完全不熟悉的一套系統的問題。
話說我們公司的業務部門曾經代表工程部門接下一個挑戰:他們承諾某個客戶,表示我們能夠修理好一套電信產品,但其實那種東西我們以前從沒見過,所以也沒有測試工具、更別說它的架構圖(而原廠也已經停止支援該產品)。
這時候工程部門只好再一次使出渾身解數,力求達成使命;於是我的辦公室出現了大約15片可熱插拔背板的板子,準備進行初步評估以及探索其內部運作。這些板子有專屬的SIMM直插式記憶體模組,其中有幾個竟然已經壞了;暫時用其他板卡上、有明顯煙薰損傷的記憶體模組來替代,我們讓它們平躺在工作檯上並接上電源,成功讓它們起死回生(但是我們沒有測試機箱可用!),然後開機並能透過RS232連接埠溝通。
那些記憶體模組內含4顆SRAM以及4顆快閃記憶體,每顆記憶體晶片分享一個8位元頻寬的資料匯流排,每一對SRAM能與所選擇的相同晶片一起運作。我跟老闆說,我們可以為待測記憶體模組打造小型測試夾具,進行SRAM測試,或是在有必要時重新編程快閃記憶體。
於是坐在我距離我三格座位的一個數位/軟體工程師同事,被指派跟我一起執行這個案子;他之前設計過一款使用表面黏著 PIC微控制器的PCB,能用以作為我們目前或未來所需測試夾具的通用I/O。想不到它剛好有足夠的I/O線路能處理待測記憶體模組的位置與資料匯流排,而且只要我將4個獨立的待測資料匯流排在夾具上綁成兩兩成對,就還會有兩道備用線路,因此我們決定就使用它了。
我訂購了必要的SIMM連接器,一片電鍍通孔麵包板(plated-through-hole protoboard),還有一些排線(ribbon cable)以及IDC插座以連結PIC電路板;間距為.05吋的72接腳SIMM連接器有點惱人,因為麵包板就必須擁有相同的間距;其微小的.025吋直徑孔洞無法容納.025吋平方的針腳,所以無法進行繞線(現在我知道英語諺語“Can't fit a square peg into a round hole--格格不入”的由來了!)。
我必須直接把排線焊在麵包板上,並串連一條短的30AWG線到SIMM連接器;只要絞纏的排線沒有鍍錫過度(overly tinned,鍍錫是為了讓線路能絞在一起),它們實際上能剛好穿過麵包板的孔洞。
另一個惱人的狀況是SIMM連接器有塑膠做的固定片(retaining tab),會因為將記憶體模組重複插入而快速穿出;製造商的用意可能是因為通常SIMM只會在產品生命週期中替換一次,但我們是為了要測試記憶體模組、得重複插拔。
幸運的是,因為預料到最後會需要方便替換,我為SIMM連接器在麵包板上使用了插座式接腳條(socket pin strips);隨後我發現一種連接器有金屬的固定片,這種特殊規格並沒有顯示在供應商的線上零件說明中,我得從眾多機構圖片中自己去找。
夾具的第一次測試很順利,我同事編寫了一套walking-ones記憶體測試程式,能立即在數個待測電路板上發現損壞的SRAM晶片;我們將之替換然後重新啟動,但一直出現令人不安的「RAM損壞」訊息。因為可用性,我們用12nec的SRAM取代原本20 nsec規格SRAM,速度應該不是問題….嗯…所以可能我們需要改善測試演算法。
然後我們鼓起勇氣從良好記憶體模組的快閃記憶體上,複製了大約五個不同版本的韌體,並嘗試把新韌體重寫入模組中;一開始完成了半開機(semi-booted),卻顯示「缺少應用程式仔入器(application loader)」的訊息。而重載韌體之後,我們甚至無法透過RS232連接埠與之溝通;不知為何,應是「已知為良好」的韌體搞砸了一切。而且我同事確認過,在良好與損壞模組中的韌體是一模一樣的,那為何一個能開機一個不能?是速度問題嗎?
我同事繼續寫他的程式,並進行了walking-zeros測試;但另一件奇怪的事發生了,在數個已知良好的記憶體模組上,資料匯流排綁在一起的兩顆SRAM因為同樣情況發生故障──當寫入7F代碼,回讀出來的卻是FF;而且只有一對SRAM發生這種故障,另外一對SRAM一直都是正常運作。
難道我連錯了夾具上的線嗎?我們用示波器測試的結果證實還真的是這樣,當我同事寫入7F代碼,待測SRAM與夾具傳回的訊息也是一樣;顯然他的PIC微控制器把明確的邏輯0讀成了邏輯1,但只在該資料匯流排的位元7上。不過walking one測試成功了,位元7在測試中被正確讀取為邏輯0。
因為我對我同事的PCB佈線以及PIC晶片不熟,我請他把他的KiCAD板佈線圖檔寄給我;我已經知道那裡沒有電源/接地平面(power/ground plane),但我也沒料到看見部分接地接腳的接點(connections),在它們應該要被全部集結在PIC晶片之下時,是用蜿蜒的繞行路線輸入以及輸出。
他部分的Vdd接點甚至沒有與Vdd的銅連線,但是依賴晶片內的接點;他的耦合電容距離1吋遠,添加2吋的走線電感(trace inductance);我在這裡嗅到類比問題,可能是源自於電源繞線。要找出導致某個問題的「元凶」,有個方法就是消滅它,於是我用了一個以前成功過的方法,就是添加電源平面以及更多的去耦,以下的圖片是我們找一位焊接專家所完成的作品:
兩個方塊是單面包銅的迷你電源平面,排列在其末端的去耦0805晶片電容尺寸與以AC耦合的電源平面相當;PIC微控制器這下子不能抱怨微弱的電力侵蝕繞線,所有的電源與接地腳位現在都綁一起了
很遺憾,我的方法沒有成功,不過也去除了電源的嫌疑;我仍覺得是類比問題。在我們執行一些測試,想看看是否是其他位元組模式(byte patterns)導致位元7在實際上是0時被錯誤讀取為1時,我的懷疑被進一步證實了。
原來確實有很多位元模式會這樣,如果僅有3個低階位元(lower-order bit)是代表1,PIC晶片會在位元7實際上是0的時候把它讀成1。這對低階位元來說似乎無關緊要,只會讓3個以上的集(set)變成1;但如果累積足夠數量,它們似乎會滲入位元7。這豈不是類比電壓總和(analog voltage summation)?
這讓我茅塞頓開;我同事的PIC微控制器以3.3V運作,我的記憶體模組則是以5V電源啟動;我同事之前跟我保證過,他的PIC輸入電壓可達5V耐受度(tolerant),規格表上也是這麼寫的。我仔細閱讀了規格表,第一頁就寫著「5.5V輸入容忍度(僅數位接腳)」,因此如果輸入是被配置為數位,應該就是5V耐受度,沒錯吧?
而在規格表中的某一頁又寫得更詳細:所有輸入能被配置為類比或數位,並非可達5V耐受度;它們有最高到3.3V Vdd的箝位二極體(clamp diode)。所有問題資料匯流排的8個位元,以及其他資料匯流排中的1個位元都是這種輸出;因此沒錯,這是個類比問題,5V是過度驅動輸入電壓以及規格表上的綴飾….搞清楚之後我發明了很多新的髒話。
這也解釋了我們覆寫的快閃記憶體不再啟動的原因,所有我們拷貝的韌體映像都變成垃圾;我得把焊槍再次加熱,進攻測試夾具,小心翼翼切斷排線加入幾個具備5V耐受度的74LVC245匯流排收發器。而我的PIC微控制器知識以及罵髒話的功力也在過程中精進不少。
解決問題之後,我們就能辨識損壞的SRAM元件並重寫損壞的快閃記憶體;在記憶體重寫之後,「RAM損壞」的訊息被「RAM良好」取代,先前可能是快閃記憶體登錄了過去的SRAM故障狀態。兩個工程師,一個專長數位一個專長類比,我們最後成功地達成了任務!
編譯:[url=mailto: judithcheng@globalsources.com]Judith Cheng[/url]
(參考原文: Engineers Solve Analog/Digital Problem, Invent Creative Expletives,by Glen Chenier;本文作者為業界工程師)
|