微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 基于GUI软件配置UCD3138 数字电源PMBUS 命令

基于GUI软件配置UCD3138 数字电源PMBUS 命令

时间:05-25 来源:Neil Li, Sundy Xu China Telecom Application Team 点击:

包含成员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

5PMBUS 协议中的Linear Data Format

◎ ARM 编译器中的浮点型数据

如图6,为ARM 编译器中对单精度浮点型数据的存储格式。其最高位为符号位,接下的8 位为指数,后面的23 位为尾数。在编译器中定义的浮点数据,将以该格式存储在硬件存储空间。

6ARM 编译器中的浮点型数据格式

◎ 定义结构体和联合体

如下, 定义了结构体FLOAT_ELEMENTS , 用以保存上文提到的浮点型数据。还定义了联合体FLOAT_OPEN,成员包括浮点型数据"all"和结构体类型数据"bit",用以保存转换完毕的浮点型数据。

struct FLOAT_ELEMENTS {

Uint32 SIGN:1;

Uint32 EXPONENT:8;

Uint32 MANTISSA:23;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top