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