包括凌力爾特的電源系統管理(PSM)在內的所有PMBus應用,其基礎即是PMBus主控端(系統主端)能夠和匯流排上所有PMBus從屬端(PSM控制器、PSM管理器、PSM uModules微型模組、以及PMBus單片式元件)進行通訊。匯流排上的每個從屬端必須擁有一個獨一無二的位址,且該位址不能和其他裝置衝突。

此外,在一些大家較少關注的情況中,匯流排的主控端還必須能和PSM從屬端進行通訊,包括:位址探索(address discovery)、全域動作(global actions)、多相位電源軌(multiphase rails)、無效非揮發性記憶體(invalid NVM)、匯流排多工(bus MUXes)等。

裝置定址作業結合了基底暫存器和外部位址選取(ASEL)接腳,以及特殊的全域、電源軌、ARA、和其他特殊位址。

本文將介紹凌力爾特PSM系列元件底層的基本設計原則,並詳述產品系列之間的差異,以及實際範例和建議。另外還會討論包括無效非揮發性記憶體在內的特別案例。

理想的設計應該不僅是從第一天開始就順利運行,當發生各種事件時也能繼續運作。舉例來說,如果用LtpowerPlay程式將資料寫入NVM,卻在NVM寫入時遇到斷電,這個時候設計應該具備復原能力。此外如果選擇建置凌力爾特的Linduino參考程式碼裡面的「InFlight Update」線上更新,產品就能在現場進行復原程序,最後還能辨識出退化系統的各種徵狀並將其修復;一旦瞭解如何建置凌力爾特的PSM定址機制,就能快速設計各種可靠的系統。

PMBus運作原理

PMBus是一種串列通訊標準,本身是SMBus的延伸規格,SMBus則是類似I2C的標準。此標準使用SCL和SDA兩條開汲極線路,用來和匯流排上的主控端與從屬端進行通訊。

主控端是負責控制通訊與裝置,通常為微控制器或FPGA。從屬端則是被主控端控制的裝置,通常是小型IC,在本文中則是如LTC2977之電源供應管理器,或LTC3880這類的電源供應控制器。

一個系統可以擁有超過一個主控端,但在實務上相當少見。系統中經常會有多個從屬端。

即使系統中只有一個從屬端,主控端一次也只能用一個位址來和一個從屬端直接通訊。這意謂著每個從屬端必須有一個獨一無二的位址,系統才能正常運行。

凌力爾特的電源系統管理元件採用一個EEPROM搭配多個接腳上的暫存器來設定每個裝置(從屬端)的獨一位址。因此位址的一部分是確保萬一任何EEPROM沒有有效的資料,主控端還能修復系統,讓系統回復到每個裝置(從屬端)擁有獨一位址的狀態。

以下章節將詳細說明這些位址組態機制,包括如何選取、設計,以及修復位址。

基本PMBus定址

PMBus定址規則是由PMBus標準參照的SMBus標準所定義。SMBus定址規則和I2C標準相同。為方便清楚說明,本文的討論範圍僅限於SMBus標準。

SMBus 3.0標準文件內的圖29定義了ReadByte協定(如圖1所示),任何交易的位址都跟在開始位元(startbit,代號S)之後,最後的結尾則是收悉位元(Acknowledge bit,代號A)。S與A之間的內容為8位元,前7個位元是位址,另一個位元用來指明寫入(Wr)與讀取(Rd)。

20161102TA01P1
圖1 Read Byte協定(來源:SMBus 3.0標準,圖29)



7個位元意謂著有128種可能位址,本文無Wr/Rd位元的位址格式如下:

0x00至0x7F(7位元定址)

有時一些程式設計師喜歡用額外Wr/Rd位元外加一個0的格式來寫位址,格式如下:

0x00至0xFE(8位元定址)

這些位址都是偶數,像TotalPhase Beagle這類示波器與間諜工具,也使用和本文相同的格式,因此使用0x00至0x7F形式的位址也理所當然,我們也該照用。

但須注意當有工程師給您一個沒有指明格式的位址,該位址可能已左移一位,因此數值看起來會比實際值大一倍。

注意到ReadByte協定用到位址兩次,但在第二個位址後面有一個重複開始(repeated start bit,代號Sr);重複開始位元是所有讀取交易的一部分,在這個例子中,S和Sr必須使用相同的位址。

位址地圖

並非所有位址都可供PSM從屬端使用,因為SMBus標準有保留一些位址。SMBus 3.0規範中的附錄C內含一個預先分派位址的表格。我們不一定得要知道使用這些位址的用意,所以簡單的表格就已夠用。

