大概在我上次說過的那個故事發生後一年左右,我們接下另一款收銀機開發案;當時我們原本使用的微控制器(MCU,以下稱μC)是8051架構,但後來決定採用一個供應商經常鼓勵我們使用的、某個知名廠商推出的最新版本μC,因為該新版元件有許多新添加的功能,包括較高速度的核心、次級資料指標暫存器(second DPTR)、內建SPI介面、全多工UART、可程式化邏輯、內部快閃記憶體…等等。

我們想用這種新的μC以及其部份新功能來打造更先進版本的收銀機,其中一個就是內建的全多工UART,這能讓我們的收銀機與外部世界的通訊更快,而且相較於前一代機型可處理更大筆金額。利用該款μC的開發版,我們確定它可能達成我們的目標;在進行一些測試之後,我們開始設計主機板以及韌體的開發。

當我們幾乎完成新型收銀機的硬體與韌體最終版本設計,在性能測試中,我們有時候會發現到奇偶校驗錯誤(parity error)。一開始我們認為那是韌體的錯誤,該韌體完全是以組合語言程式碼撰寫,而且問題只會偶爾發生,特別是當我們在某人操作收銀機時傳送大量資料。我們無法分辨那是PC主機傳送了錯誤位元組(內含錯誤奇偶校驗位元),還是μC的UART就是無法收到錯誤的資料。

在經過幾天的測試後,我們幾乎可以確定問題來自於μC的UART。利用開發板,我們準備了一個專用程式從UART_A傳送連續資料至UART_B,然後讓UART_B將接收到的資料回傳,結果是延遲遞增。我們在示波器上觀察到,若UART_B在接收到一個奇偶校驗位元(parity bit)的同時也在寫入一個要傳送的奇偶校驗位元,當所收到的奇偶校驗位元與要傳送的奇偶校驗位元不同,μC的UART就會顯示奇偶校驗錯誤。

這清楚地告訴我們......繼續閱讀請連結EDN Taiwan網站