2020-08-26 03:01 AM
Hi STteam,
my name is Himavanth, working as an Embedded Engineer at Supralax Electronics Pvt.Ltd. please have a look at the problem.
@brief : We are working PD source solution(i.e. 60Watt (20V @ 3A max)) using STM32G081RBT6. We are taking USB-PD_Provider_1port as an Base reference project.
@Reference : I have gone through each and every line of UM2552 reference manual I found really good information to setup the USBPD stack.
@context:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usbpd_pdo_defs.h
* @author MCD Application Team
* @brief Header file for definition of PDO/APDO values for 2 ports(DRP/SNK) configuration
******************************************************************************
*
* Copyright (c) 2018 STMicroelectronics. All rights reserved.
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* USER CODE END Header */
#ifndef __USBPD_PDO_DEF_H_
#define __USBPD_PDO_DEF_H_
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Define ------------------------------------------------------------------*/
/* USER CODE BEGIN Define */
/* USER CODE END Define */
/* Exported typedef ----------------------------------------------------------*/
/* USER CODE BEGIN typedef */
/**
* @brief USBPD Port PDO Structure definition
*
*/
/* USER CODE END typedef */
/* Exported define -----------------------------------------------------------*/
/* USER CODE BEGIN Exported_Define */
#define USBPD_CORE_PDO_SRC_FIXED_MAX_CURRENT 3
#define USBPD_CORE_PDO_SNK_FIXED_MAX_CURRENT 1500
/* USER CODE END Exported_Define */
/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN constants */
/* USER CODE END constants */
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN macro */
/* USER CODE END macro */
/* Exported variables --------------------------------------------------------*/
/* USER CODE BEGIN variables */
/* USER CODE END variables */
#ifndef __USBPD_PWR_IF_C
extern const uint32_t PORT0_PDO_ListSRC[USBPD_MAX_NB_PDO];
extern const uint32_t PORT0_PDO_ListSNK[USBPD_MAX_NB_PDO];
extern const uint32_t PORT1_PDO_ListSRC[USBPD_MAX_NB_PDO];
extern const uint32_t PORT1_PDO_ListSNK[USBPD_MAX_NB_PDO];
#else
/* Definition of Source PDO for Port 0 */
const uint32_t PORT0_PDO_ListSRC[USBPD_MAX_NB_PDO] =
{
/* PDO 1 */
(0x0201912CU),
/* PDO 2 */
(0x00000000U),
/* PDO 3 */
(0x00000000U),
/* PDO 4 */
(0x00000000U),
/* PDO 5 */
(0x00000000U),
/* PDO 6 */
(0x00000000U),
/* PDO 7 */
(0x00000000U)
};
/* Definition of Sink PDO for Port 0 */
const uint32_t PORT0_PDO_ListSNK[USBPD_MAX_NB_PDO] =
{
/* PDO 1 */
(0x00000000U),
/* PDO 2 */
(0x00000000U),
/* PDO 3 */
(0x00000000U),
/* PDO 4 */
(0x00000000U),
/* PDO 5 */
(0x00000000U),
/* PDO 6 */
(0x00000000U),
/* PDO 7 */
(0x00000000U)
};
#endif
/* Exported functions --------------------------------------------------------*/
/* USER CODE BEGIN functions */
/* USER CODE END functions */
#ifdef __cplusplus
}
#endif
#endif /* __USBPD_PDO_DEF_H_ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
@Quetions :
Note : I couldn't initialize the PDO's as stated in UM2552 page No. 21
Thanks & Regards
Himavanth
Solved! Go to Solution.
2020-09-02 05:45 AM
I found 2 missing codes in your environment:
(usbpd_dpm_user.c)
USBPD_StatusTypeDef USBPD_DPM_UserInit(void)
{
/* USER CODE BEGIN USBPD_DPM_UserInit */
/* PWR SET UP */
if(USBPD_OK != USBPD_PWR_IF_Init())
{
return USBPD_ERROR;
}
return USBPD_OK;
/* USER CODE END USBPD_DPM_UserInit */
}
(usbpd_pwr_if.c)
USBPD_StatusTypeDef USBPD_PWR_IF_SearchRequestedPDO(uint8_t PortNum, uint32_t RdoPosition, uint32_t *Pdo)
{
/* USER CODE BEGIN USBPD_PWR_IF_SearchRequestedPDO */
if((RdoPosition == 0) || (RdoPosition > *PWR_Port_PDO_Storage[PortNum].SourcePDO.NumberOfPDO))
{
/* Invalid PDO index */
return USBPD_FAIL;
}
*Pdo = PWR_Port_PDO_Storage[PortNum].SourcePDO.ListOfPDO[RdoPosition - 1];
return USBPD_OK;
/* USER CODE END USBPD_PWR_IF_SearchRequestedPDO */
}
2020-08-27 04:56 AM
Please Kindly someone help me out to get out of this problem. any help will be greatly appreciated. Thank you.
Please let me know if need more info about the project to get better understanding.
2020-08-31 02:17 AM
Dear @HGorl.1 ,
Power negociation follows the AMS described in UM2552 in 'Figure 24. SRC power negotiation':
You should update your function ''
/**
* @brief Allow PDO data reading from PWR_IF storage.
* @param PortNum Port number
* @param DataId Type of data to be read from PWR_IF
* This parameter can be one of the following values:
* @arg @ref USBPD_CORE_DATATYPE_SRC_PDO Source PDO reading requested
* @arg @ref USBPD_CORE_DATATYPE_SNK_PDO Sink PDO reading requested
* @param Ptr Pointer on address where PDO values should be written (u8 pointer)
* @param Size Pointer on nb of u32 written by PWR_IF (nb of PDOs)
* @retval None
*/
void USBPD_PWR_IF_GetPortPDOs(uint8_t PortNum, USBPD_CORE_DataInfoType_TypeDef DataId, uint8_t *Ptr, uint32_t *Size)
{
if (DataId == USBPD_CORE_DATATYPE_SRC_PDO)
{
*Size = PORT0_NB_SOURCEPDO;
memcpy(Ptr,PORT0_PDO_ListSRC, sizeof(uint32_t) * PORT0_NB_SOURCEPDO);
}
/* USER CODE BEGIN USBPD_PWR_IF_GetPortPDOs */
*Size = 0;
switch(DataId)
{
case USBPD_CORE_DATATYPE_SRC_PDO :
{
*Size = PORT0_NB_SOURCEPDO;
memcpy(Ptr,PORT0_PDO_ListSRC, sizeof(uint32_t) * PORT0_NB_SOURCEPDO);
}
break;
default :
break;
}
/* USER CODE END USBPD_PWR_IF_GetPortPDOs */
}
If you want to have more details, you can refer to the demonstration code available under:
Regards,
Yohann
2020-09-01 03:01 AM
Hi Yohann,
It's really good to here from you. Thank you very much for Your reply.
Please have a look at the picture attached below. This when Discovery kit from ST attached to custom board after programming. (Note : we are working to Develop code from USB-PD_Provider_1port & code changes suggested in previous disscussion have been made, even though thing not working properly)
Please have a look at the files by going through the link:
https://drive.google.com/drive/folders/1enntGvObHZ_xGk3DRsqFqliGJxErmrvz?usp=sharing
Thanks & Regards
-Himavanth
2020-09-01 05:53 AM
Answer to your questions:
#define PORT0_NB_SOURCEAPDO 1 /* Number of Source APDOs (applicable for port 0) */
/* PDO 4 */
( (((PWR_A_50MA(USBPD_PDO_APDO_9VPROG_45W_MAX_CURRENT)) << USBPD_PDO_SRC_APDO_MAX_CURRENT_Pos) & (USBPD_PDO_SRC_APDO_MAX_CURRENT_Msk)) |
(((PWR_V_100MV(USBPD_PDO_APDO_5VPROG_MIN_VOLTAGE)) << USBPD_PDO_SRC_APDO_MIN_VOLTAGE_Pos) & (USBPD_PDO_SRC_APDO_MIN_VOLTAGE_Msk)) |
(((PWR_V_100MV(USBPD_PDO_APDO_5VPROG_MAX_VOLTAGE)) << USBPD_PDO_SRC_APDO_MAX_VOLTAGE_Pos) & (USBPD_PDO_SRC_APDO_MAX_VOLTAGE_Msk)) |
USBPD_PDO_TYPE_APDO
2020-09-01 06:19 AM
Hi Yohann,
thank you for the quick reply.
As you mentioned in the previous post I do fallow the link and I found lot of code changes to from the DemoUCPD to USB-PD_Provider_1port.
I found changes in the following files usbpd_pwr_if.h&c, usbpd_dpm_core.h&c, usbpd_dpm_user.h&c and usbpd_core.h.
I suspect should need changes in the above mentioned files as well Kindly suggest changes changes to files mentioned above.
Explanation to 3rd reply:
you are right ! we are using Discovery kit as sink and our custom(proprietary board from the organization) board as source, and the image I attached is form sink configuration side one only.
with the image attached above I found Source is not communicating Properly because of Source PE held at reset set. if my assumption is correct please conform it.
Thanks & Regards
2020-09-01 06:50 AM
Hi @HGorl.1 ,
DemoUCPD is the complete application which supports main feature on our stack (dual port with DRP on 1 port and sink on the other one, GUI, PPS...) Idea with simple provider application generated with CubeMx was to provide a very simple SRC application to allow to negotiate a contract to 5V/3A.
I have no more suggestions to provide to you. It should work as it is. Idea is to add your own code linked to your needs (adding PDO ?) in the basic application (in taking demonstration as code example).
The image I attached is a EVAL board using the Provider application connected to the G0-DISCO board. There are no issues, just few SRC capability messages re transmission and finally request message sent by the disco.
Regards,
Yohann
2020-09-01 08:14 AM
Hi Yohann,
I made the code changes as you suggested in previous reply(Note: there is no issue with the code compilation and flashing).
here is my templates after code change:
https://drive.google.com/drive/folders/1oEnx2D1jopgg8K7rKq7fLmwjsA7IKEm3?usp=sharing
I found there is still issue with exchanging source capabilities to sink.
please have look at the fallowing template :
/**
* @brief Initialize DPM (port power role, PWR_IF, CAD and PE Init procedures)
* @retval USBPD Status
*/
USBPD_StatusTypeDef USBPD_DPM_UserInit(void)
{
/* USER CODE BEGIN USBPD_DPM_UserInit */
return USBPD_OK;
/* USER CODE END USBPD_DPM_UserInit */
}
Even few functions in usbpd_dpm_user.c are not initialized properl, I made changes to this template Even though nothing is working out.
Note:
I found few things during debugging process I hope these might help you to understand problem.
In my side, I put a breakpoint inUSBPD_PE_TaskWakeUp & USBPD_PE_Task function and it was not raised !
/**
* @brief WakeUp PE task
* @param PortNum port number
* @retval None
*/
static void USBPD_PE_TaskWakeUp(uint8_t PortNum)
{
osMessagePut(PEQueueId[PortNum], 0xFFFF, 0);
}
/**
* @brief Main task for PE layer
* @param argument Not used
* @retval None
*/
void USBPD_PE_Task(void const *argument)
{
uint8_t _port = (uint32_t)argument;
for (;;)
{
osMessageGet(PEQueueId[_port], USBPD_PE_StateMachine_SRC(_port));
}
}
I put a breakpoint in USBPD_PE_TaskWakeUp & USBPD_CAD_Task and control is encountered both points(before cable attaching itself).
As of my knowledge USBPD_CAD_Task should be encountered right after cable attaching. if my assumption is correct please revert back with Yes.
Thanks & regards
2020-09-01 08:46 AM
You forgot to enable different UCPD handler and DPM counter in stm32g0it_xx.c:
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
extern void USBPD_DPM_TimerCounter(void);
USBPD_DPM_TimerCounter();
/* USER CODE END SysTick_IRQn 0 */
(...)
/**
* @brief This function handles UCPD1 and UCPD2 interrupts / UCPD1 and UCPD2 wake-up interrupts through EXTI lines 32 and 33.
*/
void UCPD1_2_IRQHandler(void)
{
/* USER CODE BEGIN UCPD1_2_IRQn 0 */
extern void USBPD_PORT0_IRQHandler(void);
USBPD_PORT0_IRQHandler();
/* USER CODE END UCPD1_2_IRQn 0 */
Do not hesitate to have a look at our Wiki page. We already highlighted such issues:
May I suggest you to enable TRACER_EMB in your environment? It will allow you to get USB-PD debug traces.
Yohann
2020-09-02 05:02 AM
Hi Yohann,
Thank you for the reply.
I made few code changes suggested by you. Sorry I can't provide TRACER_EMB facility as we are using SWD debugger instead of JTAG debuggers.
I found JTAG debug facility is necessary for USBPD debug trace so I can't provide you the source side trace.
please have a look at the responds when I connected STM32G071B-DISCO in stand alone mode.
Note: Trace is from Sink device( STM32G071B-DISCO )attached to our Custom board.
Even after the code changes I couldn't find the source capabilities but I am getting the GoodCRC. I have gone through the wiki link provided by you I found few information relating to previous suggestion made by you.
Please Do have patience to have a look at debugging observation after cable connection:
Thanks & Regards