表1顯示的SMBus位址地圖採用一種簡單的編碼機制,這種保守設計採用的位址在描述欄位(Description)中只有一個空白,這樣可避免用到所有保留位址和特殊位址。PSM設計可使用所有位址,並在位址欄位中接著一個空白,可能的例外情況則是配合PMBus3.1規格中分區作業所新增的0x28以及0x37兩個位址。

20161102TA01P1-1
表1 SMBus位址地圖採用一種簡單的編碼機制。



PSM全域位址

PSM使用一些額外的位址,無法分派給任何裝置,若是分派這些位址,即使元件不是PSM也可能造成系統層級的問題。

第一種特殊位址是全域位址,包括0x5A與0x5B,匯流排主控端會用這些位址一次和多個裝置進行通訊。0x5A這個沒有分頁的全域位址專供LTC388X系列使用,而0x5B這個分頁化全域位址則專供LTC388X PSM系列使用,同時也是供LTC297X系列元件使用的分頁式全域位址。

若PSM元件將其位址設定到這兩個全域位址,匯流排主控端就會向它發送指令,接著匯流排上所有PSM元件就會回應該指令。LtpowerPlay也可能展現出乎預料的行為。

第三個全域位址是0x7C。若LTC388X PSM系列元件的EEPROM出現CRC循環檢查碼錯誤,就會對這個位址做出回應。因此千萬注意不要使用這個位址。

其他全域位址

非PSM元件可能會用到許多全域位址,在指派PSM位址時必須避免使用這些位址。

˙電源軌位址(Rail Addresses) 有些PSM元件會有名為電源軌位址的特殊位址。有時一個電源軌位址會同時分派到多個元件或分頁,電源軌位址的主要功用是讓匯流排主控端用一個指令就能和電源軌上多個相位進行通訊。舉例來說,像是設定一個多相位電源軌的VOUT電壓。

電源軌位址是用一個名為MFR_RAIL_ADDRESS(0xFA)的暫存器進行設定,這個暫存器的預設值為0x80,用來關閉電源軌的定址作業。一旦把電源軌位址設定成任何其他數值,就能啟動電源軌定址。匯流排主控端將電源軌位址視為匯流排上的一個元件,即使它實際上不是一個獨立元件,因為匯流排主控端無法分辨兩者。

因此,電源軌位址是系統整體位址地圖的一部分,而且不能和其他位址衝突。

˙通道位址(Channel Addresses) 最後一個特殊位址是通道位址,系統會用一個名為MFR_CHANNEL_ADDRESS(0xD8)的暫存器來設定該位址。通道位址會把一個位址加到指向特定分頁的匯流排,因此當使用一個通道位址時就不須用到PAGE暫存器。

匯流排主控端會把通道位址視為匯流排上的另一個元件,而且它不能和其他位址衝突。

位址規劃與設定

位址規劃(address planning)相當簡單。製作一份試算表,列出所有元件以及其位址,包括使用以下所有種類的位址的元件:一般位址、全域位址、電源軌位址、通道位址、特殊位址(ARA)、非PSM位址。

除了全域位址外,所有位址不應重疊,當多個位址擁有共同的基底位址時,所有位址應該獨一無二且不能重複。

雖然LTC388XDC/DC控制器系列和LTC297X管理器系列兩者大部分類似,但位址分派的方式以及其行為之間仍有些微的差異。另外,兩個系列的內部也有些微的差異。

但其運行的原理相當類似,在探討特殊差異之前,所有元件都可視為大致相近。

對於所有PSM元件而言,匯流排上PSM元件的實際位址是結合一個名為基底位址(BASEADDRESS)的暫存器數值,加上連結暫存器之元件接腳所做的修正,該接腳名為位址選取接腳(Address Select Pins,ASEL pins)。

使用ASEL接腳取代預先編程元件有許多原因。第一,預先編程不僅耗費時間而且須承擔成本,而且業者通常不會想要對元件進行預先編程。此外許多元件還有組態接腳,用來設定輸出電壓,而且全程只須用到該接腳。第二,若元件出現CRC NVM錯誤,就會失去其位址,而且匯流排主控端沒有辦法和每個元件進行通訊藉以對它們重新編程。

因此,解決方法是用ASEL接腳加上基底位址。匯流排主控端可利用0x5B全域位址來號令所有元件通訊。若匯流排主控端能和所有元件通訊,就能設定BASE ADDRESS基底位址,因為所有PSM元件都支援MFR_I2C_BASE_ADDRESS暫存器。

匯流排主控端之後能強制所有元件讀取其位址接腳,之後所有元件就會分派到只有匯流排主控端才知道的獨特位址。當匯流排主控端能和每個元件單獨通訊,EEPROM就能重新編程。這代表本文中最需要記住的重點:匯流排上所有共用一個BASEADDRESS的元件增加必須擁有一個獨一無二的位址,而且必須用到其ASEL接腳並讀取其數值。

