This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

UCD9080 abnormal state

Other Parts Discussed in Thread: UCD9080, UCD9081

Hi,

we are using power sequencer UCD9080 of TI in our system to provide power supply. UCD9080 is programmed through IIC by 8-bit host controller (Atmel ATmega).

In process of debugging our system with UCD9080 and three daughter's power modules, we've got a state of UCD9080 that isn't described in datasheet SLVS692E:
1) UCD9080 communicates with host-controller through IIC;
2) UCD9080 answers to IIC commands as described and, for example, returns a non-zero value of "VERSION" register;
3) UCD9080 is configurable; I mean that it writes configuration data into it's flash and reads configuration back; the process of verification (in host controller) is completed successful,

however,
4) registers RAILxL and RAILxH are read equal to 0 regardless of voltage on MONx pin;
5) the state ENx pin is always non-active regardless voltage on parent MONx-pin is in thresholds (UnderVoltageThresholds - OverVoltageThreshold) or not;
6) value of STATUS register is always equal to 0x20, bit NVERRLOG = 1, but in current revision of the datasheet (E May 2008) this bit is described as "reserved for future use"; all other bits in this register are equal to 0;
7) value of ERROR register is always equal to 0.

UCD9080 is programmed in way, described in datasheet: host controller writes all 512 bytes of configuration memory. Unused bytes are exactly match table 2 of datasheet.

Program a default configuration doesn't solve the problem.

Is there a way to return UCD9080 to normal state? What is the reason of this abnormal work of UCD9080?

Thank you, 

Kirill

P.S. I try to attach an example code to my message, sample.c is main function, eedata.h - is a default config of UCD9080.

#define F_CPU 3.6864E6

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "eeprom.h"
#include "TWI_Master.h"
#include "ucd9080.h"

#define nop()   {asm("nop");}

unsigned char res;
unsigned char ucTryCnt;
unsigned int idx;
unsigned char buf[16];
unsigned char register_map[512];
unsigned int param_address, param_value;
unsigned char version, status;

unsigned int rail_volts[8];

TError LastError;

unsigned char GetLastError(void);
unsigned char GetRailVoltages(void);

