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