若依循這項規則,就能用LtpowerPlay、Linduino參考碼、或當發生NVM資料損毀時使用客製化韌體來修復系統。因此,要修復系統並不須解焊PSM元件。

CRC循環檢查碼不匹配

所有凌力爾特的PSM元件都有電子抹除式可複寫唯讀記憶體(EEPROM),它們可用來儲存各項設定,系統會根據這些設定來判斷輸出電壓、監視各種上限以及基礎作業。記憶體若出現任何錯誤,都可能導致承載資料損壞。凌力爾特的PSM元件所用到的EEPROM能保存資料長達10年。

但在EEPROM寫入資料時若出現出乎意料的系統狀況,諸如高溫或電源電壓急降就可能導致寫入作業失敗,進而讓EEPROM資料損毀。CRC檢查碼的目的是檢驗EEPROM內容是否正確。有效的CRC能確保元件運作安全無虞,而無效的CRC會中斷元件作業,然後運用PMBus ALERTB指令通知主端(host)。

PSM元件啟動時,首先會把EEPROM的內容傳送到隨機存取記憶體(RAM),因為RAM是元件的運行記憶體。進行這個步驟時,元件會計算RAM內容的CRC檢查碼,然後再和儲存在EEPROM中的CRC值進行比對。若兩個CRC值相符,元件就會啟動運行,若兩者不匹配,元件就會通報CRC錯誤,並維持在重設狀態。

連結所有PSM元件的GPIOB/FAULTB接腳,接著設定元件為共用錯誤以及禁止在出現這類錯誤進行作業,因為整個系統中任何錯誤都會產生CRC,這些CRC會導致系統無法向所有電源軌輸送訊息。這通常是最佳的系統設計,除非進行多重失效分析證明所有失效的組合安全無虞。

當所有電源軌關閉,分析作業就更加簡單,系統也變得更安全,因為任何失效都會造成所有電源軌完全關閉電源。

校正CRC不匹配

一般而言,CRC不匹配並不能透過人工校正。LTpowerPlay能透過其編程工具,讓使用者輕易校正CRC不匹配,而In Flight Update未來也能校正CRC不匹配。但瞭解它們如何校正CRC,有助於我們進一步瞭解定址機制。

校正CRC不匹配的第一步是分別存取出現CRC不匹配狀況的所有元件,這意謂發送PMBus指令以回復每個位址。系統會將一個MFR_I2C_BASE_ADDRESS指令發送到全域位址0x5B。接著再送出一連串指令,強制所有元件讀取其ASEL接腳。

注意:若能判斷元件目前位址,如LTC388X為0x7C,或是LTC297X的預設基底位址,就可利用CRC不匹配來鎖定特定元件。然而更簡單的作法是使用全域位址,因為它不會對其他元件造成損害。此外,若匯流排並沒有妥善規劃,且LTC297X停在PMBus的元件位址,這樣的鎖定可能會出現許多副作用。

第二個步驟是把資料傳送到元件。理論上而言,應用到元件支援的每個指令,但更有效率的方法是透過MFR_EE_DATA指令整批傳送資料。LTpowerPlay和In Flight Update都使用這個指令。

步驟一並不適用於規劃不善的定址設計,這類設計沒有用ASEL接腳來將所有元件設定成獨一無二的位址。若設定MFR_I2C_BASE_ADDRESS會造成超過一個PSM元件擁有相同位址,那麼就沒有辦法使用MFR_EE_DATA來修復單一元件,因為任何共用相同位址的元件都會被用相同資料進行編程。

匯流排分段(BUS SEGMENTATION)

切分PMBus有兩個主要理由:1.定址(Addressing);2.電容/速度。為定址之故切分匯流排,通常發生在超大型系統。

超大型系統的匯流排線路極長,因此當匯流排主控端的運作時脈達到400kHz時,就會出現許多電容問題,進而造成違反時序規範,或影響效能目標。

一般而言會用到LTC4306多工器。LTC4306的關鍵特色是它能同時連結多個獨立區段,或一次連結所有區段。在校正CRC不匹配時,通常讓匯流排主控端一次連結一個區段。在被韌體使用時,通常用來把所有區段連結到一個匯流排。當這些區段如同一個匯流排進行連結,所有位址都必須是獨一無二。

為方便說明,我們舉一個典型狀況為例,研究如何滿足校正流程,以及如何像單一匯流排運行。範例系統內含:4個區段(如圖2所示);每個區段內含16個LTC3880元件;一個LTC4306多工器。

20161102TA01P2
圖2 匯流排分段範例。



