基于GUI 软件配置UCD3138 数字电源 PMBUS 命令
2013-07-01
作者:Neil Li, Sundy Xu
来源:China Telecom Application Team
摘要
可与数字电源UCD3138配套使用的Fusion Digital Power Designer软件拥有Graphical User Interface (GUI) 界面,用户可在其上编辑数据并通过对应的PMBUS 命令与UCD3138 的软件交互。在GUI 界面中,用户可以灵活的增加GUI 软件支持的PMBUS 命令,亦可以删除,因此大幅提高了GUI 的灵活性。本文通过两个实例,详细分析了如何增加和删除GUI 软件可以支持的PMBUS 命令。
1数字电源GUI软件及其配置功能
数字电源GUI 软件运行于用户计算机,可以借助PMBUS 总线与UCD3138 数字电源通信,完成配置、设计和监控等功能。用户可以灵活的在界面中添加PMBUS 命令支持的信息,亦可以在其中删除。
1.1数字电源GUI软件
图1 所示的是与UCD3138 数字电源芯片配套使用,可用来对基于UCD3138 数字电源进行配置,设计及监控的GUI 软件:Fusion Digital Power。该软件安装并运行于用户的计算机上,通过PMBUS 总线与UCD3138 的软件进行交互。
图1:数字电源GUI软件
该软件主要包含以下功能:
1)配置:通过PMBUS 命令对数字电源的参数进行配置,如输入电压的欠压保护点(对应的PMBUS 命令为VIN_ON 和VIN_OFF),输出电流的过流保护(对应的PMBUS 命令为IOUT_OC_FAULT_LIMIT)。
2)设计:主要是对数字电源的环路参数进行设计和模拟。
3)监控:可以实时监控输入电压,输入电流和温度等诸多信息。
4)状态:可以显示电源板输入和输出等状态,告知用户当前是否存在故障。
1.2 GUI软件的配置功能
图1 所示的是GUI 的配置界面,其显示的每一条信息都对应一条PMBUS 命令,可以在用户计算机与UCD3138 之间传递。例如制造商的位置信息(MFR_LOCATION ),对应的便是PMBUS 命令MFR_LOCATION (0x9C),借助PMBUS 总线GUI 软件可以将UCD3138 中存贮的信息读取并显示出来。用户也可以自行重新编辑该信息,新信息会传递到UCD3138 芯片中并进行存储。
在实际应用中,不同的用户会关注不同的参数信息。为提高灵活性,GUI 软件支持用户添加和删除PMBUS 命令支持的参数信息。下面将详细介绍如何在GUI 中进行相关操作。
2增加输出过流保护点信息
输出过流保护点对应的PMBUS 命令为IOUT_OC_FAULT_LIMIT,可以用来配置系统的输出过流保护点。本节详细介绍如何在GUI 中添加信息栏来接收用户的输入,同时修改UCD3138 的软件来对用户的输入信息进行处理并最终调整相应模拟比较器的阈值电压。
2.1解除对PMBUS命令的屏蔽
在UCD3138 软件中,定义了CMD_DCDC_NONPAGED 变量,保存了每一个PMBUS 命令的状态:用0和1 表征屏蔽还是未屏蔽,如下代码所示。而“ 输出过流保护点” 对应的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”中点击Isolated GUI Bitmask Generator Tool;
图2:运行Isolated GUI Bitmask Generator
2)如图3,在随后打开的界面中,勾选“PMBUS_CMD_IOUT_OC_FAULT_LIMIT”,即使能命令IOUT_OC_FAULT_LIMIT。此时界面右侧的数据会有变化,该PMBUS 对应的位由0 变为了1。
图3:勾选相应PMBUS命令并复制输数据
3)将图3 右侧红色图内的数据复制到UCD3138 的软件中,覆盖原来的CMD_DCDC_NONPAGED 变量。
2.2 GUI中增加新的信息栏
将上述新生成的软件编译后烧录到UCD3138 中,此时通过Fusion Digital Designer 与UCD3138 建立连接后,会发现,GUI 中新增了一条信息输入栏,见图
4 中的红色框
该信息栏的名称为“IOUT_OC_FAULT_LIMIT”,代码为0x46,上述为固定信息,是由GUI 软件自身设定,用户无法修改。后面的“Value/Edit”值则用来输入用户设定的过流保护点。
图4:GUI出现新增信息输入栏
2.3 UCD3138软件中的数据处理
截止到上节,用户可以在GUI 中新增一条信息栏并输入数据,然后通过对应的PMBUS 命令,将该数据传输到UCD3138 中。但为了使UCD3138 接收该数据并调整相应的模拟比较器阈值,还需要修改UCD3138 的软件。
1、定义变量和结构体
如下代码,定义了新的结构体变量PMBUS_DCDC_CONFIG,包含成员iout_oc_fault_limit 和reserved。随后定义了该结构体类型的外部变量pmbus_dcdc_config 和pmbus_dcdc_config_translated,分别用于接收和保存GUI 传输到UCD3138 的数据和格式转换后的数据。
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、创建新的PMBUS读与写函数
由于从GUI 传输过来的数据的首个字节是对应的PMBUS 命令的代码,如0x46,并会存放在pmbus_buffer[0]中。因此,可以在函数pmbus_write_message()中创建新的case 语句,并返回一个新创建的函数pmbus_write_iout_oc_fault_limit(),该新函数用来处理接收到的数据。这样就实现了一旦UCD3138 接收到新的数据后,且该数据是用户重新编辑的“输出过流保护点”信息,则就会调用pmbus_write_iout_oc_fault_limit()函数进行处理。
switch (pmbus_buffer[0])
{
case 0x46:
return pmbus_write_iout_oc_fault_limit();
}
同时,也需要在函数pmbus_read_message() 中创建新的case 语句,并返回一个新创建的函数pmbus_read_iout_oc_fault_limit(),用来返回接收到的信息到GUI 中,以确保信息传输正确。这种读取后再返回验证的操作是PMBUS 协议的规定。
switch (pmbus_buffer[0])
{
case 0x46:
return pmbus_read_iout_oc_fault_limit();
}
3、数据处理函数的设计
◎接收数据处理函数pmbus_write_iout_oc_fault_limit()
该函数用来接收来自GUI 的数据,并将该数据的格式由Linear Data Format 转换为浮点型数据,最后强制转换为整数型赋给模拟比较器。关键代码分析如下:
上文提到,来自GUI 的数据的首字节是对应的PMBUS 命令代码。随后的两个字节便是Linear Data 格式的数据。将该数据保存在pmbus_dcdc_config 结构体的iout_oc_fault_limit 成员中,如下代码所示。
Pmbus_dcdc_config[0].iout_oc_fault_limit = pmbus_buffer[1] + (pmbus_buffer[2] << 8);
下面代码是调用格式转换函数linear11_to_float(),将上面接收到的数据转换为浮点型数据。
local_variable = linear11_to_float(pmbus_dcdc_config[0].iout_oc_fault_limit);
由于转换后的浮点型数据与最终需要赋给模拟比较器阈值的数据存在一定的比例,需要一个转换系数(scaler)。缩放后存放在pmbus_dcdc_config_tanslated 结构体的iout_oc_fault_limit 成员中。
pmbus_dcdc_config_translated[0].iout_oc_fault_limit = (int)(local_variable*2.54);
最终该值赋给模拟比较器的阈值,用来做快速保护。
FaultMuxRegs.ACOMPCTRL0.bit.ACOMP_B_THRESH=pmbus_dcdc_config_translated[0].iout_oc_fault_limit;
◎返回数据处理函数pmbus_read_iout_oc_fault_limit
该函数用来返回UCD3138 软件接收的数据到GUI 中,以使GUI 将写入和读取的数据做比较(比较判断等操作在GUI 软件中完成),保证数据正确。该函数调用pmbus_read_two_byte_handler() 将保存在Pmbus_dcdc_config[0].iout_oc_fault_limit 的数据返回到GUI。关键代码如下:
pmbus_read_two_byte_handler(pmbus_dcdc_config[0].iout_oc_fault_limit);
而在pmbus_read_two_byte_handler()函数中的关键代码为:
pmbus_buffer[1] = value >> 8;
pmbus_buffer[0] = value & 0xff;
pmbus_buffer 字节中的数据会最终上传到GUI 软件中。
4、数据转换函数的设计
◎Linear Data Format 数据格式
上文提到,来自GUI 的数据遵循PMBUS 协议,其格式为Linear Data Format。如图5,其低11 位为“尾数”,以补码形式保存;高5 位为“指数”,亦是以补码形式保存。该数据与实际数据的关系为:X=Y× 2N。
图5:PMBUS协议中的Linear Data Format
◎ARM 编译器中的浮点型数据
如图6,为ARM 编译器中对单精度浮点型数据的存储格式。其最高位为符号位,接下的8 位为指数,后面的23 位为尾数。在编译器中定义的浮点数据,将以该格式存储在硬件存储空间。
图6:ARM编译器中的浮点型数据格式
◎定义结构体和联合体
如下,定义了结构体FLOAT_ELEMENTS ,用以保存上文提到的浮点型数据。还定义了联合体FLOAT_OPEN,成员包括浮点型数据“all”和结构体类型数据“bit”,用以保存转换完毕的浮点型数据。
struct FLOAT_ELEMENTS {
Uint32 SIGN:1;
Uint32 EXPONENT:8;
Uint32 MANTISSA:23;
};
union FLOAT_OPEN {
float all;
struct FLOAT_ELEMENTS bit;
Uint32 word;
};
◎转换函数linear11_to_float()
该函数完成将来自GUI 的Linear Data Format 格式的数据转换为浮点型数据,并作为返回值返回。包含的关键代码如下。
定义变量,包括整型“mantissa”和“exponent”及结构体变量“final”。
int16 mantissa, exponent;
union FLOAT_OPEN final;
下面代码完成对输入参数的分析,并扩展到16 位。如果输入参数的尾数是负值,前5 位补1;如果是正值,前5 位补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),以使其数据长度符合单精度浮点型数据的长度,然后exponent 减去16,保证了原始数据的大小没有变化。
final.all = ((int32)mantissa) << 16; //set it up for minimum exponent.
exponent = (linear11 >> 11) - 16; //get exponent to match shifted value
下面代码首先判断单精度浮点型的指数是否为负。如果是负,则改写其为零,原因是对应的“输出过流保护点”不会出现负值;如果是正,则将指数信息放置在单精度浮点型数据的指数位置。
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 中就保存了转换后的浮点型数据,因此可以作为返回值返回。
return final.all;
2.4操作流程图
上述所有操作的流程图见图7。
图7:UCD3138接收信息流程图
3删除GUI信息栏
用户亦可以自行删除GUI 中多余的信息栏,操作过程主要包括对应PMBUS 命令的屏蔽,UCD3138 软件对应接收处理函数的删除等。如图8,以删除红色框内的信息栏为例。查看其对应的PMBUS 命令代码是0xFA,故首先在CMD_DCDC_NONPAGED 变量中屏蔽对应的位,可以使用Bit Mask Tool。
图8:删除GUI中的信息栏
此时重新编译软件并下载到UCD3138 后,GUI 中将不再会出现该信息栏,见图4。但UCD3138 软件中依然保留有对该PMBUS 命令的接收、转换和处理等函数,亦需要删除,在此不再赘述。
4小结
通过上文两个实例的分析可知,用户在GUI 软件中可以灵活的添加或删除PMBUS 命令对应的信息栏,提高了GUI 的灵活性。该操作主要包括PMBUS 命令的使能或屏蔽及UCD3138 软件添加或删除相应处理函数等两大部分。
5参考文献
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