cancel
Showing results for 
Search instead for 
Did you mean: 

Unable to sink 5V over USB PD

Nv7
Associate III

I am using an STM32G4 microcontroller with UCPD and the USBPD middleware. I was following this tutorial (same as AN5418 https://www.st.com/resource/en/application_note/dm00663511-how-to-build-a-simple-usbpd-sink-application-with-stm32cubemx-stmicroelectronics.pdf:(

https://youtu.be/-vsJhNIaHxE?si=3wosMAMXrO40mVZr

I, however, have a custom PCB without a TCPP chip, I'm not sure if this makes a difference. I set up everything according to the tutorial and I added the code it requires. Additionally, I added the following code to EvaluateSinkCapabilites: 

void USBPD_DPM_SNK_EvaluateCapabilities(uint8_t PortNum, uint32_t *PtrRequestData, USBPD_CORE_PDO_Type_TypeDef *PtrPowerObjectType)
{
/* USER CODE BEGIN USBPD_DPM_SNK_EvaluateCapabilities */


 USBPD_SNKRDO_TypeDef rdo;
 rdo.d32 = 0;
 /* Prepare the requested pdo */
 rdo.FixedVariableRDO.ObjectPosition = 1;
 rdo.FixedVariableRDO.OperatingCurrentIn10mAunits = 50;
 rdo.FixedVariableRDO.MaxOperatingCurrent10mAunits = 50;
 rdo.FixedVariableRDO.CapabilityMismatch = 0;

 *PtrPowerObjectType = USBPD_CORE_PDO_TYPE_FIXED;
 *PtrRequestData = rdo.d32;

 //USBPD_HandleTypeDef *pdhandle = &DPM_Params[PortNum];
 uint32_t size;
 uint32_t snkpdolist[USBPD_MAX_NB_PDO];  // Array to store sink PDOs
 USBPD_PDO_TypeDef pdo;

 // Get the list of sink PDOs
 USBPD_PWR_IF_GetPortPDOs(PortNum, USBPD_CORE_DATATYPE_SNK_PDO, (uint8_t *)snkpdolist, &size);
 HAL_Delay(100);

 ssd1306_Display(1);
 ssd1306_Fill(Black);
 ssd1306_SetCursor(0, 0);
 ssd1306_WriteString("Available PDOs:", Font_11x18, White);

 // Iterate through each sink PDO and print its details
 for (uint32_t i = 0; i < size; i++)
 {
	 pdo.d32 = snkpdolist[i];  // Get each PDO
	 char pdo_info[256];  // Adjust the size if needed
	 snprintf(pdo_info, sizeof(pdo_info), "%u mV, %u mA", pdo.SNKFixedPDO.VoltageIn50mVunits*50, pdo.SNKFixedPDO.OperationalCurrentIn10mAunits * 10);
	 ssd1306_SetCursor(0, 7 + i*7);
	 ssd1306_WriteString(pdo_info, Font_11x18, White);
 }
 ssd1306_UpdateScreen();

/* USER CODE END USBPD_DPM_SNK_EvaluateCapabilities */
}

I also have some code to manipulate the display in main() which is why I know the microcontroller is working. On a USB-A to USB-C cable nothing is changed on the screen, which means this function isn't getting called and its just getting 5V because its USB-A. On a USB C power supply it doesn't even turn on (no voltage is given), so I don't think this function is getting called or the negotiation is working at all, even though I've connected the UCPD CC lines to the port.

 

STM32CubeMx:

Nv7_0-1742192885965.png

 

I would greatly appreciate if someone helped me debug this!

10 REPLIES 10
BoSt
Associate II

Aha, ok! I have used STUSB4500 and as you say it works fine! But it would be nice to be able to use the functions in the MCU that are already on my board! 

 

Thanks!