在您的設計中添加第二個 MCU 的原因有很多,一旦您這樣做了,就有很多錯誤要避免。本文考慮了論點和選項,同時指出了沿途的陷阱。
鑒于當今可用的處理器種類繁多,您可能會發現通過在您的應用中引入第二個微控制器 (MCU) 或微處理器 (MPU) 來為應用程序添加新功能是一種更具成本效益的選擇,原因有很多。設計而不是試圖在單個更高性能的處理器上執行每項任務:
成本:與添加 8 位或 16 位 MCU 以承擔增加的負載相比,遷移到更高性能的系統 MPU 可能具有更高的成本差異。
電源:與其消耗電源讓主應用處理器不斷地自行開啟以執行相對簡單的操作,例如監控傳感器組或檢查是否已按下某個鍵,可以引入一個 8 位處理器來執行這些任務。 從本質上講,8 位處理器通過讓主處理器休眠并僅在需要其注意的事件發生時才喚醒它來充當“電源門”。這對于電阻式和表面電容式觸摸屏尤其有效。
確定性:涉及計算密集型任務(如動畫或音頻)的用戶界面 (UI) 功能可能會強調系統的實時確定性行為。第二個 MCU 可以承擔所有“實時”UI 職責,而不是冒著電機控制等關鍵任務的可靠性的風險。
多樣性:許多系統都可以從模塊化設計中受益。例如,可以使用不同的處理器來實現顯示模塊,以提供額外的圖形或流式視頻功能。通過采用模塊化方法,無需更改主要應用程序代碼即可向系統添加新功能或支持不同的模型。
簡單:一條產品線可以提供多種選擇。例如,一個產品可能有四個屏幕、三個鍵盤和三個連接選項。當使用單個處理器時,設計團隊必須為每個可能的變體(4x3x3=36 個不同的變體)維護、測試和驗證單獨的代碼版本。使用輔助處理器實現新功能時,只需對每個選項(4+3+3=10)進行維護。請注意,使用第一個選項時,需要使用每個變體對整個系統進行測試和驗證,這是一個復雜且耗時的過程。使用第二個選項時,主應用程序代碼只需要驗證一次。每個選項都可以單獨驗證,并且復雜性大大降低。
I/O 保護:一個 MCU 可以通過響應多個地址在一個接口上看起來是多個設備。例如,主應用處理器可以發出命令打開風扇,該命令被用作虛擬集線器的 MCU 攔截。這是一種在主應用處理器上節省 I/O 的有效方法,因為只需一個通信外圍設備即可讀取和控制多個設備。
認證:更改用戶界面或在主系統中引入新的界面(如 Wi-Fi)需要對某些市場的整個設計進行重新認證。將這些功能作為具有單獨處理器的附加模塊來實施,可簡化重新認證過程,顯著加快開發和上市時間。
UART、I 2 C 和 SPI
有許多選項可用于互連處理器。用于此目的的最基本接口是通用異步收發器 (UART)、內部集成電路 (I 2 C) 和串行外設接口 (SPI)。今天,許多處理器為這些接口中的一個或多個提供硬件和軟件支持。例如,意法半導體的 STM32 Cortex-M3 32 位處理器和 8 位STM8L MCU 支持所有這三種。或者,賽普拉斯的PSoC可編程片上系統處理器系列具有模擬和數字模塊,可配置為提供每個接口的多個實例,允許根據不同目標市場的需要更改接口組合。問題變成了您需要多少接口。
UART 的運行速度高達 250 kbps,而 I 2 C 的運行速度為 100 至 400 kbps。提供自己的時鐘的 SPI 可以以超過 1 Mbps 的速度運行。UART 鏈接通常可以使用基于中斷的驅動程序在軟件中實現,只要驅動程序不會根據應用程序的需要在處理器上施加過多的負載或延遲。一個我2C 主機通常可以用軟件實現,但由于涉及的數據速率,從機需要用硬件實現。SPI 還需要基于硬件。多主機系統也需要基于硬件。
除了數據速率之外,每個接口都提供了可能使其更適合特定應用的特定功能。UART 實現起來非常簡單,并且是全雙工的。我2C 語言很受歡迎,因為它只需要兩條線,可以有一個簡單的主控,并提供各種高級選項,包括支持尋址、多主控、廣播和時鐘延長。例如,時鐘延長允許 I2C 從機在處理接收到的數據時保持時鐘并停止數據流,從而防止潛在的溢出問題。相比之下,SPI 從設備受 SPI 主設備的支配。借助 I 2
C 和 SPI 的所有各種可用選項,許多芯片供應商提供示例代碼,您需要將其用作創建自己的代碼的模型。幸運的是,這些接口的驅動程序相當簡單——I 2C驅動可以是15行代碼,讓你在短時間內實現一個接口。但是,重要的是要確定需要支持哪些特性,正確實現它們,并且主從實現相同的特性。例如,在創建 I 2
C 驅動程序 時,您需要確定許多參數,例如 7 位或 11 位尋址、單主機或多主機(具有沖突檢測和恢復)、數據速率、是否使用 ACK/NAK 協議,支持地址保持,以及一系列其他選項。因此,任何兩個特定的 I 2 C 接口都可能非常不同。例如,開發人員遇到的一個常見問題是將筆記本電腦中使用的系統管理總線 (SMBus) 誤認為是一種簡單的 I2C總線。盡管 SMBus 在 I 2 C 接口上運行,但它通常使用固定電壓來表示高值和低值,而通用 I 2 C 接口使用的閾值通常基于 MCU 電源的百分比,因此表示潛在的差異兩者之間可能會產生難以調試的間歇性錯誤。
還要注意,UART,我2C和SPI只是物理接口。您仍然需要提供在物理層之上運行的邏輯協議。如果接口位于您設計的兩個 MCU 之間,則此協議可以是您想要的任何協議。如果 MCU 正在與串行 EEPROM 之類的設備通信,那么協議已經為您定義好了。因此,考慮到不同設備的數量及其可能與之通信的協議,主設備的驅動程序可能比從設備更復雜。此外,如果您的 master 不支持 slave 支持的所有協議功能(或者相反,嘗試使用 slave 不支持的功能),兼容性問題最終會浮出水面。
這些接口中的每一個的簡單性都是它的優點和缺點。您可以實現復雜的協議,這使接口更加高效和強大,但這也可能使調試更加困難。如果您不小心,簡單性為您提供了掛起系統所需的所有繩索。
例如,考慮一個接口正在控制一個模擬多路復用器的應用,該多路復用器需要在兩個音頻流之間平滑轉換。根據過渡的實施方式,可能會出現不受歡迎且可聽到的副作用;即,從柔和的流切換到響亮的流會導致響亮的“Pop!” 此外,命令延遲可能會影響轉換。理想情況下,您需要關閉音頻,切換流,然后重新運行音頻。但是,這對您的應用程序可能并不總是很方便。如果您同時使用多個電源,也會遇到同樣的困難。
為了促進初始驅動程序設計和驗證,許多供應商提供了強大的開發工具來實現和驗證接口功能。例如,微芯片提供 PICkit 串行分析器,可連接到您的系統和 PC,您可以使用該 PC 將鏈路配置為具有 UART、I 2 C 和 SPI 的任何標準接口選項的主設備或從設備。接口設計中的一個經典問題是需要預先存在的 master 來設計 slave 或預先存在的 slave 來設計 master。PICkit 通過提供可靠的另一半鏈路來進行設計,從而消除了這個問題,并且可以查看通過鏈路兩側發送的內容。PICkit 還能夠模擬各種 I 2 C 外設,如 ADC 和風扇控制器。
許多 MCU 供應商還提供各種功能齊全的開發套件和庫,以方便將 LCD 顯示器、觸摸屏或其他外圍設備等子系??統引入系統。例如,TI 提供了 RDKIDML-35 智能顯示模塊參考設計套件,可以相對輕松地將 3.5 英寸 QVGA 觸摸屏添加到通過 I 2 C 或 SPI 鏈路連接的系統。該套件還包括一個具有各種 GUI 功能的軟件庫,以加快用戶界面設計。
避免常見
的陷阱 最后,學習實現 UART、I 2 C 或 SPI 鏈接的最佳方法是自己動手。來自各種 MCU 制造商的專家建議了以下提示和技巧列表,以幫助您避免開發人員在實現他們的第一個處理器到處理器接口時經常犯的一些更常見的錯誤、誤解和失誤。
分階段引入復雜性:不要試圖從一開始就實現整個系統。從基本驅動程序開始并驗證其操作。然后添加協議層并再次驗證。介紹應用層。最后,運行整個系統及其所有各種并發任務和相互依賴關系。
設計您的系統以抽象功能:例如,使用通用 UI 界面允許主系統連接到機械按鈕、鍵盤或觸摸屏,而無需知道實際連接的是哪個。這種方法還允許您從根本上修改功能的執行方式,而無需對主系統進行任何代碼更改。考慮一臺具有單獨處理器處理硬幣和票據收集的自動售貨機。如果出現安全問題(即客戶想出了辦法欺騙機器),只需要重新設計用于監控收集的硬件和軟件來防止這種情況發生;系統的其余部分保持不變。
認識到外圍設備不同于處理器:連接到外圍設備與連接到另一個處理器不同。當您控制接口兩側的軟件時,您定義了兩側的接口細節和協議,因此可以保證兼容性。當您只設計接口的一側時,您需要設計接口以匹配您所連接的外圍設備的要求。這會引起許多潛在的問題。最常見的是外設的數據表不準確地描述了接口是如何實現的。為避免此問題,請驗證接口是如何實現的。還要注意各種接口選項,例如 11 位尋址、時鐘延長、
指定足夠的數據速率:確認接口的數據速率將滿足您當前和未來的數據需求。例如,與較大的顯示器或同等觸摸屏相比,小型顯示器需要較低的數據速率。如果您計劃在下一代設計中支持更大的顯示器,請保持您的界面選項開放。
計算超支:獲得 I 2C 或 SPI 連接起來非常簡單。您可能會遇到困難的地方是極端情況。例如,接口可以正常運行到某個頻率,此時它開始出現故障。問題可能來自系統中的太多噪音或數據溢出。數據溢出可能是本地問題;一系列特定類型的數據包可能需要更多的處理時間,導致處理器無法足夠快地清空緩沖區。更常見的是,溢出是由系統級問題引起的。例如,接口使用的 DMA 或 FIFO 可能是共享資源。根據系統正在處理的其他內容(即實時操作系統同時管理多個實時任務),延遲可能大于估計值,從而導致溢出。
首先驗證驅動程序:當出現問題時,可能很難確定錯誤的原因。在管理多個接口或實時任務的系統中尤其如此,因為系統中發生的其他事情可能會出現錯誤。通過在引入應用程序級功能之前驗證您的驅動程序,首先讓系統可靠地進行通信。這使您可以在以后的調試過程中更自信地消除驅動程序作為問題的根源。
使用代碼檢測進行調試:調試接口的兩側可能會很棘手,因為您正在使用多個處理器。雖然有調試多處理器系統的工具,但它們通常只允許您暫停鏈路的一側,從而難以利用傳統的調試技術。如果您在鏈路的兩側使用相同類型的處理器,您可以選擇讓一個處理器發送然后接收它自己的信號;這使您可以觀察鏈接的兩側并同時停止它們。如果您通過 JTAG 進行調試,您可以將兩個處理器連接到同一個 JTAG 鏈。
但是,一旦混合了架構,您可能會發現自己不得不一次調試鏈接的一側。為了簡化調試,通過創建一個允許您分階段測試基本功能的簡單存根驅動程序來限制鏈接另一端的復雜性。當您開始在鏈路的兩側使用實時系統時,您可以在鏈路的一側使用調試器并在鏈路的另一側使用代碼檢測技術來促進調試。鏈接的檢測端可以使用鏈接本身將狀態信息(例如變量值、接收到的數據和其他重要信息)發送回被調試的處理器。
利用你的調試器:一些工程師試圖在沒有調試器的情況下解決編程問題。當他們遇到錯誤時,他們會在代碼中嘗試不同的東西。然而,許多接口問題是在系統級別引起的,重寫接口驅動程序代碼不是解決方案。觀察這些系統級交互可能需要調試器。
檢查您的連接:在調試問題之前三重檢查您的連接。例如,一個容易犯的錯誤是連接接口的控制信號,但沒有共同接地。這樣做,您可能會發現自己花費數小時試圖解決一個不存在的問題。
記錄您的代碼:花時間編寫帶有完整注釋的干凈代碼。一個簡單的我2C 驅動程序可能只運行 15 行,并且似乎不需要文檔。但是,如果您是 I 2 C 的新手,您可能會錯過一個稍后會進一步了解的關鍵參數。完整的文檔為您提供了一個可靠的途徑來跟蹤您的思維變化,并且不會隨著應用程序復雜性的增加而迷失方向。
質疑規格表:由于其更大的靈活性,開發人員通常會遇到更多關于 I 2的問題C比用SPI。例如,從機可以通過降低時鐘、使用不同的尋址模式或以不同的方式實現啟動/停止序列來對主機產生不利影響。即使您連接到帶有詳細數據表的傳感器等外圍設備,也要小心。外圍設備可能不符合規范,因此如果您無法使接口正常工作,請不要立即假設您的驅動程序或 MCU 有故障。在這種情況下,您可能需要邏輯分析儀來定位問題的真正根源。
可以訪問邏輯分析儀:當您必須使用現有接口和協議連接到另一臺設備時,此工具特別有用。當連接到具有并行接口(如顯示器)的外圍設備時,它還可以加速開發。請務必檢查您的邏輯分析儀是否支持您正在使用的接口的適當解碼。自動解碼可以大大簡化調試,因為您可以將接口作為邏輯信號進行觀察,而不必自己將物理信號轉換為邏輯信號。
共存設計:在多主機系統中,有時您需要確保將數據發送到多個目的地,而不會冒著將總線放棄給另一個主機的風險。為此,您可以在每次傳輸之間使用重新啟動條件來保持對總線的控制。類似地,您可以使用重新啟動來改變數據的方向以從從機(即 EEPROM)接收數據,而無需松開總線。然而,以這種方式鎖定總線的主機可能會為其他執行同樣時間關鍵任務的主機產生延遲問題。謹慎使用此類技術并徹底測試主控器之間的相互作用,以確保它們彼此之間運行良好。
設計具有從/主功能的驅動程序:考慮讓你的奴隸成為主人。這在系統故障的情況下很有用,允許從機接管總線并啟動恢復機制,其延遲明顯低于從機必須等到它被尋址才能發出警報的情況。
將數據處理與數據傳輸分開:通常,收集的數據(即來自溫度傳感器的電壓)與需要傳輸的數據(即是否已超過溫度閾值)有很大不同。考慮一個觸摸屏模塊的接口,其中作為主系統的主系統請求當前手指位置數據。該模塊收集原始數據并將其存儲,直到主站請求位置數據。此時,模塊檢索原始數據,對其進行處理,然后傳輸。
這種特殊的架構可能會無意中造成溢出情況。考慮到為了保持響應能力,主系統可能會以比原始數據實際更改的頻率更高的頻率詢問信息。這意味著對于每個請求,模塊必須使用數據密集型算法重新計算位置數據,即使數據沒有改變。由于要多次計算原始數據,結果是巨大的開銷,可能會影響模塊的響應能力。
有幾種方法可以消除這種開銷。例如,可以在計算位置數據之前檢查原始數據是否已充分改變。如果原始數據沒有改變,則使用之前的計算。另一種方法是讓觸摸屏模塊充當鏈接上的主模塊,并在位置發生變化時發送更新。
保持接口簡單:如果只有一主一從,則無需實現地址沖突。當然,還要考慮未來的擴展以及部署的設備是否可能需要支持這樣的功能才能與未來幾代設備兼容。
借助當今的集成 MCU 和 MPU,再加上強大的開發工具,設計您的第一個處理器到處理器接口可以是一個簡單的過程,讓您可以快速地將第二個處理器引入現有設計。通過謹慎設計,您可以避免許多常見的陷阱,從而創建一個可靠且高效的界面,以滿足您當前和未來應用程序的性能需求。
評論
查看更多