除錯是嵌入式設計的重要一環,而且必須要跨越硬體和軟體之間的鴻溝。在系統層級,嵌入式設計的功能性已越來越是透過韌體來定義,因此若要避免錯誤,需要具有不同專業領域的工程師在設計階段緊密合作。這也意味著,當不可避免地出現錯誤時,由於問題的真正來源不易判別,工程師難免會相互指責。

也許,正是軟體定義的硬體特性使現代的嵌入式設計成為一個有趣的專業。每顆新的微控制器(MCU)幾乎都提供了更高的整合度和更先進的功能,但是在對其進行編程之前,它們是完全無用武之地的。儘管高整合度和配置功能顯然已成為一個促成因素,使產品設計獲得了顯著進步,但它有時也可能會給工程師帶來無法預期的問題。

隨著MCU這類嵌入式元件提供的功能性和可配置特性正在不斷提高,但另一方面,它們也提供了許多並不是每個設計都需要的特性。通常,這些額外的特性可以被忽略不計,也很少會造成問題。

如同大多數工程師所理解的,這些特性通常是透過暫存器來控制的,而這些暫存器可以利用軟體來進行修改。因為它們在啟動時會有預設的設置,如果不去更動,就會依照預設值來繼續運作。在許多情況下,這應該沒有問題。但是,如果這些特性一直沒被使用,或是沒被測試過,那麼有可能會在某些出乎預料的情況下帶來影響。這些原本應該是完全沒有問題的特性,由於被輕忽不管,極有可能會在系統中產生錯誤。

即使在理想條件下,找出故障也是很困難、耗時且昂貴的工作。通常,故障是透過其造成的效應來辨識的,此方法可提供足夠的證據讓工程師找出故障原因。不論原因是來自硬體或軟體,或是無法明確判定來源,但重要的是,確實找到了錯誤,並進行了修正。

如果故障原因是未能正確初始化的低層級特性,那麼要發現它可能更加困難。要了解硬體平台的初始狀態會如何影響整個設計,需要對整體系統有更深入的了解,而且要仔細探究這些不易發現的問題是非常耗時耗力的。

例如,當在MCU上利用SPI匯流排來存取串列快閃記憶體時,這是許多嵌入式系統中常使用的簡單功能。如果在儲存值中偵測到錯誤,那就表示是記憶體,而非MCU,出現故障。以下是一個客戶碰到的實際案例:當從快閃記憶體的狀態暫存器連續讀取時,會顯示它偵測到讀/寫錯誤。可以理解的是,這通常會被認為是儲存元件發生了故障,因為根據理論,如果在狀態暫存器讀取之間出現了短暫的延遲,那麼偵測到的故障數量應該會減少。此外,重新啟動電源應該可以暫時清除此一故障。

客戶的工程師認為,這些現象表示串列記憶體發生了故障,即使它尚未超過預定的讀取周期限制,而且僅完成了約6萬次的寫入週期。當此串列快閃記憶體元件被送回Adesto進行進一步測試時,即使執行了超過30萬次的寫入週期,也沒有發現故障。

為了找出真正的故障,Adesto的工程師研究了客戶的應用程式並探測其SPI訊號。發現,看起來是儲存元件的故障實際上是系統的雜訊問題,而且很容易解決。雖然部分原因是由於MCU與快閃記憶體之間的PCB走線阻抗不匹配,但雜訊並不完全是由於不良的PCB設計或訊號完整性問題所造成的。

即使它看起來是PCB或電路設計問題,但雜訊實際上是SPI上訊號的過衝(overshoot)和下衝(undershoot),這是由於訊號的驅動強度過大所引起的。過衝足以破壞快閃記憶體元件的電荷泵並導致讀取和寫入錯誤。在某些情況下,SPI訊號的過衝和下衝也可以被視為訊號轉換(transition),可能會導致讀取或寫入錯誤。

20191114_Adesto_NT41P1

通過探測SPI信號,Adesto確定了導致SPI信號過衝和下衝雜訊噪聲的最重要因素是由過多的MCUGPIO驅動電平所引起的。

可能的解決方案包括在訊號走線上放置一個RC電路,以減慢訊號轉換的速度。但是,我們發現,此設計是採用較新款的MCU,而此MCU能透過韌體來修改I/O接腳的驅動強度。降低訊號的驅動強度就能夠消除SPI訊號線上的過衝和下衝,有效地消除系統級的雜訊來源。

對此,最重要的並不是快閃記憶體元件需盡力對抗大量的系統雜訊,而是MCU的可配置特性可能會造成的影響,而且容易被誤認為是設計中其他部分的故障。在此案例中,我們透過可靠的設計方法偵測到故障,並由Adesto工程師努力地解決了這個問題。

由此案例,我們學習到的經驗是,看起來像是硬體的問題,其實可以輕鬆地透過軟體來修正。一個看起來像是某個元件的故障,也可能追溯後發現是因為另一個元件的不正確配置所造成的。因此,硬體和軟體工程師之間,以及客戶和供應商之間的合作應該更為緊密,才能因應最新科技帶來的設計挑戰。即使預設值的原意是要協助客戶,但在實際使用時仍應確實驗證。這些預設值的最佳化,將有助於顯著提升系統的效能與可靠性。

(本文作者Paul Hill為Adesto產品行銷資深總監、Gordon MacNee為Adesto產品應用經理)