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