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.

TPS25750: Regarding PowerStatusUpdate

Part Number: TPS25750
Other Parts Discussed in Thread: BQ25792

Hi support team.

My customer has a critical issue regarding PowerStatusUpdate as below.

POWER_STATUS register (0x3F) doesn't change but  the state of PowerStatusUpdate become "1". 

Additional case is "0" is written to PowerStatusUpdate with INT_CLEAR, and immediately after that, PowerStatusUpdate may become "1" again. (POWER_STATUS register (0x3F) has not changed.)

Is it possible for something like the above to happen?

I believe that PowerStatusUpdate clearly indicates that the POWER_STATUS register (0x3F) has changed, but is there anything other than POWER_STATUS register (0x3F) that is affected?

Best regards,

Higa

  • Hi,

    Can you try it with the new GUI (https://dev.ti.com/gallery/view/USBPD/USBCPD_Application_Customization_Tool) and select "no" for BC1.2 support?

    I think the charger advertisement/detection field in the power status register is the reason interrupt being raised.

    Regards

  • Hi Lin-san

     The charger advertisement/detection and the other all field in POWER_STATUS register (0x3F) hadn't be changed.

    Is my understanding correct that PowerStatusUpdate triggers "1" if one of any status in POWER_STATUS register (0x3F) changes?

    If YES, do you think the events we have confirmed are abnormal?

    Best regards,

    Higa

  • Hi,

    My suspicion is that charger advertisement/detection field is reporting detection in progress or advertisement in progress and these can potentially keep raising the flags.

    There can also be other possibilities but let check with this one first.

    Regards

  • Hi Tommy-san

    We are checking the register for the fields shown below, but is there an error in the method?

    If incorrect, Could you tell us  what confirm correct method that charger advertisement/detection field is reporting detection in progress or advertisement?

    If correct, we already confirmed these register didn't change.

    Best regards,

    Higa

  • Hi Tommy-san

    We confirmed to our customer that ChargeAdvertiseStatus and ChargeDetectStatus register doesn't change.

    In their system, TPS25750 and BQ25792 do not communicate directly via I2C. Therefore, the charger status of TPS25750 is not rewritten.

    The read log of the PowerStatusUpdate register is shown below.

    ------------- PowerStatusUpdate write log------------------------------------

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x0000
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0
    -----------------------------------------------USB PD connector disconnected

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x023F
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0
    -----------------------------------------------USB PD connector connected

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x0000
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0
    -----------------------------------------------USB PD connector disconnected

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x023F
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0
    -----------------------------------------------USB PD connector connected

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x0000
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0
    -----------------------------------------------USB PD connector disconnected

    EVENT1.PowerStatusUpdate = 0x1
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x023F
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x1 --- After reading POWER_STATUS, INT_EVENT1.PowerStatusUpdate is “1”.
    <<WHY??>>
    POWER_STATUS = 0x023F --- Read POWER_STATUS again. It hasn't changed.
    -----------------------------------------------USB PD connector connected(abnomal!)

    EVENT1.PowerStatusUpdate = 0x1 --- The last PowerStatusUpdate remains 1, so the same state remains after 300ms.
    Write INT_CLEAR1
    ReadBack1 : EVENT1.PowerStatusUpdate = 0x0
    POWER_STATUS = 0x023F
    ReadBack2 : EVENT1.PowerStatusUpdate = 0x0

    --------------------EOL-----------------------------------------------------

    Below is an excerpt of the source code.

    erResult = RequestReadUSBPD(
    								hUSBPD,
    								LPTREG_INT_EVENT1,
    								(UB *)&stIntEvent,
    								sizeof(stIntEvent));					// Read INT_EVENT1 every 300ms.
    
    		if (erResult == I2C_SUCCESS) {
    			if ((stIntEvent.bitPowerStatusUpdate != 0) || (g_stUsbInfo.blUSBPD_APP != 0)) {		// If PowerStatusUpdate becomes 1, output the log.
    				g_stUsbInfo.blUSBPD_APP	= 0;
    				printf("            EVENT1.PowerStatusUpdate = 0x%d\r\n", stIntEvent.bitPowerStatusUpdate);
    
    				erResult = RequestWriteUSBPD(
    										hUSBPD,
    										LPTREG_INT_CLEAR1,
    										(UB *)&stIntEvent,
    										sizeof(stIntEvent));									// Write INT_CLEAR1 to clear INT_EVENT1
    				printf("Write INT_CLEAR1\r\n");
    				erResult = RequestReadUSBPD(
    										hUSBPD,
    										LPTREG_INT_EVENT1,
    										(UB *)&stIntEvent,
    										sizeof(stIntEvent));									// Reading back to ensure PowerStatusUpdate is cleared.
    				printf("ReadBack1 : EVENT1.PowerStatusUpdate = 0x%d\r\n", stIntEvent.bitPowerStatusUpdate);
    
    
    				dly_tsk(500);																	// If the wait time is not set to this amount, an error will occur (reason unknown)
    				erResult = RequestReadUSBPD(
    										hUSBPD,
    										LPTREG_POWER_STATUS,
    										(UB *)&stPowerStatus,
    										sizeof(stPowerStatus));									// POWER_STATUS read
    				printf("POWER_STATUS = 0x%02X%02X\r\n", stPowerStatus.ubBytes[1], stPowerStatus.ubBytes[0]);
    				erResult = RequestReadUSBPD(
    										hUSBPD,
    										LPTREG_INT_EVENT1,
    										(UB *)&stIntEvent,
    										sizeof(stIntEvent));									// Read back INT_EVENT1
    				printf("ReadBack2 : EVENT1.PowerStatusUpdate = 0x%d\r\n", stIntEvent.bitPowerStatusUpdate);
    
    				if (stIntEvent.bitPowerStatusUpdate != 0) {
    					printf("<<WHY??>>\r\n");													// If PowerStatusUpdate becomes 1, output WHY??
    					erResult = RequestReadUSBPD(
    											hUSBPD,
    											LPTREG_POWER_STATUS,
    											(UB *)&stPowerStatus,
    											sizeof(stPowerStatus));								// Read POWER_STATUS for confirmation
    					printf("POWER_STATUS = 0x%02X%02X\r\n", stPowerStatus.ubBytes[1], stPowerStatus.ubBytes[0]);
    				}
    
    				printf("\r\n");
    
    

    I'll ask the question again.
    Why does the PowerStatusUpdate register change to 1 even though the POWER_STATUS register (0x3F) does not change?

    Best regards,

    Higa

  • Hi Higa-san,

    Per the TRM and the description of the failure symptoms, it does seem like abnormal behavior is occurring.

    What are you doing during the test? Is it only plug/unplug? Can you capture and share a PD log and an i2C log of the I2C bus when these events occur?

    Also, please share the .json and .bin being used for this project so we can do some testing on our end.

    Thanks and Regards,

    Chris

  • Hi Chris-san

    Thank you for your reply.

    We will obtain the information you requested and contact you again.

    Best regards,

    Higa

  • Hi Higa-san,

    Sounds good, awaiting your reply.

    Thanks and Regards,

    Chris