利用 Linduino PSM Sketchbook、一塊 Linduino 開發板和任選的 DC2294 屏蔽,可使針對 PSM 器件的程序代碼編寫變得簡單。軟件庫具有一個用于 SMBus 和 PMBus 的簡單 API。LTpowerPlay 仍可用于調試,而且可附接一個 Total Phase Beagle 或其他的 Spy Tool 以觀察總線上的通信量。
不管您是希望移植代碼還是僅僅希望了解 PMBus 的工作原理,Linduino 都是啟動開發工作的一種絕佳的方法。一旦您加快了學習曲線,并了解了 PSM 編程的基礎知識,就能提升自己的工作進度并充滿信心地使用其他工具。
引言
大多數電源系統管理設計都遵循一種“設定后便不需再過問”的模型。電源系統管理 (PSM) 器件的設置和調試利用 LTpowerPlay? 是簡單易行的,而且當與一個批量編程解決方案組合時則無需固件。不過,許多大型系統需要一個電路板管理控制器 (BMC),因而提出了這樣的問題:“固件能夠為 PSM 做什么呢?”
PSM 固件的基礎是 PMBus;PMBus 的基礎是 SMBus;而 SMBus 的基礎則是 I2C。構建一個利用 PSM 固件增加價值的 BMC 需要對每種協議有一定程度的了解,或者一個預先存在的軟件庫以使編程人員擺脫細節的束縛。
Linduino? 庫負責處理每個協議層,并提供一個應用程序接口 (API),從而使得 PSM 固件的編寫十分容易。Linduino PSM 并不是 BMC 的一種替代品,而是一組可兼容典型 BMC 固件的軟件庫和示例。
另外,Linduino 還可作為一款學習工具與 LTC 演示電路一起使用。許多 BMC 設計已經具有一個 SMBus API,所有這些需要的是快速學習 PMBus 的工作原理。工程師們把 Linduino 代碼片段復制 / 粘貼到現有的應用程序中并加以使用的現象是相當常見的。不過也可以實施 Linduino 層之一,然后重用整個軟件庫,包括:
● 器件和電源軌發現
● 命令 API
● 故障記錄解碼
● 系統內編程
本應用指南將陳述 Linduino 庫、電源系統管理編程、具演示電路的 Linduino PSM 的設置和使用、以及 PSM 調試方法。如需了解有關協議和一般編程問題的詳細信息,請查閱“應用指南 135” (Applicaton Note 135 - Implementing Robust PMBus System Software for the LTC3880) 以及針對 I2C / SMBus / PMBus 的業界標準。
LINDUINO PSM 硬件
Linduino PSM 硬件包括一個 Linduino (DC2026) 和一個屏蔽 (DC2294),以把 Linduino 的 I2C 引腳連接到一塊演示板或產品板的 PMBus / SMBus / I2CBus。
為獲得最佳的學習效果,可從一個 DC2026 (Linduino)、DC2294 (屏蔽)、DC1962 (Power Stick) 和一個 Total Phase Beagle (I2C 嗅探器) 著手。這能提供控制器 (LTC388X) 和管理器 (LTC297X) 的編程、調試和學習。
圖 1 (評估硬件) 示出了全部連接在一起的建議評估硬件。如欲使用該硬件,則利用兩根 USB 電纜把 Linduino 和 Beagle 連接至一臺計算機。假如您沒有用 USB 電纜連接 Beagle,那么就把 Beagle 帶狀電纜從 DC2294 斷接,以避免干擾往來于它和 DC1962 之間的 PMBus 通信。
圖1:評估硬件
如果連接至一個系統板,則 DC2086 可在大多數情況下工作。
圖2:系統硬件
DC2086 將接受一個從 DC2294 引出的連接,并支持 12 針帶狀電纜、14 針帶狀電纜和 4 針電纜。另外,DC2086 還支持一個外部電源輸入,該輸入用于功率需求量高于 Linduino 所能提供之水平的系統板。
LINDUINO PSM SKETCH
在了解 PMBus 庫的工作原理之前,快速瀏覽 DC1962 Sketch 將會弄清 Linduino PSM 的一般使用模型。此外,它還將演示編寫代碼程序有多么簡單易行,即使對于非編程人員也不例外。
為進一步跟上,需要進行兩項下載:Arduino 工具和 Linduino Sketchbook。Arduino 工具可從 www.arduino.cc 網站下載,而 Linduino Sketchbook 則可通過 www.linear.com.cn/linduino 下載。
Arduino 工具可在多種平臺上的運行。本應用指南的構建和行文采用的是在 64 位 Ubuntu 14 TLS 上運行的 Arduino 1.6.4。
我們開始吧:
第一步:配置
當首次運行 Arduino 軟件時,它將使用一個默認的 Sketchbook,而不是從 LTC 網站下載的 Linduino Sketchbook。
如欲變更 Linduino Sketchbook,則使用菜單欄上的 File | Preferences 選擇,如圖 3 (查找 Preferences 對話框) 所示。
圖3:查找 Preferences對話框
圖 4 (Preferences 對話框) 表明:Sketchbook Location 位于對話框的頂部。使用 Browse 按鈕,導航至從 www.linear.com.cn/linduino 下載的 LTSketchbook。另外,在編譯期間檢查 ON Display 行號和 Show 詳細輸出也是有幫助的。后一個設置在命令行上滾動編譯消息,它們在這里更容易看到。
圖4:Preferences 對話框
在設定路徑之后,必須關閉所有的 Arduino 窗口,而且必須重啟 Arduino 軟件。當重啟 Arduino 時,它重新掃描 Sketchbook 目錄并逐步建立 Arduino 菜單。如果未重啟 Arduino 軟件,則該菜單將不反映 LTSketchbook,而是指向前一個 Sketchbook。
第二步:加載您的第一個 Sketch:
通過仿效圖 5 (加載 hello_world) 來加載 hello_world Sketch。
圖5:加載 hello_world
在加載了 Sketch 之后,彈出一個具有該 Sketch 的窗口,如圖 6 (Sketch 窗口) 所示。
圖6:Sketch 窗口
第三步:編譯和運行
如圖 7 (Arduino 工具欄) 所示,通過撳按工具欄上的鉤形符號來編譯 Sketch。
圖7:Arduino 工具欄
指向右的箭頭將編譯 Sketch 并把經過編譯的 Sketch 裝入 Linduino 硬件。屏幕放大鏡顯示 Sketch 的輸出。把箭頭看作發送代碼至顯示控制臺,或編譯代碼并把代碼發送至 Linduino 硬件,這樣顯示控制臺就具有一些需要對話的東西。
注:Arduino 板類型應設定為 Arduino Uno,而且應選擇端口。見工具菜單 (Tools Menu)。
在加載了 Sketch 之后,撳按位于工具欄右邊的屏幕放大鏡以打開控制臺窗口。把行尾結束符號設定為 Carriage return,并將波特率設定為 115200,以與圖 8 (Arduino 命令窗口) 相匹配。
圖8:Arduino 命令窗口
如需與 Sketch 互動,則把光標置于頂部 (Send 按鈕的左邊) 的方框中,從菜單鍵入一個數字,然后撳按 Send 鈕或 。Sketch 接著將執行命令并隨后重新顯示菜單。
第四步:考察菜單項
圖 9 (Sketch 菜單) 示出了當撳按 1 以變更基本命令 (Basic Commands) 窗口、之后撳按 1 以讀取所有電壓 (Read All Voltages) 時會發生什么。DC1962 之所有電源軌的 VOUT 測量值被讀出并打印。
圖9:Sketch 菜單
在通過撳按位于左上角的 X 將控制臺關閉之前,Sketch 一直處于運行狀態。如果重新打開控制臺,則其將重啟 Sketch。
現在您可以考察其他的菜單選項,假如您熟悉 Beagle,則可排布一些走線并檢查總線事務。
第五步:代碼的修改
Sketch 具有兩個入口點。有一個setup() 函數 (其被調用一次),和一個 loop() 函數 (其在一個循環中被永久地調用)。這些是 Arduino 編碼環境的組成部分。如果您是一位有經驗的 C 語言編程人員,則很有可能感到疑惑:main() 在哪里? Arduino 庫具有一個調用 setup() 的預定義 main() 和一個無限循環調用 loop()。
菜單被編碼為 Sketch 內部的幫助函數,而且 loop() 調用主菜單。每個菜單利用一個情況語句提供支持,這里每種情況處理一個菜單號。
好了,有關編程人員的內容說的足夠了。修改應用程序就是簡單地使用提供的 API 來變更 Sketch 中的情況語句。Sketch 中發出 PMBus 命令的函數 (API) 來自一個單獨的庫,并且具有聽起來像您希望代碼程序執行之任務的簡單名稱。例如:
voltage = pmbus-》readVout (0x30, false);
意味著:使用 pmbus API,在地址 0x30 讀取輸出電壓 (無輪詢),并將它轉換成一個可變名稱電壓。
現在您應該做出少許變更了。例如,增添一個菜單項以讀取和打印輸出功率。如果您還沒有準備好,就繼續閱讀以了解有關編寫代碼程序的更多內容。假如您已準備就緒,那么這里是一個提示:
float readPout (uint8_t address, bool polling);
在 LTC3880 上試用它 (在 Power Stick 上的地址 0x30)。為證明它是有用的,可把電阻或一個電流負載添加至 Power Stick 上的通道 0,并驗證其與 Sketch 打印的內容相匹配。
LINDUINO PSM PMBus 庫
PMBus 庫存在于LTSketchbook/libraries/LT_PMBUS 目錄中的 LTSketchbook 樹之中。該軟件庫是分層的:從 TWI (兩線式接口) 開始,然后是 I2C、SMBus,最后是 PMBus。有一個用于在 L11/L16 (PMBus 格式) 和浮點之間來回轉換數值的數字轉換 API。最后,具有群組命令協議 (Group Command Protocol) 輔助、器件和電源軌發現、故障記錄解碼、乃至系統內編程功能。
每層是一個簡單的 C++ 類,類似于 Arduino 把一個類別用于串行 (Serial) 和其他 I/O 函數的方式。如果您的最終環境是 C 語言,請不要擔心。簡單的意思就是您可以使用 C++ 類 (沒有大量的內存開銷),或者也可以去除類包裝并非常容易地將其用作純 C 語言。C++ 包裝器就是簡化了應用程序代碼并使其對于非編程人員而言更加容易。
圖10:LT_PMBus 類示意圖
對于那些僅必須了解內部結構的編程人員來說,SMBus 位于一個層次體系中,這樣一來應用代碼就與接通和關斷 PEC 無關,并可幫助移植。LT_I2C.h、LT_SMBus.h 和 LT_PMBus.h 形成了 API 的層。如欲移植 Linduino PSM 庫,則可選擇任何 API 之一并在您的平臺上實施 (使用您自己的軟件庫)。最常用的端口重新實施 LT_SMBusBase 類,然后 PMBus 類正常工作,數學轉換正常運行,而且所有其他的函數和示例正常運作。
使用 PMBus 庫
這個庫的使用可以無需了解所有這些類成員;僅僅需要幾個導入和靜態變量,Sketch 就做好了動作準備。
一般來說 PMBus 庫是利用 Sketch 菜單添加的,如圖 11 (包括庫 [Include Library]) 中所示。但是最重要包括的則示于圖 12 (基礎包括 [Base Includes])。
圖11:包括庫 (Include Library)
圖12:基礎包括 (Base Includes)
一個 Sketch 具有至少兩個靜態變量,一個用于系統管理總線 (smbus),另一個用于電源管理總線 (pmbus),如圖 13 (靜態變量) 所示。Smbus 變量是 Pec 或 NoPec 版本。干凈層 (clean layers) 的一個優良的特點是編程人員可根據其項目的需要把應用代碼編寫為 SMBus 或 PMBus 代碼。利用 PMBus API 來編寫應用隱藏了命令代碼和數據格式化的細節,而利用 SMBus API 編寫應用則可實現對所有可能命令代碼的訪問以及對原始值的直接訪問。
圖13:靜態變量
一旦兩個變量進行了初始化,則可通過 smbus-》 使用整個 SMBus API,以及通過 pmbus-》 使用整個 PMBus API。可以在同一個應用中兼用這兩種 API。
LT_PMBusMath
LT_PMBusMath 類是一種高度優化的數字轉換庫,用于在 L11/L16 和浮點之間進行數值的來回轉換。浮點對于 PMBus 代碼是不需要的,而且有些終端用戶應用是僅利用整數編寫的,特別是在提前知道了電壓和電流值、或者依靠一個非常小微控制器進行浮點轉換過于緩慢的情況下。倘若固件不需要進行此類轉換,則它們仍然可被某個離線應用所使用,以產生用于該應用的整數。然而,當函數采用浮點時編寫代碼就容易得多了。
LT_I2C 庫
LT_I2C 庫不同于 LT_PMBus 庫中存在的 I2C 類。LT_PMBus 中的版本除了支持大塊操作之外還針對 PMBus 進行了字節次序優化。另外,LT_PMBus 庫中的 I2C 類還基于 Wire 庫,而且至其他 Arduino 板的可移植性更高。例如,它可在 Arduino Mega 2560 上工作。
所有的非 PSM Sketch 均采用 LT_I2C 庫。最好不要把 LT_I2C 庫用于 PSM/PMBus 器件,而且沒有必要這樣做。
編寫一個簡單的 Sketch
最佳的學習方法是從頭編寫代碼,本節所涉及的內容即在于此。如果您自己執行這些步驟 (一次一個) 并在逐步執行的過程中驗證結果,那么下面的示例將是最有幫助的。
該 Sketch 示例采用一個 DC1962 和在第一節中提到的另一個硬件。此示例接受 5 個簡單的命令:
1.打印電壓
2.裕度調節
3.接通 / 關斷
4.總線探測
5.復位
第一步:創建一個空白的 Sketch
如圖 14 (新的 Sketch) 所示,通過選擇 File|New 以創建一個新的 Sketch。然后,您將看到一個如圖 15 (空的 Sketch) 所示的空 Sketch。
圖14:新的 Sketch (New Sketch)
使用 File|Save As… 菜單,并為新的 Sketch 選擇一條路徑。要確保文件夾名稱和 Sketch 名稱匹配,如圖 16 (Save As.。..) 所示。該路徑必須在 LTSketchbook 的下方 (File|Preferences 對話框中的相同路徑) 以便其在 Sketchbook 菜單中顯現出來。
圖15:空的 Sketch (Empty Sketch)
圖16:Save As … (另存為 …)
第二步:添加包括
使用 Sketch|Include|Include Library 菜單,選擇下面的庫 (一次一個庫):
● Linduino
● LT_PMBUS
圖 17 (Includes) 示出了怎樣選擇 LT_PMBUS 庫。所有的庫都在同一個 Include Library 菜單中。
圖17:包括 (Includes)
在文件的頭一行上添加該包含語句:
#include
現在,添加用于地址和 SMBus/PMBus 對象的靜態變量。增添設置 (Setup) 代碼以預置變量和串行總線對象。利用 File|Save 保存該代碼。最后,撳按工具欄上的檢查按鈕以編譯代碼。
您的代碼應看似圖 18 (初始化代碼) 的樣子。
圖18:初始化代碼
第三步:設置菜單
一個菜單需要打印選擇,以及對用戶選擇的響應。
添加一個 print_prompt() 函數以打印一個提示,并從設置函數調用它以在 Sketch 運行時打印菜單提示。代碼應看起來像圖 19 (Prompt)。
保存和編譯以確保代碼沒有錯誤。
圖19:Prompt
第四步:添加菜單響應
當一個菜單選項被鍵入控制臺時,代碼程序必須讀取它并做出響應。
環路函數將處理用戶輸入。首先,它必須檢查串行總線是可用的。然后,它必須把輸入作為一個整數讀取并將之傳遞至一個開關語句。在開關語句的內部,它必須執行某些函數并隨后調用提示函數。用于每個命令的代碼將在開關語句每種情況的內部編寫,而提示函數將在之后調用。您的代碼框架應看上去與圖 20 (用戶輸入) 相似。
對它進行保存和編譯以確保其沒有錯誤。
第五步:讀取電壓
現在是編寫可做些有用工作的實際 PMBus 代碼的時候了。
圖 21 (讀取電壓) 示出了負責讀取所有電壓的代碼。代碼在情況 1 的內部示出。兩個變量保持電壓和頁面:一個用于電壓的 float,和一個用于頁面的 unit8_t,顯示在第 57~58 行。打印使用標準的 Arduino Serial.print… 函數。字符串周圍的 F() 把它們放入閃存中,這樣它們就不會使用寶貴的 RAM。對于每個器件,一個 for loop 通過調用 pmbus-》setPage(…) 的頁面進行檢索,隨后利用 pmbus-》readVout(…) 以讀取電壓。接著,代碼以十進制打印電壓 (采用 DEC 類型)。
您可以找到自己在 PMBus.h 文件中的 LT_PMBus 庫或 Doxigen 文檔里使用的所有 API 函數聲明。
圖20:用戶輸入
圖21:讀取電壓
第六步:裕度調節和接通/關斷
裕度調節代碼比電壓代碼簡單,因為操作是全局的,這意味著所有的器件能夠響應一個命令,而且不需要頁面寄存器。此外,沒有任何東西要打印。
圖 22 (裕度調節和接通/關斷) 示出了代碼。情況 4 是 No Margin 菜單選擇。采用 sequenceOnGlobal() 來結束裕度調節也許看起來很奇怪。在內部結構中用于這些操作的 PMMBus 命令是 OPERATION (0x01) 命令。
圖22:裕度調節和接通/關斷
取自 LTC3880 產品手冊的圖 23 (OPERATION 命令) 表明:沒有用于停止裕度調節的專用命令。裕度調節利用數值 0x80 (它意味著接通) 來關斷。這就是采用 pmbus-》sequenceOnGlobal() 來關斷裕度調節操作的原因。
表4:當 On-Off_Config_Use_PMBus 使能 Operation_Control 時的 OPERATION 命令細節寄存器 OPERATION 數據內容
圖23:OPERATION 命令
第七步:總線探測和復位
探測總線是 SMBus API 的一部分,畢竟并非所有的器件均為 PMBus。圖 24 (探測和復位) 示出:探測是對 smbus-》probe(0) 的調用。0 是它用以實施探測的命令,其為 PAGE (0x00) 命令。探測將測試所有的有效地址并回送一個所發現之器件的清單。它將找到所有能夠確定收到一個讀命令 0x00 的器件。
復位命令不太明顯。LTC388X 和 LTC297X 系列的復位方法不同。LTC388X 器件支持一個 MFR_RESET (0xFD) 命令,但是 LTC297X 器件則不支持。例如,在 LTC2977 上 0xFD 命令為 MFR_TEMPERATURE_MIN,而不是 MFR_RESET。使一個管理器復位的正確方法是從非易失性存儲器 (NVM) 恢復 RAM,因為在該變換之后器件復位。
然而,如欲使所有的器件同時復位,則使用群組命令協議。這把所有的操作編組為單個事務,在這里所有的命令均由 PSM 器件在 STOP 執行。
圖 24 (探測和復位) 中的 case 8 示出了怎樣設置一個群組協議事務。該事務受pmbus-》startGroupprotocol() 和 pmbus-》executeGroupProtocol() 調用的束縛。
圖24:探測和復位
第八步:測試
這是編譯和運行應用程序并確信其工作狀況一切正常的好時機。
假如應用程序運行,但并不打印合理的數據,那么您或許犯了某種錯誤。您可以使用下面的調試方法對其進行調試。或者,如果您沒有耐心,則可只進行復查:
● 地址
● 頁面
● 中斷語句
調試
有幾種調試一個 Linduino PSM 應用程序、或在這方面的任何固件應用程序的方法:
● 打印
● Spy 工具
● 調試器
本應用指南將不追求第三種選項。對于簡單的 Sketch 它通常不是必需的。如果您希望了解有關調試器的更多信息,則轉至 Arduino 網站論壇,看看其他人使用的是什么工具。
您已經看見了在上面的實例中使用的打印。您可通過添加更多的打印語句以進行調試。不過,應始終把字符串放在 F() 宏指令的內部,這樣 RAM 就不會被耗盡。當打印文本和數字時將其分成兩個調用,于是文本部分便在閃存中了。
PSM 庫采用這種方法。誤差 (比如:NACK 和 PEC 誤差) 在命令窗口中打印。因此,增添調試打印通常被限制在應用程序代碼。
您已經看見了采用 DEC 的打印。您也可以使用 HEX 和其他格式。查閱 Arduino 文檔以獲得有關格式化的更多幫助。
用于 PMBus 的最好調試器是 Spy 工具。Spy 工具之所以很好,原因是您能看見總線上的通信量,而且在需要幫助的時候您可以把一個跟蹤記錄與您的代碼一起發送給 LTC 應用技術工程師。
本應用指南將重點關注由與 Total Phase Beagle 對話的 Total Phase Data Center 應用程序產生的數據。在 Total Phase 的網站上提供了幫助您安裝 Data Center Application 的信息 (www.totalphase.com)。
啟動開發工作最簡單的方法是使用您剛剛創建的 Sketch 來跟蹤總線。將采用菜單選擇 3 (讀取電壓)。
圖 25 (Beagle跟蹤) 示出了數據。讓我們直接投入并對某些事務進行解密,并采用索引以記錄我們所在的位置。
在 Index #1 (I1) 和 index #6 (I6),有兩項寫字節事務。在 SMBus 中,這是寫字節協議 (Write Byte Protocol)。地址為 0x30,這是 LTC3880,如在代碼中可以看到的那樣。第一個字節是命令,其為 0x00,它是頁面 (PAGE) 命令。
圖25: Beagle 跟蹤
LTC3880 產品手冊中的表 2 示出了 PAGE 命令。這張表是對 Beagle 數據進行解碼的快速方法。請注意 Type 列顯示的是 R/W Byte。這意味著寄存器是讀 / 寫字節協議,因此兩個方向均得到支持。
圖26:PAGE 命令
回過頭去看一下 I1 和 I6,第二個字節是一個 0x00 和 0x01。代碼將把 PAGE 寄存器設定為 0 和 1。重新提及圖 21 (讀取電壓) 中的第 63 行,這是設定頁面的地方。我們應查看在緊接此之后的 I2 至 I5 上處于讀取之中的電壓。
我們看到:
寫 0x8B,讀 0x9A 0x0D
寫 0x20,讀 0x14
0x8B 是一個 READ_VOUT 命令。產品手冊中的表 2 顯示它是一個 R 字協議,而且采用的是 L16 格式。
0x20 是一個 VOUT_MODE 命令。產品手冊中的表 2 顯示它是一個 R 字節命令。
導致這些發生的 Linduino 調用示于圖 21 (讀取電壓) 中的第 64 行。
為什么單個函數調用發布了兩項事務? 為弄清原因,我們必須了解 API 背后的代碼,示于圖 27 (讀取 VOUT 代碼)。
圖27:讀取 VOUT 代碼
該代碼示出了一個后隨 smbus_.readByte(address, VOUT_MODE) 的 smbus_.readWord(address, READ_VOUT),而且 5 個位從模式抽取并被置入變量 exp。數學轉換然后采用指數 exp 實現從 L16 至浮點的轉換。
大致說來,用于讀取電壓的代碼是負責讀取用于把 L16 轉換為浮點之指數的通用代碼。LTC388X 和 LTC297X 器件采用了一個不同的指數。這就是存在兩項事務的原因。
注:代碼可利用指數的某種先驗知識來編寫,而且它的運行速度快一點。不過,通用代碼將具有較少的漏洞,且對于應用程序編寫者更加容易。當編寫自己的代碼時這是您必須做出的權衡。
在結束之前,讓我們看一個更加有趣的事務:復位。
看一下圖 28 (復位跟蹤),并需注意到有三個寫事務。在 S/P 列中,有兩個 S 和一個 SP。這意味著 I1 是一個啟動 (Start),I2 是一個重復啟動 (Repeated Start),I3 是一個重復啟動 (Repeated Start),之后是一個停止 (Stop)。此外,它們各自的地址是不同的:0x30、0x32 和 0x33。
圖28:復位跟蹤 (Reset Trace)
這是群組命令協議。所有的命令都將在 I3 的末端 (STOP) 處理。這與圖 24 (探測和復位) 中所示代碼的第 110~114 行相關聯。
如果您在自己的 Beagle 軌跡解碼上花些時間,就將對 PSM 器件的 PMBus 命令獲得更加完整的了解。另一方面,假如您的目標是使代碼正常運行,那么 PSM 庫非常愿意為您完成繁重的任務。
采用 LTpowerPlay 的高級調試
回到引言部分,那里說大多數系統是“設定后便不需再過問”的,而且有些系統具有一個 BMC。事實是那些具有一個 BMC 的系統把“設定后便不需再過問”與固件組合在一起。為什么讓一個 BMC 承擔了全部的設置責任呢? 這是因為把某種基本設置寫入 PSM 器件、然后僅將 BMC 固件用于添加的價值功能要容易得多。另外,這還造就了更加可靠的系統,因為大多數固件負責讀取遙測數據、裕度、并實施輕微的電壓變更,不需要讓它控制排序或始終是靜態的 PWM 頻率等關鍵功能。
由于 LTpowerPlay 是一款用于設計、調試和調通 PSM 系統的通用型工具,因此調試固件必須與物理時鐘和數據線上的另一個 PMBus 主控器進行競爭。
在進入兩個主控器的實際意義之前,最好是仔細研究一下當一根 PMBus 具有兩個主控器時會發生什么。PMBus 基于 SMBus,這包括多主控。
時鐘和數據線是開路漏極。這意味著任何器件 (主控器或受控器) 都能夠下拉一根線的電平,但不能上拉其電平。有這樣一條規則:當一個主控器未下拉數據線電平、并檢測到數據線為低電平時,則其認為有另一個主控器在把數據線拉至低電平,于是中止其自身的事務,從而允許另一個主控器繼續完成其事務。
該方法有時被稱為“位優勢仲裁”(bit dominance arbitration),這是一種指明“在數據中將一個零置為有效的主控器總是獲勝”的奇特說法。
Linduino 和 LTpowerPlay (DC1613) 多主控器,而且您也許認為一切都很完美了。不過,還有一項更為關鍵的考慮因素。
PMBus 定義了一個 PAGE 命令 (0x00),它像一個進入數據的地址。頁面像是通道一樣。例如,一個 LTC2977 能夠管理 8 個電源:它擁有 8 個通道,各由 PAGE 寄存器 / 命令進行尋址。
實際上這意味著:為讀取某種數值 (如電壓),它需要兩項事務:一項用于 PAGE,一項用于 READ_VOUT。如果兩個主控器同時試圖從同一個受控器讀取遙測數據,而且倘若一個主控器在另一個主控器的頁面命令和遙測命令之間插入了一個頁面命令,則它將讀取錯誤的頁面。
當 LTpowerPlay 啟動并運行時,它所做的首要之事是讀取遙測數據,這將保持其狀態顯示為最新,于是您就能查看輸出的曲線圖、故障和其他重要信息。猜猜固件通常做什么? 它讀取遙測數據!
更加糟糕的是,假設固件在啟動的時候執行一項 VID (電壓識別) 功能。假使固件由于 LTpowerPlay 修改了 PAGE 寄存器而把一個電壓值寫至錯誤的頁面,將會怎么樣呢? 系統有可能發生故障關斷,甚至更糟地造成某些東西受損。(幸運的是,VOUT_MAX 寄存器通常可防止系統損壞)
PAGE 命令的基本問題是 PMBus 規格中固有的。它并不是 LTC 電源系統管理器件所特有的,而且必須對其進行處置。
有兩種允許 LTpowerPlay 與固件共存并避免發生 PAGE 問題的基本方法。第一種方法就是簡單地不讓兩個主控器同時談話。第二種方法是在一個或另一個主控器上使用 PAGE PLUS 協議和其他的技巧。
我們避開 PAGE PLUS,因為它不是常用的。PAGE PLUS 提供了一種原子事務,其在一項事務中包括 PAGE 和 COMMAND。由于并非所有的器件都支持它,所以它通常僅在特殊場合中使用,因此本應用指南將不把重點放在 PAGE PLUS 和其他訣竅上。如果您沒有解決此問題的其他方法,則可閱讀 LTC PSM 產品手冊,或致電當地的應用技術工程師以尋求幫助。
更常見的是防止 LTpowerPlay 和固件同時與受控器對話。LTpowerPlay 具有一種非常簡單控制其運行的方法。圖 29 (LTpowerPlay 啟動 / 停止) 示出了遙測曲線圖,它在其工具欄上具有一個紅色方形按鈕。
圖29:LTpowerPlay 啟動 / 停止
當按下此按鈕時,它會停止總線上的所有遙測和所有的 LTpowerPlay 動作。然后,它變為一個綠色箭頭,如圖 30 (停止的 LTpowerPlay) 所示。
圖30:停止的 LTpowerPlay
不幸的是,固件并非總是具有一種用于實現總線靜噪的內置機制。LTC 簡單地建議利用一種內置靜噪機制、或者通過提供一個硬件總線開關 / 多工器 (MUX) 或跳線來設計新型固件。
一旦有了一種使總線主控器、LTpowerPlay 或固件靜噪的方法,那么調試只是一件根據需要在工具之間進行交替的簡單事。
總之,有兩種選擇:
1.一次只允許一個主控器在總線上進行對話
2.在 LTC 應用技術工程師的幫助之下粗略地了解 PAGE PLUS 及其他先進方法的細節
對于一款新設計而言,選項 1 始終是最佳的選擇。
責任編輯:gt
-
電源
+關注
關注
184文章
17704瀏覽量
249965 -
usb
+關注
關注
60文章
7936瀏覽量
264483 -
計算機
+關注
關注
19文章
7488瀏覽量
87854
發布評論請先 登錄
相關推薦
評論