int main(void)
{
    TWI_Master_Initialise();
    sei();

    _delay_ms(1000);

config_start:
    bzero(&config_memory[0], CONFIG_MEMORY_SIZE);
    EEPROM_read_buffer(&def_config_memory[0], &config_memory[0], CONFIG_MEMORY_SIZE);// ���������� ��������� �������� �� EEPROM!
    
    /* Prepare configuration of power sequencer */
    /* SequenceEventParameters */
    config_memory[0x0080] = 0xD0;// Sequence is triggered after parent rail is achieves voltage regulation
    config_memory[0x0081] = 0xD1;
    config_memory[0x0082] = 0xD2;
    config_memory[0x0083] = 0xD3;
    config_memory[0x0084] = 0xD4;
    /* SequenceEventLink*/
    config_memory[0x008c] = 0x40;//0x40;//Sequence after shut down
    config_memory[0x008d] = 0x41;//0x41;
    config_memory[0x008e] = 0x42;//0x42;
    config_memory[0x008f] = 0x43;//0x43;
    config_memory[0x0090] = 0x44;//0x44;
    /* SequenceEventData*/
    config_memory[0x0098] = 0x10;// delay 16 ms after volatge regulation
    config_memory[0x0099] = 0xa0;//0xa0
    config_memory[0x009a] = 0x10;
    config_memory[0x009b] = 0xa0;//0xa0
    config_memory[0x009c] = 0x10;
    config_memory[0x009d] = 0xa0;//0xa0
    config_memory[0x009e] = 0x10;
    config_memory[0x009f] = 0xa0;//0xa0
    config_memory[0x00a0] = 0x64;// delay 100 ms after voltage regulation
    config_memory[0x00a1] = 0xa0;//0xa0
    /* DependencyMasks*/
    config_memory[0x0100] = 0x1F;
    config_memory[0x0101] = 0x08;
    config_memory[0x0102] = 0x1E;//0x1E
    config_memory[0x0103] = 0x08;
    config_memory[0x0104] = 0x1C;//0x1C
    config_memory[0x0105] = 0x00;
    config_memory[0x0106] = 0x18;//0x18
    config_memory[0x0107] = 0x00;
    config_memory[0x0108] = 0x10;//0x10
    config_memory[0x0109] = 0x00;
    /* UnderVoltageThresholds*/
    config_memory[0x011e] = 0xe7;
    config_memory[0x011f] = 0x01;
    config_memory[0x011c] = 0x33;
    config_memory[0x011d] = 0x01;
    config_memory[0x011a] = 0x26;
    config_memory[0x011b] = 0x01;
    config_memory[0x0118] = 0x61;
    config_memory[0x0119] = 0x01;
    config_memory[0x0116] = 0xe7;
    config_memory[0x0117] = 0x01;
    /* OverVoltageThresholds*/
    config_memory[0x012e] = 0x18;
    config_memory[0x012f] = 0x02;
    config_memory[0x012c] = 0x90;
    config_memory[0x012d] = 0x01;
    config_memory[0x012a] = 0x45;
    config_memory[0x012b] = 0x01;
    config_memory[0x0128] = 0x86;
    config_memory[0x0129] = 0x01;
    config_memory[0x0126] = 0x18;
    config_memory[0x0127] = 0x02;
    config_memory[0x0124] = 0x07;
    config_memory[0x0125] = 0x01;
    /* RampTime*/
    config_memory[0x0130] = 0x00;//RampTime = 512 ms
    config_memory[0x0131] = 0x02;
    config_memory[0x0132] = 0x00;
    config_memory[0x0133] = 0x02;
    config_memory[0x0134] = 0x00;
    config_memory[0x0135] = 0x02;
    config_memory[0x0136] = 0x00;
    config_memory[0x0137] = 0x02;
    config_memory[0x0138] = 0x00;
    config_memory[0x0139] = 0x02;
    /* OutOfRegulationWidth */
    /* UnsequenceTime*/
    config_memory[0x0150] = 0x14;//20 ms
    config_memory[0x0151] = 0xa0;//0xa0
    config_memory[0x0152] = 0x10;//16 ms
    config_memory[0x0153] = 0xa0;//0xa0
    config_memory[0x0154] = 0x0c;//12 ms
    config_memory[0x0155] = 0xa0;//0xa0
    config_memory[0x0156] = 0x08;// 8 ms   
    config_memory[0x0157] = 0xa0;//0xa0
    config_memory[0x0158] = 0x04;// 4 ms
    config_memory[0x0159] = 0xa0;//0xa0
    /* EnablePolarity*/
    config_memory[0x0168] = 0x04;
    config_memory[0x0169] = 0x20;//active-low
    config_memory[0x016a] = 0x08;
    config_memory[0x016b] = 0x20;//active-low
    config_memory[0x016c] = 0x04;
    config_memory[0x016d] = 0x18;//active-low
    config_memory[0x016e] = 0x02;
    config_memory[0x016f] = 0x18;//active-low
    config_memory[0x0170] = 0x08;
    config_memory[0x0171] = 0x98;//active-high
    
    /* LastUnusedSeq*/
    config_memory[0x018E] = 0xFF;
    config_memory[0x018F] = 0x08;

    /* FAN_ON_P */
    config_memory[0x008B] = 0x4B;
    config_memory[0x0097] = 0;
    config_memory[0x00AE] = 0x00;
    config_memory[0x00AF] = 0x04;
    config_memory[0x017E] = 0x80;
    config_memory[0x017F] = 0xA0;

    /* Save config_memory to register_map */
    memcpy(&register_map[0], &config_memory[0], CONFIG_MEMORY_SIZE);
    
    /* Configure power sequencer */
    ucTryCnt = 3;
    do{
        res = ucd9080_config_store();
        _delay_ms(100);
    }while((!res) && (--ucTryCnt));
    if (!res)
    {
        while(1)
        {
            nop();
        }            
    }

    bzero(&config_memory[0], CONFIG_MEMORY_SIZE);

    /* Verifying configuration*/
    /* Load configuration back */
    ucTryCnt = 3;
    do{
        res = ucd9080_config_load();
        _delay_ms(100);
    }while((!res) && (--ucTryCnt));
    if (!res)
    {
        while(1);
    }
    
    res = true;
    for (idx = 0; idx < CONFIG_MEMORY_SIZE; idx++)
    {
        if (config_memory[idx] != register_map[idx])
        {
            res = false;
            break;
        }
    }
    if (!res)
    {
        goto config_start;
    }

    res = ucd9080_read_byte(STATUS, &status);
    
    ucTryCnt = 3;
    do{
        res = ucd9080_write_byte(RESTART, 0);
        _delay_ms(100);
    }while((!res) && (--ucTryCnt));
    if (!res)
    {
        while(1);
    }

    while(1)
    {
        //TODO:: Please write your application code 
        res = ucd9080_read_byte(STATUS, &status);
        
        res = GetLastError();
        
        res = GetRailVoltages();
        
        _delay_ms(1000);
    }
}