運用3支ASEL接腳將LTC4306位址設為0x50。它在0x5D上有一個全域Mass Write Address位址。LTC3880擁有0x5A與0x5B全域位址。在這個設計中針對4個區段使用4個基底位址:0x20、0x30、0x40、以及0x60。這是避開0x50到0x5F的位址區段,凌力爾特所有PSM元件都會將位址設定在這個範圍。

此外,大多數凌力爾特的I2C/SMBus元件都支援這個位址區段。而LTC4316 I2C元件則能輕易讓任何其他元件相容於這個位址區段。多相電源軌也可定址在0x5X範圍,或定址在低於0x10或高於0x6F的位址範圍。

韌體作業

機板管理控制器(Board Management Controller,BMC)可把3個LTC4306的暫存器設定為0xF0,就能讓輸入端PMBus連結到所有輸出端PMBus區段。

在這種狀態,匯流排上有64個元件其位址處在:0x20至0x2F、0x30至0x3F、0x40至0x4F,以及0x60至0x6F的區段。0x5A和0x5B全域位址可供全域作業使用。沒有CRC不匹配的狀況並正常運作的元件,都會回應0x7C位址。

系統編程

系統編程是指運用LtpowerPlay或InFlight Update對匯流排區段的進行初始編程。LTC4306會一次連結一個區段,分別將3號暫存器的數值設定為0x80、0x40、0x20,以及0x10。LtpowerPlay或In Flight Update會將LTC4306連結的區段進行編程。被連結的MFR_I2C_BASE_ADDRESS區段會透過0x5B全域位址進行設定。ASEL的接腳暫存器確保每個連結區段上的元件都擁有獨一無二的位址。

每個區段上各個元件的ASEL接腳暫存器都是相同,並選取0x00至0x0F的位址調整器(modifier)。一次連結一個區段,分別為每個區段設定MFR_I2C_BASE_ADDRESS,就能為所有64個元件設定獨一無二的元件位址。

注意,若元件使用2個ASEL接腳,則區段可能含有超過16個元件,這是因為2個ASEL接腳允許128個元件共用一個基底位址。

校正CRC不匹配

這個情況和系統編程相同。LTpowerPlay和In Flight Update處理編程流程的方法完全相同。在兩種狀況中,編程步驟都使用MFR_I2C_BASE_ADDRESS。之後再逐一連結每個區段,並對每個區段進行編程。

韌體作業與系統編程的互動

LTC4306預設所有區段都斷開連結。因此,若機板管理控制器用來對系統除錯步驟進行重開機,則會連結一個DC1613 PMBus-to-USB控制器,並運行LtpowerPlay,而DC1613則不會連結到匯流排上任何PSM元件。

有兩種方法可以確保韌體不會和LtpowerPlay互相干擾。第一種方法是為BMC建立除錯模式,像是BMC跳出重設狀態,並連結所有區段,然後再暫停。這種方法在系統開機與除錯時,讓LtpowerPlay能和整個匯流排互動。

當BMC暫停時,可防止和LtpowerPlay進行互動。即使LTpowerPlay可以是多重主控端狀態,許多指令仍須依賴PAGE才能進行互動。因此,暫停能避免韌體與LtpowerPlay進行容易出錯的遙測。

第二種方法是在除錯時讓BMC保持在重設狀態,並由LtpowerPlay控制MUX多工器。這通常是最安全的作法,因為當BMC從重設狀況跳出,像是關閉LtpowerPlay,它會把多工器設定到正確狀態,不論當前狀況為何。

當BMC與LTpowerPlay交替控制匯流排,主控端應假設多工器的狀態。每當進行重大作業,像是主控端跳出暫停狀態,它首先會把多工器設定為正確狀態。

總結

電源系統管理的位址規劃並不複雜,但須留意編程以及系統從CRC不匹配狀況復原等特別情況。而所有凌力爾特的PSM元件都完全相容。

所有PSM元件都結合了一個基底位址,並根據ASEL接腳連結的元件調整位址,建立一個獨一無二的位址。若在編程過程中斷電,所有PSM元件都可能遇到CRC不匹配的問題。設定BASE ADDRESS,然後重新編程EEPROM,接著重新啟動元件,如此即可完全修復系統。LTpowerPlay與In Flight Update會自動更新,應付適當定址計畫的校正作業。

位址規劃包含妥善分派BASEADDRESS位址以及ASEL接腳,以確保永遠不會出現兩個元件永久共用相同位址。使用2支ASEL接腳,或是運用LTC4306之I2C多工器來切分匯流排,就能設計出更大型的系統。位址規劃必須在電路板設計之前進行,因為ASEL接腳與匯流排分段會用到暫存器與接腳。