refine transfer functions, write more config settings

This commit is contained in:
macphyter 2024-02-06 00:02:36 -07:00
parent 5a694e1d61
commit e9cbf90132
2 changed files with 215 additions and 124 deletions

View File

@ -29,7 +29,8 @@
static const char *TAG = "TPS546.c";
static uint8_t DEVICE_ID[] = {0x54, 0x49, 0x54, 0x6B, 0x24, 0x41};
static uint8_t DEVICE_ID1[] = {0x54, 0x49, 0x54, 0x6B, 0x24, 0x41};
static uint8_t DEVICE_ID2[] = {0x54, 0x49, 0x54, 0x6D, 0x24, 0x41};
static uint8_t MFR_ID[] = {'B', 'A', 'X'};
static uint8_t MFR_MODEL[] = {'H', 'E', 'X'};
static uint8_t MFR_REVISION[] = {0x00, 0x00, 0x01};
@ -196,9 +197,9 @@ static int slinear11_2_int(uint16_t value)
// check the first bit of the mantissa to see if its negative
if (value & 0x400) {
// mantissa is negative
mantissa = -1 * ((~value & 0x07FF) + 1);
mantissa = -1 * ((~value & 0x03FF) + 1);
} else {
mantissa = (value & 0x07FF);
mantissa = (value & 0x03FF);
}
// calculate result (mantissa * 2^exponent)
@ -207,65 +208,124 @@ static int slinear11_2_int(uint16_t value)
return (int)result;
}
/**
* @brief Convert an SLINEAR11 value into an int
*/
static float slinear11_2_float(uint16_t value)
{
int exponent, mantissa;
float result;
// First 5 bits is exponent in twos-complement
// check the first bit of the exponent to see if its negative
if (value & 0x8000) {
// exponent is negative
exponent = -1 * (((~value >> 11) & 0x001F) + 1);
} else {
exponent = (value >> 11);
}
// last 11 bits is the mantissa in twos-complement
// check the first bit of the mantissa to see if its negative
if (value & 0x400) {
// mantissa is negative
mantissa = -1 * ((~value & 0x03FF) + 1);
} else {
mantissa = (value & 0x03FF);
}
// calculate result (mantissa * 2^exponent)
result = mantissa * powf(2.0, exponent);
return result;
}
/**
* @brief Convert an int value into an SLINEAR11
*/
static uint16_t int_2_slinear11(int value)
{
float mantissa;
int exponent;
int mantissa;
int exponent = 0;
uint16_t result = 0;
int i;
mantissa = frexp(value, &exponent);
ESP_LOGI(TAG, "mantissa: %f, exponent: %d", mantissa, exponent);
result = (mantissa * 1024);
// int i;
// First see if the exponent is positive or negative
// if (value > 0) {
if (value >= 0) {
// exponent is positive
// } else {
// exponent is negative
// }
for (i=0; i<=15; i++) {
mantissa = value / powf(2.0, i);
if (mantissa < 1024) {
exponent = i;
break;
}
}
if (i == 16) {
ESP_LOGI(TAG, "Could not find a solution");
return 0;
}
} else {
// value is negative
ESP_LOGI(TAG, "No negative numbers at this time");
return 0;
}
result = ((exponent << 11) & 0xF800) + mantissa;
//ESP_LOGI(TAG, "mantissa: %d, exponent: %d", mantissa, exponent);
//ESP_LOGI(TAG, "result: %04x", result);
// First 5 bits is exponent in twos-complement
// check the first bit of the exponent to see if its negative
// if (value & 0x8000) {
// exponent is negative
// exponent = -1 * (((~value >> 11) & 0x001F) + 1);
// } else {
// exponent = (value >> 11);
// }
// last 11 bits is the mantissa in twos-complement
// check the first bit of the mantissa to see if its negative
// if (value & 0x400) {
// mantissa is negative
// mantissa = -1 * ((~value & 0x07FF) + 1);
// } else {
// mantissa = (value & 0x07FF);
// }
// calculate result (mantissa * 2^exponent)
// result = mantissa * powf(2.0, exponent);
return result;
}
/**
* @brief Convert a ULINEAR16 value into an int
* @brief Convert a float value into an SLINEAR11
*/
static uint16_t float_2_slinear11(float value)
{
int mantissa;
int exponent = 0;
uint16_t result = 0;
int i;
// First see if the exponent is positive or negative
if (value > 0) {
// exponent is negative
for (i=0; i<=15; i++) {
mantissa = value * powf(2.0, i);
if (mantissa >= 1024) {
exponent = i-1;
mantissa = value * powf(2.0, exponent);
break;
}
}
if (i == 16) {
ESP_LOGI(TAG, "Could not find a solution");
return 0;
}
} else {
// value is negative
ESP_LOGI(TAG, "No negative numbers at this time");
return 0;
}
result = (( (~exponent + 1) << 11) & 0xF800) + mantissa;
//ESP_LOGI(TAG, "mantissa: %d, exponent: -%d", mantissa, exponent);
//ESP_LOGI(TAG, "result: %04x", result);
return result;
}
/**
* @brief Convert a ULINEAR16 value into a float
* the exponent comes from the VOUT_MODE bits[4..0]
* stored in twos-complement
* The mantissa occupies the full 16-bits of the value
*/
static int ulinear16_2_int(uint16_t value)
static int ulinear16_2_float(uint16_t value)
{
float exponent;
int result;
uint8_t voutmode;
int exponent;
float result;
smb_read_byte(PMBUS_VOUT_MODE, &voutmode);
if (voutmode & 0x10) {
@ -275,21 +335,23 @@ static int ulinear16_2_int(uint16_t value)
exponent = (voutmode & 0x1F);
}
result = (value * powf(2.0, exponent)) * 1000;
//ESP_LOGI(TAG, "value: %04x", value);
//ESP_LOGI(TAG, "mantissa: %d, exponent: %d", value, exponent);
result = (value * powf(2.0, exponent));
return result;
}
/**
* @brief Convert an int value into a ULINEAR16
* @brief Convert a float value into a ULINEAR16
* the exponent comes from the VOUT_MODE bits[4..0]
* stored in twos-complement
* The mantissa occupies the full 16-bits of the result
**/
static uint16_t int_2_ulinear16(int value)
static uint16_t float_2_ulinear16(float value)
{
uint8_t voutmode;
float exponent;
int result;
uint16_t result;
smb_read_byte(PMBUS_VOUT_MODE, &voutmode);
if (voutmode & 0x10) {
@ -299,9 +361,8 @@ static uint16_t int_2_ulinear16(int value)
exponent = (voutmode & 0x1F);
}
ESP_LOGI(TAG, "Exp: %f", exponent);
result = (value / powf(2.0, exponent)) / 1000;
//result = (value * powf(2.0, exponent)) * 1000;
result = (value / powf(2.0, exponent));
ESP_LOGI(TAG, "result: %04x, exponent: %f", result, exponent);
return result;
}
@ -314,8 +375,10 @@ int TPS546_init(void)
uint8_t data[6];
uint8_t u8_value;
uint16_t u16_value;
int iout;
uint8_t mfr_revision[3];
float vin;
float iout;
float vout;
uint8_t read_mfr_revision[3];
int temp;
uint8_t comp_config[5];
@ -325,27 +388,28 @@ int TPS546_init(void)
smb_read_block(PMBUS_IC_DEVICE_ID, data, 6);
ESP_LOGI(TAG, "Device ID: %02x %02x %02x %02x %02x %02x", data[0], data[1],
data[2], data[3], data[4], data[5]);
if (memcmp(data, DEVICE_ID, 6) != 0)
if ( (memcmp(data, DEVICE_ID1, 6) != 0) && (memcmp(data, DEVICE_ID2, 6) != 0) )
{
ESP_LOGI(TAG, "ERROR- cannot find TPS546 regulator");
return -1;
}
/* Make sure power is turned off until commanded */
ESP_LOGI(TAG, "Setting power config");
ESP_LOGI(TAG, "Verifying power config");
u8_value = ON_OFF_CONFIG_CMD | ON_OFF_CONFIG_PU | ON_OFF_CONFIG_CP |
ON_OFF_CONFIG_POLARITY | ON_OFF_CONFIG_DELAY;
smb_write_byte(PMBUS_ON_OFF_CONFIG, u8_value);
/* Read version number and see if it matches */
TPS546_read_mfr_info(mfr_revision);
if (memcmp(mfr_revision, MFR_REVISION, 3) != 0) {
// If it doesn't match, then set the version and write all the registers
TPS546_read_mfr_info(read_mfr_revision);
if (memcmp(read_mfr_revision, MFR_REVISION, 3) != 0) {
uint8_t voutmode;
// If it doesn't match, then write all the registers and set new version number
ESP_LOGI(TAG, "--------------------------------");
ESP_LOGI(TAG, "Config version mismatch, writing new config values");
//TPS546_write_entire_config();
// TODO write new config version here
smb_read_byte(PMBUS_VOUT_MODE, &voutmode);
ESP_LOGI(TAG, "VOUT_MODE: %02x", voutmode);
TPS546_write_entire_config();
}
/* Show temperature */
@ -359,18 +423,22 @@ int TPS546_init(void)
/* Show voltage settings */
TPS546_show_voltage_settings();
ESP_LOGI(TAG, "-----------CURRENT---------------------");
ESP_LOGI(TAG, "-----------VOLTAGE/CURRENT---------------------");
/* Get voltage input (SLINEAR11) */
smb_read_word(PMBUS_READ_VIN, &u16_value);
vin = slinear11_2_float(u16_value);
ESP_LOGI(TAG, "Vin measured: %2.3f V", vin);
/* Get output current (SLINEAR11) */
smb_read_word(PMBUS_READ_IOUT, &u16_value);
iout = slinear11_2_int(u16_value);
ESP_LOGI(TAG, "Iout measured: %d", iout);
iout = slinear11_2_float(u16_value);
ESP_LOGI(TAG, "Iout measured: %2.3f A", iout);
/* Get voltage output (ULINEAR16) */
// This gets a timeout, don't know why. clock stretching?
// ESP_LOGI(TAG, "--------------------------------");
// smb_read_word(PMBUS_READ_VOUT, &u16_value);
// millivolts = ulinear16_2_int(u16_value);
// ESP_LOGI(TAG, "Vout measured: %d mV", millivolts);
// vout = ulinear16_2_float(u16_value);
// ESP_LOGI(TAG, "Vout measured: %2.3f V", vout);
ESP_LOGI(TAG, "-----------TIMING---------------------");
smb_read_word(PMBUS_TON_DELAY, &u16_value);
@ -432,64 +500,90 @@ void TPS546_set_mfr_info(void)
/* Set all the relevant config registers for normal operation */
void TPS546_write_entire_config(void)
{
ESP_LOGI(TAG, "---Writing new config values to TPS546---");
/* set up the ON_OFF_CONFIG */
ESP_LOGI(TAG, "Setting ON_OFF_CONFIG");
smb_write_byte(PMBUS_ON_OFF_CONFIG, TPS546_INIT_ON_OFF_CONFIG);
/* Switch frequency */
ESP_LOGI(TAG, "Setting FREQUENCY");
smb_write_word(PMBUS_FREQUENCY_SWITCH, int_2_slinear11(TPS546_INIT_FREQUENCY));
/* vin voltage */
smb_write_word(PMBUS_VIN_ON, int_2_slinear11(TPS546_INIT_VIN_ON));
smb_write_word(PMBUS_VIN_OFF, int_2_slinear11(TPS546_INIT_VIN_OFF));
smb_write_word(PMBUS_VIN_UV_WARN_LIMIT, int_2_slinear11(TPS546_INIT_VIN_UV_WARN_LIMIT));
smb_write_word(PMBUS_VIN_OV_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_VIN_OV_FAULT_LIMIT));
ESP_LOGI(TAG, "Setting VIN");
smb_write_word(PMBUS_VIN_ON, float_2_slinear11(11.5));
smb_write_word(PMBUS_VIN_OFF, float_2_slinear11(TPS546_INIT_VIN_OFF));
smb_write_word(PMBUS_VIN_UV_WARN_LIMIT, float_2_slinear11(TPS546_INIT_VIN_UV_WARN_LIMIT));
smb_write_word(PMBUS_VIN_OV_FAULT_LIMIT, float_2_slinear11(TPS546_INIT_VIN_OV_FAULT_LIMIT));
smb_write_byte(PMBUS_VIN_OV_FAULT_RESPONSE, TPS546_INIT_VIN_OV_FAULT_RESPONSE);
/* vout voltage */
ESP_LOGI(TAG, "Setting VOUT");
smb_write_word(PMBUS_VOUT_SCALE_LOOP, TPS546_INIT_SCALE_LOOP); /* no conversion necessary */
smb_write_word(PMBUS_VOUT_MAX, int_2_slinear11(TPS546_INIT_VOUT_MAX));
smb_write_word(PMBUS_VOUT_OV_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_VOUT_OV_FAULT_LIMIT));
smb_write_word(PMBUS_VOUT_OV_WARN_LIMIT, int_2_slinear11(TPS546_INIT_VOUT_OV_WARN_LIMIT));
//TODO enable this someplace smb_write_word(PMBUS_VOUT_COMMAND, int_2_slinear11(TPS546_INIT_VOUT_COMMAND));
smb_write_word(PMBUS_VOUT_UV_WARN_LIMIT, int_2_slinear11(TPS546_INIT_VOUT_UV_WARN_LIMIT));
smb_write_word(PMBUS_VOUT_UV_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_VOUT_UV_FAULT_LIMIT));
smb_write_word(PMBUS_VOUT_MIN, int_2_slinear11(TPS546_INIT_VOUT_MIN));
ESP_LOGI(TAG, "VOUT_COMMAND");
smb_write_word(PMBUS_VOUT_COMMAND, float_2_ulinear16(TPS546_INIT_VOUT_COMMAND));
ESP_LOGI(TAG, "VOUT_MAX");
smb_write_word(PMBUS_VOUT_MAX, float_2_ulinear16(TPS546_INIT_VOUT_MAX));
ESP_LOGI(TAG, "VOUT_MAX_OV_FAULT_LIMIT");
smb_write_word(PMBUS_VOUT_OV_FAULT_LIMIT, float_2_ulinear16(TPS546_INIT_VOUT_OV_FAULT_LIMIT));
ESP_LOGI(TAG, "VOUT_OV_WARN_LIMIT");
//smb_write_word(PMBUS_VOUT_OV_WARN_LIMIT, float_2_ulinear16(TPS546_INIT_VOUT_OV_WARN_LIMIT));
ESP_LOGI(TAG, "VOUT_UV_WARN_LIMIT");
//smb_write_word(PMBUS_VOUT_UV_WARN_LIMIT, float_2_ulinear16(TPS546_INIT_VOUT_UV_WARN_LIMIT));
ESP_LOGI(TAG, "VOUT_UV_FAULT_LIMIT");
smb_write_word(PMBUS_VOUT_UV_FAULT_LIMIT, float_2_ulinear16(TPS546_INIT_VOUT_UV_FAULT_LIMIT));
ESP_LOGI(TAG, "VOUT_MIN");
smb_write_word(PMBUS_VOUT_MIN, float_2_ulinear16(TPS546_INIT_VOUT_MIN));
/* iout current */
smb_write_word(PMBUS_IOUT_OC_WARN_LIMIT, int_2_slinear11(TPS546_INIT_IOUT_OC_WARN_LIMIT));
smb_write_word(PMBUS_IOUT_OC_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_IOUT_OC_FAULT_LIMIT));
ESP_LOGI(TAG, "Setting IOUT");
smb_write_word(PMBUS_IOUT_OC_WARN_LIMIT, float_2_slinear11(TPS546_INIT_IOUT_OC_WARN_LIMIT));
smb_write_word(PMBUS_IOUT_OC_FAULT_LIMIT, float_2_slinear11(TPS546_INIT_IOUT_OC_FAULT_LIMIT));
smb_write_byte(PMBUS_IOUT_OC_FAULT_RESPONSE, TPS546_INIT_IOUT_OC_FAULT_RESPONSE);
/* temperature */
ESP_LOGI(TAG, "Setting TEMPERATURE");
ESP_LOGI(TAG, "OT_WARN_LIMIT");
smb_write_word(PMBUS_OT_WARN_LIMIT, int_2_slinear11(TPS546_INIT_OT_WARN_LIMIT));
ESP_LOGI(TAG, "OT_FAULT_LIMIT");
smb_write_word(PMBUS_OT_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_OT_FAULT_LIMIT));
ESP_LOGI(TAG, "OT_FAULT_RESPONSE");
smb_write_byte(PMBUS_OT_FAULT_RESPONSE, TPS546_INIT_OT_FAULT_RESPONSE);
/* timing */
ESP_LOGI(TAG, "Setting TIMING");
ESP_LOGI(TAG, "TON_DELAY");
smb_write_word(PMBUS_TON_DELAY, int_2_slinear11(TPS546_INIT_TON_DELAY));
ESP_LOGI(TAG, "TON_RISE");
smb_write_word(PMBUS_TON_RISE, int_2_slinear11(TPS546_INIT_TON_RISE));
ESP_LOGI(TAG, "TON_MAX_FAULT_LIMIT");
smb_write_word(PMBUS_TON_MAX_FAULT_LIMIT, int_2_slinear11(TPS546_INIT_TON_MAX_FAULT_LIMIT));
smb_write_byte(PMBUS_TON_MAX_FAULT_RESPONSE, TPS546_INIT_TON_MAX_FAULT_RESPONSE);
smb_write_word(PMBUS_TOFF_DELAY, int_2_slinear11(TPS546_INIT_TOFF_DELAY));
smb_write_word(PMBUS_TOFF_FALL, int_2_slinear11(TPS546_INIT_TOFF_FALL));
/* Stack/sync config */
smb_write_word(PMBUS_STACK_CONFIG, INIT_STACK_CONFIG);
smb_write_word(PMBUS_SYNC_CONFIG, INIT_SYNC_CONFIG);
/* Compensation config */
smb_write_block(PMBUS_COMPENSATION_CONFIG, COMPENSATION_CONFIG, 5);
//ESP_LOGI(TAG, "COMPENSATION");
//smb_write_block(PMBUS_COMPENSATION_CONFIG, COMPENSATION_CONFIG, 5);
/* Slave address */
smb_write_byte(PMBUS_SLAVE_ADDRESS, TPS546_I2CADDR);
//smb_write_byte(PMBUS_SLAVE_ADDRESS, TPS546_I2CADDR);
/* configure the bootup behavior regarding pin detect values vs NVM values */
ESP_LOGI(TAG, "Setting PIN_DETECT_OVERRIDE");
smb_write_word(PMBUS_PIN_DETECT_OVERRIDE, INIT_PIN_DETECT_OVERRIDE);
/* TODO write new MFR_REVISION number to reflect these parameters */
ESP_LOGI(TAG, "Writing MFR ID");
smb_write_block(PMBUS_MFR_ID, MFR_ID, 3);
ESP_LOGI(TAG, "Writing MFR MODEL");
smb_write_block(PMBUS_MFR_ID, MFR_MODEL, 3);
ESP_LOGI(TAG, "Writing MFR REVISION");
smb_write_block(PMBUS_MFR_ID, MFR_REVISION, 3);
/* store configuration in NVM */
smb_write_byte(PMBUS_STORE_USER_ALL, 0xFF);
ESP_LOGI(TAG, "---Saving new config---");
//smb_write_byte(PMBUS_STORE_USER_ALL, 0xFF);
}
@ -556,7 +650,7 @@ void TPS546_set_vout(int millivolts)
ESP_LOGI(TAG, "ERR- Voltage requested is out of range");
} else {
/* set the output voltage */
value = int_2_ulinear16(millivolts);
value = float_2_ulinear16((float)(millivolts / 1000));
smb_write_word(PMBUS_VOUT_COMMAND, value);
ESP_LOGI(TAG, "Vout changed to %d mV", millivolts);
@ -569,65 +663,62 @@ void TPS546_set_vout(int millivolts)
void TPS546_show_voltage_settings(void)
{
uint16_t u16_value;
int i_value;
int millivolts;
float f_value;
ESP_LOGI(TAG, "-----------VOLTAGE---------------------");
/* VIN_ON SLINEAR11 */
smb_read_word(PMBUS_VIN_ON, &u16_value);
i_value = slinear11_2_int(u16_value);
ESP_LOGI(TAG, "VIN ON set to: %d", i_value);
f_value = slinear11_2_float(u16_value);
ESP_LOGI(TAG, "VIN ON set to: %f", f_value);
/* VIN_OFF SLINEAR11 */
smb_read_word(PMBUS_VIN_OFF, &u16_value);
i_value = slinear11_2_int(u16_value);
ESP_LOGI(TAG, "VIN OFF set to: %d", i_value);
f_value = slinear11_2_float(u16_value);
ESP_LOGI(TAG, "VIN OFF set to: %f", f_value);
/* VOUT_MAX */
smb_read_word(PMBUS_VOUT_MAX, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout Max set to: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout Max set to: %f V", f_value);
/* VOUT_OV_FAULT_LIMIT */
smb_read_word(PMBUS_VOUT_OV_FAULT_LIMIT, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout OV Fault Limit: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout OV Fault Limit: %f V", f_value);
/* VOUT_OV_WARN_LIMIT */
smb_read_word(PMBUS_VOUT_OV_WARN_LIMIT, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout OV Warn Limit: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout OV Warn Limit: %f V", f_value);
/* VOUT_MARGIN_HIGH */
smb_read_word(PMBUS_VOUT_MARGIN_HIGH, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout Margin HIGH: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout Margin HIGH: %f V", f_value);
/* --- VOUT_COMMAND --- */
smb_read_word(PMBUS_VOUT_COMMAND, &u16_value);
millivolts = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout set to: %d mV", millivolts);
//u16_value = int_2_ulinear16(millivolts);
//ESP_LOGI(TAG, "Converted back: %04x", u16_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout set to: %f V", f_value);
/* VOUT_MARGIN_LOW */
smb_read_word(PMBUS_VOUT_MARGIN_LOW, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout Margin LOW: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout Margin LOW: %f V", f_value);
/* VOUT_UV_WARN_LIMIT */
smb_read_word(PMBUS_VOUT_UV_WARN_LIMIT, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout UV Warn Limit: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout UV Warn Limit: %f V", f_value);
/* VOUT_UV_FAULT_LIMIT */
smb_read_word(PMBUS_VOUT_UV_FAULT_LIMIT, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout UV Fault Limit: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout UV Fault Limit: %f V", f_value);
/* VOUT_MIN */
smb_read_word(PMBUS_VOUT_MIN, &u16_value);
i_value = ulinear16_2_int(u16_value);
ESP_LOGI(TAG, "Vout Min set to: %d mV", i_value);
f_value = ulinear16_2_float(u16_value);
ESP_LOGI(TAG, "Vout Min set to: %f V", f_value);
}

View File

@ -17,25 +17,25 @@
#define TPS546_INIT_FREQUENCY 650 /* KHz */
/* vin voltage */
#define TPS546_INIT_VIN_ON 11900 /* mV */
#define TPS546_INIT_VIN_OFF 11000 /* mV */
#define TPS546_INIT_VIN_UV_WARN_LIMIT 11000 /* mV */
#define TPS546_INIT_VIN_OV_FAULT_LIMIT 14000 /* mV */
#define TPS546_INIT_VIN_ON 11.5 /* V */
#define TPS546_INIT_VIN_OFF 11.0 /* V */
#define TPS546_INIT_VIN_UV_WARN_LIMIT 11.0 /* V */
#define TPS546_INIT_VIN_OV_FAULT_LIMIT 14.0 /* V */
#define TPS546_INIT_VIN_OV_FAULT_RESPONSE 0xB7 /* retry 6 times */
/* vout voltage */
#define TPS546_INIT_SCALE_LOOP 0xC808 /* 0.125 */
#define TPS546_INIT_VOUT_MAX 4500 /* mV */
#define TPS546_INIT_VOUT_OV_FAULT_LIMIT 4500 /* mV */
#define TPS546_INIT_VOUT_OV_WARN_LIMIT 4400 /* mV */
#define TPS546_INIT_VOUT_COMMAND 3600 /* mV */
#define TPS546_INIT_VOUT_UV_WARN_LIMIT 3100 /* mV */
#define TPS546_INIT_VOUT_UV_FAULT_LIMIT 3000 /* mV */
#define TPS546_INIT_VOUT_MIN 3000 /* mv */
#define TPS546_INIT_VOUT_MAX 5.00 /* V */
#define TPS546_INIT_VOUT_OV_FAULT_LIMIT 1.20 /* V relative to VOUT_COMMAND */
#define TPS546_INIT_VOUT_OV_WARN_LIMIT 0.90 /* V relative to VOUT_COMMAND */
#define TPS546_INIT_VOUT_COMMAND 3.60 /* V absolute value */
#define TPS546_INIT_VOUT_UV_WARN_LIMIT 0.50 /* V relative to VOUT_COMMAND */
#define TPS546_INIT_VOUT_UV_FAULT_LIMIT 0.60 /* V relative to VOUT_COMMAND */
#define TPS546_INIT_VOUT_MIN 3.00 /* v */
/* iout current */
#define TPS546_INIT_IOUT_OC_WARN_LIMIT 25000 /* mA */
#define TPS546_INIT_IOUT_OC_FAULT_LIMIT 30000 /* mA */
#define TPS546_INIT_IOUT_OC_WARN_LIMIT 25.00 /* A */
#define TPS546_INIT_IOUT_OC_FAULT_LIMIT 30.00 /* A */
#define TPS546_INIT_IOUT_OC_FAULT_RESPONSE 0xC0 /* shut down, no retries */
/* temperature */