unsigned char GetRailVoltages(void)
{
    unsigned char   icx;
    bool            res;
    
    for(icx = 0; icx < 16; icx++)
    {
        res = ucd9080_read_byte(icx+RAIL1H, &buf[icx]);
        if (!res)
        return false;
    }
    bzero(&rail_volts[0], 16);
    for(icx = 0; icx < 7; icx++)
    {
        rail_volts[icx] = (buf[2*icx] << 8) + buf[2*icx+1];
    }
    return true;
}

unsigned char GetLastError(void)
{
    unsigned char   icx;
    bool            res;
    
    for(icx = 0; icx < 7; icx++)
    {
        res = ucd9080_read_byte(icx+ERROR1, &buf[idx]);
        if (!res)
        return 0;
    }
    LastError.error_code = (buf[0] & 0xe0) >> 5;
    LastError.rail = (buf[0] & 0x1c) >> 2;
    LastError.error_data = ((buf[0] & 0x03) << 8) | (buf[1]);
    LastError.time.hh = buf[2];
    LastError.time.mm = buf[3];
    LastError.time.ss = (buf[4] & 0xfc) >> 2;
    LastError.time.ms = ((buf[4] & 0x03) << 8) | (buf[5]);
    return LastError.error_code;
}

2664.eedata.h

  • I attach to this post default flash memory content for ucd9080 which host controller reads from sequencer (ucd9080_def_cfg).

    With this configuration ucd9080 was measured voltages on MONx pin successfully before above mentioned problem occured.

    Now sequencer doesn't measure voltages correctly (it reads all zeros).

    data 0xe000  00 00 00 00 00 00 00 00  ........
    data 0xe008  00 00 00 00 00 00 00 00  ........
    data 0xe010  00 00 00 00 00 00 00 00  ........
    data 0xe018  00 00 00 00 00 00 00 00  ........
    data 0xe020  00 00 00 00 00 00 00 00  ........
    data 0xe028  00 00 00 00 00 00 00 00  ........
    data 0xe030  00 00 00 00 00 00 00 00  ........
    data 0xe038  00 00 00 00 00 00 00 00  ........
    data 0xe040  00 00 00 00 00 00 00 00  ........
    data 0xe048  ff ff 00 00 00 00 00 00  ��......
    data 0xe050  00 00 00 00 00 00 00 00  ........
    data 0xe058  ff 00 00 00 00 00 c0 02  �.....�.
    data 0xe060  00 00 00 0f 00 02 00 02  ........
    data 0xe068  ff 0f 00 50 00 00 00 00  �..P....
    data 0xe070  00 00 c0 20 00 00 00 00  ..� ....
    data 0xe078  00 00 00 00 00 a8 dc ba  .....�ܺ
    data 0xe080  50 51 52 53 54 55 56 57  PQRSTUVW
    data 0xe088  00 49 4a 4b 01 00 01 04  .IJK....
    data 0xe090  01 04 05 06 00 00 00 00  ........
    data 0xe098  05 e0 05 a0 32 e0 33 e0  .�.�2�3�
    data 0xe0a0  33 e0 35 e0 35 e0 00 00  3�5�5�..
    data 0xe0a8  00 00 00 00 00 00 00 00  ........
    data 0xe0b0  ff 7f ff 7f ff 7f ff 7f  �.�.�.�.
    data 0xe0b8  ff 7f ff 7f ff 7f ff 7f  �.�.�.�.
    data 0xe0c0  00 00 00 00 00 00 00 00  ........
    data 0xe0c8  00 00 00 00 00 00 00 00  ........
    data 0xe0d0  00 00 00 00 00 00 00 00  ........
    data 0xe0d8  00 00 00 00 00 00 00 00  ........
    data 0xe0e0  00 00 00 00 00 00 00 00  ........
    data 0xe0e8  00 00 00 00 00 00 00 00  ........
    data 0xe0f0  00 00 00 00 00 00 00 00  ........
    data 0xe0f8  00 00 00 00 00 00 00 00  ........
    data 0xe100  7f 00 01 00 02 00 04 00  ........
    data 0xe108  08 00 10 00 20 00 40 00  .... .@.
    data 0xe110  00 00 00 00 00 00 00 00  ........
    data 0xe118  00 00 00 00 00 00 00 00  ........
    data 0xe120  00 04 00 04 00 04 00 04  ........
    data 0xe128  00 04 00 04 00 04 00 04  ........
    data 0xe130  a0 0f a0 0f a0 0f a0 0f  �.�.�.�.
    data 0xe138  a0 0f a0 0f a0 0f a0 0f  �.�.�.�.
    data 0xe140  10 00 10 00 10 00 10 00  ........
    data 0xe148  10 00 10 00 10 00 10 00  ........
    data 0xe150  ff c0 ff c1 ff c2 ff c3  ��������
    data 0xe158  ff c4 ff c5 ff c6 ff c7  ��������
    data 0xe160  00 00 00 c0 00 c0 00 c0  ...�.�.�
    data 0xe168  04 20 08 20 04 18 02 18  . . ....
    data 0xe170  08 18 10 18 20 18 10 20  .... .. 
    data 0xe178  00 20 20 20 40 20 80 20  .   @ � 
    data 0xe180  00 00 00 04 94 02 f2 08  ....�.�.
    data 0xe188  10 03 05 c0 40 00 ff 08  ...�@.�.
    data 0xe190  05 00 00 00 00 00 00 00  ........
    data 0xe198  00 00 00 00 00 00 00 00  ........
    data 0xe1a0  00 00 00 00 00 00 00 00  ........
    data 0xe1a8  00 00 00 00 00 00 00 00  ........
    data 0xe1b0  00 00 00 00 00 00 00 00  ........
    data 0xe1b8  00 00 00 00 00 00 00 00  ........
    data 0xe1c0  00 00 00 00 00 00 00 00  ........
    data 0xe1c8  00 00 00 00 00 00 00 00  ........
    data 0xe1d0  00 00 00 00 00 00 00 00  ........
    data 0xe1d8  00 00 00 00 00 00 00 00  ........
    data 0xe1e0  00 00 00 00 00 00 00 00  ........
    data 0xe1e8  00 00 00 00 00 00 00 00  ........
    data 0xe1f0  00 00 00 00 00 00 00 00  ........
    data 0xe1f8  00 00 00 00 00 00 00 00  ........

  • Hi, we "solve" the problem that I mentioned above by re-install another IC on board.

    New UCD9080 works correctly.

    But I still have got two questions:

    1) Why previous IC works incorrectly while it was configured successfully?

    2) New sequencer comes with default configuration that differs from configuration described in datasheet/appnot slua441. I attached two hex's files (due to forum limit I renamed files extensions to .txt), one - for sample cfg that described in datasheet/appnote ant another one - real configuration that was read from device. Which one is right?

    :20E00000000000000000000000000000000000000000000000000000000000000000000000
    :20E020000000000000000000000000000000000000000000000000000000000000000000E0
    :20E040000000000000000000FFFF0000000000000000000000000000FF0000000000C00201
    :20E060000000000F00020002FF0F0050000000000000C020000000000000000000A8DCBA11
    :20E08000505152535455565700494A4B01000104010405060000000005E005A032E033E041
    :20E0A00033E035E035E000000000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F33
    :20E0C000000000000000000000000000000000000000000000000000000000000000000040
    :20E0E000000000000000000000000000000000000000000000000000000000000000000020
    :20E100007F0001000200040008001000200040000000000000000000000000000000000001
    :20E1200000040004000400040004000400040004A00FA00FA00FA00FA00FA00FA00FA00F47
    :20E1400010001000100010001000100010001000FFC0FFC1FFC2FFC3FFC4FFC5FFC6FFC72B
    :20E16000000000C000C000C0042008200418021808181018201810200020202040208020CD
    :20E18000000000049402F208100305C04000FF0805000000000000000000000000000000C7
    :20E1A00000000000000000000000000000000000000000000000000000000000000000005F
    :20E1C00000000000000000000000000000000000000000000000000000000000000000003F
    :20E1E00000000000000000000000000000000000000000000000000000000000000000001F
    :00000001FF

    :20E00000000000000000000000000000000000000000000000000000000000000000000000
    :20E020000000000000000000000000000000000000000000000000000000000000000000E0
    :20E04000000000000000000000000000000000000000000000000000FF0000000000C002FF
    :20E060000000000F00020002FF0E0050000000000000C020000000000000000000A8DCBA12
    :20E08000505152535455565700494A4B01000104010405060000000005E005A032E033E041
    :20E0A00033E035E035E000000000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F33
    :20E0C000000000000000000000000000000000000000000000000000000000000000000040
    :20E0E000000000000000000000000000000000000000000000000000000000000000000020
    :20E100007F0001000200040008001000200040000000000000000000000000000000000001
    :20E1200000040004000400040004000400040004A00FA00FA00FA00FA00FA00FA00FA00F47
    :20E1400010001000100010001000100010001000FFC0FFC1FFC2FFC3FFC4FFC5FFC6FFC72B
    :20E16000000000C000C000C0042008200418021808181018201810200018202040208020D5
    :20E18000000000019402F208100305C04000FF0805000000000000000000000000000000CA
    :20E1A00000000000000000000000000000000000000000000000000000000000000000005F
    :20E1C00000000000000000000000000000000000000000000000000000000000000000003F
    :20E1E00000000000000000000000000000000000000000000000000000000000000000001F
    :00000001FF
    

  • Hi Kirill,

    I 'm sorry for the delay. This is a bug in the UCD9080, the reason we don't recommend this device for new designs. The UCD9081 is a pin to pin compatible upgrade of the UCD9080 which overcomes this problem. The issue here is that a UCD9080 has default values that are described in the data sheet except for five locations. This was why you have seen a difference in the datasheet configuration parameters memory map and the Flash export from the IC. The exceptions are the following:

    Address Required Value
    0xE048 0xFF
    0xE049 0xFF
    0xE069 0x0F
    0xE179 0x20
    0xE183 0x04

    The required values are what are listed in the Data sheet but which are not present on the device. The exceptions must be changed for the device to operate properly else it would result in some unknown behavior which was what you were seeing.

    Thanks, Spandana