基于GUI 軟件配置UCD3138 數(shù)字電源 PMBUS 命令
2013-07-01
作者:Neil Li, Sundy Xu
來源:China Telecom Application Team
摘要
可與數(shù)字電源UCD3138 配套使用的Fusion Digital Power Designer 軟件擁有Graphical User Interface (GUI) 界面,用戶可在其上編輯數(shù)據(jù)并通過對應(yīng)的PMBUS 命令與UCD3138 的軟件交互,。在GUI 界面中,,用戶可以靈活的增加GUI 軟件支持的PMBUS 命令,亦可以刪除,,因此大幅提高了GUI 的靈活性,。本文通過兩個(gè)實(shí)例,詳細(xì)分析了如何增加和刪除GUI 軟件可以支持的PMBUS 命令,。
1 數(shù)字電源GUI 軟件及其配置功能
數(shù)字電源GUI 軟件運(yùn)行于用戶計(jì)算機(jī),,可以借助PMBUS 總線與UCD3138 數(shù)字電源通信,完成配置,、設(shè)計(jì)和監(jiān)控等功能,。用戶可以靈活的在界面中添加PMBUS 命令支持的信息,亦可以在其中刪除,。
1.1 數(shù)字電源GUI 軟件
圖1 所示的是與UCD3138 數(shù)字電源芯片配套使用,,可用來對基于UCD3138 數(shù)字電源進(jìn)行配置,設(shè)計(jì)及監(jiān)控的GUI 軟件:Fusion Digital Power,。該軟件安裝并運(yùn)行于用戶的計(jì)算機(jī)上,,通過PMBUS 總線與UCD3138 的軟件進(jìn)行交互。
圖1:數(shù)字電源GUI 軟件
該軟件主要包含以下功能:
1)配置:通過PMBUS 命令對數(shù)字電源的參數(shù)進(jìn)行配置,,如輸入電壓的欠壓保護(hù)點(diǎn)(對應(yīng)的PMBUS 命令為VIN_ON 和VIN_OFF),,輸出電流的過流保護(hù)(對應(yīng)的PMBUS 命令為IOUT_OC_FAULT_LIMIT)。
2)設(shè)計(jì):主要是對數(shù)字電源的環(huán)路參數(shù)進(jìn)行設(shè)計(jì)和模擬,。
3)監(jiān)控:可以實(shí)時(shí)監(jiān)控輸入電壓,,輸入電流和溫度等諸多信息。
4)狀態(tài):可以顯示電源板輸入和輸出等狀態(tài),,告知用戶當(dāng)前是否存在故障,。
1.2 GUI 軟件的配置功能
圖1 所示的是GUI 的配置界面,其顯示的每一條信息都對應(yīng)一條PMBUS 命令,,可以在用戶計(jì)算機(jī)與UCD3138 之間傳遞,。例如制造商的位置信息(MFR_LOCATION ),,對應(yīng)的便是PMBUS 命令MFR_LOCATION (0x9C),借助PMBUS 總線GUI 軟件可以將UCD3138 中存貯的信息讀取并顯示出來,。用戶也可以自行重新編輯該信息,,新信息會(huì)傳遞到UCD3138 芯片中并進(jìn)行存儲(chǔ)。
在實(shí)際應(yīng)用中,,不同的用戶會(huì)關(guān)注不同的參數(shù)信息,。為提高靈活性,GUI 軟件支持用戶添加和刪除PMBUS 命令支持的參數(shù)信息,。下面將詳細(xì)介紹如何在GUI 中進(jìn)行相關(guān)操作,。
2 增加輸出過流保護(hù)點(diǎn)信息
輸出過流保護(hù)點(diǎn)對應(yīng)的PMBUS 命令為IOUT_OC_FAULT_LIMIT,可以用來配置系統(tǒng)的輸出過流保護(hù)點(diǎn),。本節(jié)詳細(xì)介紹如何在GUI 中添加信息欄來接收用戶的輸入,,同時(shí)修改UCD3138 的軟件來對用戶的輸入信息進(jìn)行處理并最終調(diào)整相應(yīng)模擬比較器的閾值電壓。
2.1 解除對PMBUS 命令的屏蔽
在UCD3138 軟件中,,定義了CMD_DCDC_NONPAGED 變量,,保存了每一個(gè)PMBUS 命令的狀態(tài):用0和1 表征屏蔽還是未屏蔽,如下代碼所示,。而“ 輸出過流保護(hù)點(diǎn)” 對應(yīng)的PMBUS 命令是IOUT_OC_FAULT_LIMIT (0x46),,需要首先在UCD3138 的軟件中去掉對該命令的屏蔽。
#define CMD_DCDC_NONPAGED \
{0x00, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x02, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0xFE, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0x00, \
0x00, 0x40, \
0x3D, 0x00, \
0x00, 0x14 \
}
Fusion Digital Designer 提供了Bitmask tool,,用來快速生成新的CMD_DCDC_NONPAGED 變量,。具體操作如下。
1) 如圖2,,在菜單“Tools”中點(diǎn)擊Isolated GUI Bitmask Generator Tool,;
圖2:運(yùn)行Isolated GUI Bitmask Generator
2)如圖3,在隨后打開的界面中,,勾選“PMBUS_CMD_IOUT_OC_FAULT_LIMIT”,,即使能命令I(lǐng)OUT_OC_FAULT_LIMIT。此時(shí)界面右側(cè)的數(shù)據(jù)會(huì)有變化,,該P(yáng)MBUS 對應(yīng)的位由0 變?yōu)榱?,。
圖3:勾選相應(yīng)PMBUS 命令并復(fù)制輸數(shù)據(jù)
3)將圖3 右側(cè)紅色圖內(nèi)的數(shù)據(jù)復(fù)制到UCD3138 的軟件中,覆蓋原來的CMD_DCDC_NONPAGED 變量,。
2.2 GUI 中增加新的信息欄
將上述新生成的軟件編譯后燒錄到UCD3138 中,,此時(shí)通過Fusion Digital Designer 與UCD3138 建立連接后,會(huì)發(fā)現(xiàn),GUI 中新增了一條信息輸入欄,,見圖
4 中的紅色框
該信息欄的名稱為“IOUT_OC_FAULT_LIMIT”,代碼為0x46,,上述為固定信息,,是由GUI 軟件自身設(shè)定,,用戶無法修改。后面的“Value/Edit”值則用來輸入用戶設(shè)定的過流保護(hù)點(diǎn),。
圖4:GUI 出現(xiàn)新增信息輸入欄
2.3 UCD3138 軟件中的數(shù)據(jù)處理
截止到上節(jié),,用戶可以在GUI 中新增一條信息欄并輸入數(shù)據(jù),然后通過對應(yīng)的PMBUS 命令,,將該數(shù)據(jù)傳輸?shù)経CD3138 中,。但為了使UCD3138 接收該數(shù)據(jù)并調(diào)整相應(yīng)的模擬比較器閾值,還需要修改UCD3138 的軟件,。
1,、定義變量和結(jié)構(gòu)體
如下代碼,定義了新的結(jié)構(gòu)體變量PMBUS_DCDC_CONFIG,,包含成員iout_oc_fault_limit 和reserved,。隨后定義了該結(jié)構(gòu)體類型的外部變量pmbus_dcdc_config 和pmbus_dcdc_config_translated,分別用于接收和保存GUI 傳輸?shù)経CD3138 的數(shù)據(jù)和格式轉(zhuǎn)換后的數(shù)據(jù),。
typedef struct
{
Uint16 iout_oc_fault_limit;
Uint16 reserved;
}PMBUS_DCDC_CONFIG; //must be even number of int16
EXTERN PMBUS_DCDC_CONFIG pmbus_dcdc_config[1];
EXTERN PMBUS_DCDC_CONFIG pmbus_dcdc_config_translated[1];
2,、創(chuàng)建新的PMBUS 讀與寫函數(shù)
由于從GUI 傳輸過來的數(shù)據(jù)的首個(gè)字節(jié)是對應(yīng)的PMBUS 命令的代碼,如0x46,,并會(huì)存放在pmbus_buffer[0]中,。因此,可以在函數(shù)pmbus_write_message()中創(chuàng)建新的case 語句,,并返回一個(gè)新創(chuàng)建的函數(shù)pmbus_write_iout_oc_fault_limit(),,該新函數(shù)用來處理接收到的數(shù)據(jù)。這樣就實(shí)現(xiàn)了一旦UCD3138 接收到新的數(shù)據(jù)后,,且該數(shù)據(jù)是用戶重新編輯的“輸出過流保護(hù)點(diǎn)”信息,,則就會(huì)調(diào)用pmbus_write_iout_oc_fault_limit()函數(shù)進(jìn)行處理。
switch (pmbus_buffer[0])
{
case 0x46:
return pmbus_write_iout_oc_fault_limit();
}
同時(shí),,也需要在函數(shù)pmbus_read_message() 中創(chuàng)建新的case 語句,,并返回一個(gè)新創(chuàng)建的函數(shù)pmbus_read_iout_oc_fault_limit(),用來返回接收到的信息到GUI 中,,以確保信息傳輸正確,。這種讀取后再返回驗(yàn)證的操作是PMBUS 協(xié)議的規(guī)定。
switch (pmbus_buffer[0])
{
case 0x46:
return pmbus_read_iout_oc_fault_limit();
}
3,、數(shù)據(jù)處理函數(shù)的設(shè)計(jì)
◎接收數(shù)據(jù)處理函數(shù)pmbus_write_iout_oc_fault_limit()
該函數(shù)用來接收來自GUI 的數(shù)據(jù),,并將該數(shù)據(jù)的格式由Linear Data Format 轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù),最后強(qiáng)制轉(zhuǎn)換為整數(shù)型賦給模擬比較器,。關(guān)鍵代碼分析如下:
上文提到,,來自GUI 的數(shù)據(jù)的首字節(jié)是對應(yīng)的PMBUS 命令代碼。隨后的兩個(gè)字節(jié)便是Linear Data 格式的數(shù)據(jù),。將該數(shù)據(jù)保存在pmbus_dcdc_config 結(jié)構(gòu)體的iout_oc_fault_limit 成員中,,如下代碼所示,。
Pmbus_dcdc_config[0].iout_oc_fault_limit = pmbus_buffer[1] + (pmbus_buffer[2] << 8);
下面代碼是調(diào)用格式轉(zhuǎn)換函數(shù)linear11_to_float(),將上面接收到的數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù),。
local_variable = linear11_to_float(pmbus_dcdc_config[0].iout_oc_fault_limit);
由于轉(zhuǎn)換后的浮點(diǎn)型數(shù)據(jù)與最終需要賦給模擬比較器閾值的數(shù)據(jù)存在一定的比例,,需要一個(gè)轉(zhuǎn)換系數(shù)(scaler)??s放后存放在pmbus_dcdc_config_tanslated 結(jié)構(gòu)體的iout_oc_fault_limit 成員中,。
pmbus_dcdc_config_translated[0].iout_oc_fault_limit = (int)(local_variable*2.54);
最終該值賦給模擬比較器的閾值,用來做快速保護(hù),。
FaultMuxRegs.ACOMPCTRL0.bit.ACOMP_B_THRESH=pmbus_dcdc_config_translated[0].iout_oc_fault_limit;
◎返回?cái)?shù)據(jù)處理函數(shù)pmbus_read_iout_oc_fault_limit
該函數(shù)用來返回UCD3138 軟件接收的數(shù)據(jù)到GUI 中,,以使GUI 將寫入和讀取的數(shù)據(jù)做比較(比較判斷等操作在GUI 軟件中完成),保證數(shù)據(jù)正確,。該函數(shù)調(diào)用pmbus_read_two_byte_handler() 將保存在Pmbus_dcdc_config[0].iout_oc_fault_limit 的數(shù)據(jù)返回到GUI,。關(guān)鍵代碼如下:
pmbus_read_two_byte_handler(pmbus_dcdc_config[0].iout_oc_fault_limit);
而在pmbus_read_two_byte_handler()函數(shù)中的關(guān)鍵代碼為:
pmbus_buffer[1] = value >> 8;
pmbus_buffer[0] = value & 0xff;
pmbus_buffer 字節(jié)中的數(shù)據(jù)會(huì)最終上傳到GUI 軟件中。
4,、數(shù)據(jù)轉(zhuǎn)換函數(shù)的設(shè)計(jì)
◎Linear Data Format 數(shù)據(jù)格式
上文提到,,來自GUI 的數(shù)據(jù)遵循PMBUS 協(xié)議,其格式為Linear Data Format,。如圖5,,其低11 位為“尾數(shù)”,以補(bǔ)碼形式保存,;高5 位為“指數(shù)”,,亦是以補(bǔ)碼形式保存。該數(shù)據(jù)與實(shí)際數(shù)據(jù)的關(guān)系為:X=Y× 2N ,。
圖5:PMBUS 協(xié)議中的Linear Data Format
◎ARM 編譯器中的浮點(diǎn)型數(shù)據(jù)
如圖6,,為ARM 編譯器中對單精度浮點(diǎn)型數(shù)據(jù)的存儲(chǔ)格式。其最高位為符號(hào)位,,接下的8 位為指數(shù),,后面的23 位為尾數(shù)。在編譯器中定義的浮點(diǎn)數(shù)據(jù),,將以該格式存儲(chǔ)在硬件存儲(chǔ)空間,。
圖6:ARM 編譯器中的浮點(diǎn)型數(shù)據(jù)格式
◎定義結(jié)構(gòu)體和聯(lián)合體
如下,定義了結(jié)構(gòu)體FLOAT_ELEMENTS ,,用以保存上文提到的浮點(diǎn)型數(shù)據(jù),。還定義了聯(lián)合體FLOAT_OPEN,成員包括浮點(diǎn)型數(shù)據(jù)“all”和結(jié)構(gòu)體類型數(shù)據(jù)“bit”,,用以保存轉(zhuǎn)換完畢的浮點(diǎn)型數(shù)據(jù),。
struct FLOAT_ELEMENTS {
Uint32 SIGN:1;
Uint32 EXPONENT:8;
Uint32 MANTISSA:23;
};
union FLOAT_OPEN {
float all;
struct FLOAT_ELEMENTS bit;
Uint32 word;
};
◎轉(zhuǎn)換函數(shù)linear11_to_float()
該函數(shù)完成將來自GUI 的Linear Data Format 格式的數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù),并作為返回值返回,。包含的關(guān)鍵代碼如下,。
定義變量,,包括整型“mantissa”和“exponent”及結(jié)構(gòu)體變量“final”,。
int16 mantissa, exponent;
union FLOAT_OPEN final;
下面代碼完成對輸入?yún)?shù)的分析,,并擴(kuò)展到16 位。如果輸入?yún)?shù)的尾數(shù)是負(fù)值,,前5 位補(bǔ)1,;如果是正值,前5 位補(bǔ)0,。
if(linear11 & 0x0400)// if mantissa is negative
{ mantissa = linear11 | 0xfc00; //put it in there at minimum mantissa }
else
{ mantissa = linear11 & 0x07FF; }
下面代碼首先是將mantissa 左移16 位(16+16=32),,以使其數(shù)據(jù)長度符合單精度浮點(diǎn)型數(shù)據(jù)的長度,然后exponent 減去16,,保證了原始數(shù)據(jù)的大小沒有變化,。
final.all = ((int32)mantissa) << 16; //set it up for minimum exponent.
exponent = (linear11 >> 11) - 16; //get exponent to match shifted value
下面代碼首先判斷單精度浮點(diǎn)型的指數(shù)是否為負(fù)。如果是負(fù),,則改寫其為零,,原因是對應(yīng)的“輸出過流保護(hù)點(diǎn)”不會(huì)出現(xiàn)負(fù)值;如果是正,,則將指數(shù)信息放置在單精度浮點(diǎn)型數(shù)據(jù)的指數(shù)位置,。
if((final.bit.EXPONENT + exponent) < 0)//if it's so low it will wrap
{ final.bit.EXPONENT = 0; }
else
{ final.bit.EXPONENT = final.bit.EXPONENT + exponent; }
上述操作完畢后,final.all 中就保存了轉(zhuǎn)換后的浮點(diǎn)型數(shù)據(jù),,因此可以作為返回值返回,。
return final.all;
2.4 操作流程圖
上述所有操作的流程圖見圖7。
圖7:UCD3138 接收信息流程圖
3 刪除GUI 信息欄
用戶亦可以自行刪除GUI 中多余的信息欄,,操作過程主要包括對應(yīng)PMBUS 命令的屏蔽,,UCD3138 軟件對應(yīng)接收處理函數(shù)的刪除等。如圖8,,以刪除紅色框內(nèi)的信息欄為例,。查看其對應(yīng)的PMBUS 命令代碼是0xFA,故首先在CMD_DCDC_NONPAGED 變量中屏蔽對應(yīng)的位,,可以使用Bit Mask Tool,。
圖8:刪除GUI 中的信息欄
此時(shí)重新編譯軟件并下載到UCD3138 后,GUI 中將不再會(huì)出現(xiàn)該信息欄,,見圖4,。但UCD3138 軟件中依然保留有對該P(yáng)MBUS 命令的接收、轉(zhuǎn)換和處理等函數(shù),,亦需要?jiǎng)h除,,在此不再贅述。
4 小結(jié)
通過上文兩個(gè)實(shí)例的分析可知,,用戶在GUI 軟件中可以靈活的添加或刪除PMBUS 命令對應(yīng)的信息欄,,提高了GUI 的靈活性,。該操作主要包括PMBUS 命令的使能或屏蔽及UCD3138 軟件添加或刪除相應(yīng)處理函數(shù)等兩大部分。
5 參考文獻(xiàn)
1. UCD3138 datasheet, Texas Instruments Inc., 2011
2. PMBus_Specification_Part_I_Rev_1, 2007
3. PMBus_Specification_Part_II_Rev_1, 2010
4. ARM Optimizing C/C++ Compiler, v4.9, User's Guide, Texas Instruments, 2011