Browse Source

1. 初始上电设置电流为3.3A, 开启C口或者开启A口时,再设置电流为5.5A,延迟20ms后再开启gate

2. 修改PD更新src_cap问题
master
Jipeng.tang 4 weeks ago
parent
commit
b6e731b580
  1. BIN
      PD_CPS8841H_33W.zip
  2. 8
      PD_CPS8841H_33W/code/app/src/app_porta.c
  3. 4
      PD_CPS8841H_33W/code/app/src/app_spec.c
  4. 89
      PD_CPS8841H_33W/code/app/src/comm_event.c
  5. 2
      PD_CPS8841H_33W/code/app/src/main.c
  6. 7
      PD_CPS8841H_33W/code/app/src/ntc.c
  7. 80
      PD_CPS8841H_33W/code/component/src/comp_powerout.c
  8. 10
      PD_CPS8841H_33W/code/component/src/comp_protocol_manager.c
  9. 4
      PD_CPS8841H_33W/code/platform/protocol/pd_protocol/inc/pd_protocol.h
  10. 2
      PD_CPS8841H_33W/code/platform/protocol/pd_protocol/inc/pd_send_new_src_cap.h
  11. 23
      PD_CPS8841H_33W/code/platform/protocol/pd_protocol/src/pd_send_new_src_cap.c
  12. 2
      PD_CPS8841H_33W/code/platform/protocol/pd_protocol/src/pd_typec_detect_patch.c
  13. 6
      PD_CPS8841H_33W/code/platform/protocol/qc_protocol/src/qc_protocol.c
  14. 2
      PD_CPS8841H_33W/code/prl_portable/inc/pd.h
  15. 37
      PD_CPS8841H_33W/code/prl_portable/src/pd.c

BIN
PD_CPS8841H_33W.zip

Binary file not shown.

8
PD_CPS8841H_33W/code/app/src/app_porta.c

@ -86,20 +86,12 @@ static void app_porta_detect_work(void)
if(attached)
{
// 需要判断当前C口走的是什么协议, 再去更新对应的能力. 更新typeC的src_cap
// pd_dpm_update_source_cap(&g_pd_port, &g_pd_port.pd_curr_config->src_cap_info[SRC_CAP_20W], SRC_CAP_20W);
// pd_restart_send_src_cap(&g_pd_port);
usba_plugin_detect_deinit();
usba_plugout_detect_init();
log_info("usba attached\n");
}
else
{
// 更新typeC的src_cap
// pd_dpm_update_source_cap(&g_pd_port, &g_pd_port.pd_curr_config->src_cap_info[SRC_CAP_30W], SRC_CAP_30W);
// pd_restart_send_src_cap(&g_pd_port);
usba_plugout_detect_deinit();
usba_plugin_detect_init(USBA_PLUGIN_DETECT_LEVEL_LOW);
log_info("usba detached\n");

4
PD_CPS8841H_33W/code/app/src/app_spec.c

@ -157,8 +157,8 @@ uint8_t system_init(void)
drv_delay_ms(DELAY_5MS);
user_app.current_src_cap_idx = SRC_CAP_30W;
user_app.first_power_cnt = DELAY_10S;
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_30W);
// user_app.first_power_cnt = DELAY_10S;
return true;
}

89
PD_CPS8841H_33W/code/app/src/comm_event.c

@ -29,6 +29,8 @@ void ufcs_power_change_patch(uint16_t src_cap_idx)
// 参数1: 需要更新多少到多少W的src_cap 参数2: 是否需要重新发送src_cap
void updata_diff_protocol_cap(uint16_t src_cap_idx, bool send_src_cap)
{
pd_restart_send_src_cap(&g_pd_port, src_cap_idx);
/*
// 根据当前走的协议是什么,去更新对应的src_cap
if(dpdm_power_get_next_protocol() == PROTOCOL_UNKNOWN
|| dpdm_power_get_next_protocol() == PROTOCOL_APPLE
@ -39,22 +41,22 @@ void updata_diff_protocol_cap(uint16_t src_cap_idx, bool send_src_cap)
return;
}
log_info("%d %d %d\n",
user_app.current_src_cap_idx,
src_cap_idx,
dpdm_power_get_next_protocol());
user_app.current_src_cap_idx = src_cap_idx;
// log_info("%d %d %d\n",
// user_app.current_src_cap_idx,
// src_cap_idx,
// dpdm_power_get_next_protocol());
switch(dpdm_power_get_next_protocol())
{
case PROTOCOL_PD_FIX:
case PROTOCOL_PD_PPS:
pd_dpm_update_source_cap(&g_pd_port, &g_pd_port.pd_curr_config->src_cap_info[src_cap_idx], src_cap_idx);
log_info("%s %d\n", __func__, __LINE__);
// pd_dpm_update_source_cap(&g_pd_port, &g_pd_port.pd_curr_config->src_cap_info[src_cap_idx], src_cap_idx);
if(send_src_cap)
{
pd_restart_send_src_cap(&g_pd_port);
pd_restart_send_src_cap(&g_pd_port, src_cap_idx);
}
break;
@ -62,14 +64,15 @@ void updata_diff_protocol_cap(uint16_t src_cap_idx, bool send_src_cap)
case PROTOCOL_SCP:
break;
#if UFCS_DERATE_SUPPORT
#if UFCS_DERATE_SUPPORT
case PROTOCOL_UFCS:
// 为了避免撞包问题, 按协议规定12ms内没收到包才发power_change
user_app.ufcs_need_send_power_change = true;
break;
#endif
#endif
}
*/
}
// 端口状态机
@ -116,20 +119,20 @@ void port_status_run(void)
if(user_app.ntc_triggered_dera)
{
user_app.current_src_cap_idx = SRC_CAP_7W;
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_7W);
}
else
{
user_app.current_src_cap_idx = SRC_CAP_30W;
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_30W);
}
#else
user_app.current_src_cap_idx = SRC_CAP_30W;
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_30W);
#endif
// 什么都没接时, 也是用buck给A口供电来检查A口是否插入
buck_control(true);
drv_delay_ms(5);
drv_delay_ms(4);
dpdm_power_a1_gate_enable(false);
}
else
@ -145,7 +148,7 @@ void port_status_run(void)
port_process_status = port_exit_status;
// 单C口时, 常开buck, 关闭gateA, 等A口有拉电流才反过来
buck_control(true);
drv_delay_ms(5);
drv_delay_ms(4);
dpdm_power_a1_gate_enable(false);
}
else
@ -157,20 +160,15 @@ void port_status_run(void)
if(user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_7W)
{
updata_diff_protocol_cap(SRC_CAP_7W, true);
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_7W);
}
else if(!user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_30W)
{
updata_diff_protocol_cap(SRC_CAP_30W, true);
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_30W);
}
#else
if(user_app.current_src_cap_idx != SRC_CAP_30W)
{
updata_diff_protocol_cap(SRC_CAP_30W, true);
}
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_30W);
#endif
break;
@ -182,7 +180,7 @@ void port_status_run(void)
// 单A口
dpdm_power_a1_gate_enable(true);
drv_delay_ms(5);
drv_delay_ms(4);
buck_control(false);
}
else
@ -193,6 +191,21 @@ void port_status_run(void)
break;
case TYPEC_USBA_INSER:
#if NTC_ENABLE
if(user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_7W)
{
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_7W);
}
else if(!user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_20W)
{
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_20W);
}
#else
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_20W);
#endif
if(port_process_status == port_enter_status)
{
port_process_status = port_exit_status;
@ -204,13 +217,13 @@ void port_status_run(void)
comp_set_current(&g_powerout_info, CURRENT_5P5A); // 需要立刻设置
// 是否有可能电流环设置的没那么快, 一打开gateA就被拉挂了? 需要加个延迟等电流环设置完再开A?
dpdm_power_a1_gate_enable(true);
drv_delay_ms(5);
drv_delay_ms(4);
buck_control(false);
}
else
{
buck_control(true);
drv_delay_ms(5);
drv_delay_ms(4);
dpdm_power_a1_gate_enable(false);
}
}
@ -222,7 +235,7 @@ void port_status_run(void)
{
// todo: 看看是否需要延迟个1ms等待buck完全开启再关gateA
buck_control(true);
drv_delay_ms(5);
drv_delay_ms(4);
dpdm_power_a1_gate_enable(false);
}
else if(g_powerout_info.set_vol < VOLTAGE_5P5V
@ -231,31 +244,11 @@ void port_status_run(void)
{
comp_set_current(&g_powerout_info, CURRENT_5P5A); // 需要立刻设置
dpdm_power_a1_gate_enable(true);
drv_delay_ms(5);
drv_delay_ms(4);
buck_control(false);
}
}
#if NTC_ENABLE
if(user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_7W)
{
updata_diff_protocol_cap(SRC_CAP_7W, true);
}
else if(!user_app.ntc_triggered_dera && user_app.current_src_cap_idx != SRC_CAP_20W)
{
updata_diff_protocol_cap(SRC_CAP_20W, true);
}
#else
if(user_app.current_src_cap_idx != SRC_CAP_20W)
{
updata_diff_protocol_cap(SRC_CAP_20W, true);
}
#endif
break;
}

2
PD_CPS8841H_33W/code/app/src/main.c

@ -119,7 +119,7 @@ static const periodic_work_entry_s app_works[] =
#endif
PERIODIC_WORK_ENTRY(1, 0, comm_event),
PERIODIC_WORK_ENTRY(4, 3, app_port_a1_work),
PERIODIC_WORK_ENTRY(1024, 0, log_output),
// PERIODIC_WORK_ENTRY(1024, 0, log_output),
};
static void app_periodic_work(void)

7
PD_CPS8841H_33W/code/app/src/ntc.c

@ -26,7 +26,7 @@ void ntc_init(void)
void ntc_run(void)
{
uint16_t ntc_val = 0;
static uint16_t ntc_derat_cnt = 0, ntc_recove_cnt = 0;
static uint8_t ntc_derat_cnt = 0, ntc_recove_cnt = 0;
ntc_val = COMP_ADC_GET_RT1_VOL();
@ -69,10 +69,7 @@ void ntc_run(void)
|| dpdm_power_get_next_protocol() == PROTOCOL_PD_PPS)
{
// 复位协议,屏蔽PD协议, DPDN恢复短接, 电压要降回5V
if(user_app.current_src_cap_idx != SRC_CAP_7W)
{
updata_diff_protocol_cap(SRC_CAP_7W, true);
}
pd_restart_send_src_cap(&g_pd_port, SRC_CAP_7W);
}
else
{

80
PD_CPS8841H_33W/code/component/src/comp_powerout.c

@ -63,11 +63,19 @@ void comp_powerout_default_set(comp_powerout_info_s *powerout_info)
{
pwr_request_s pwr_request =
{
.request_cur = CURRENT_5P5A,
.request_cur = CURRENT_3P3A,
.request_vol = VOLTAGE_5V,
};
// log_info("powr_def\n");
// A + C同在时, CC设为5.5A
if(typec_is_attched()
&& port_a1_is_attached()
&& pwr_request.request_vol < VOLTAGE_5P5V)
{
pwr_request.request_cur = CURRENT_5P5A;
}
log_info("powr_def, set_cur:%d\n", pwr_request.request_cur);
powerout_info->set_vol = pwr_request.request_vol;
powerout_info->set_current = pwr_request.request_cur;
@ -202,8 +210,6 @@ void comp_powerout_shutdown_machine(comp_powerout_info_s *powerout_info)
{
log_info("pwr_shut\n");
comp_powerout_default_set(powerout_info);
// comp_powerout_prl_set_viout(VOLTAGE_5V, CURRENT_3P3A);
powerout_info->power_state = PWR_RDY_CHECK;
}
@ -242,7 +248,7 @@ void comp_powerout_transmit_machine(comp_powerout_info_s *powerout_info)
if(powerout_info->set_vol > VOLTAGE_5V)
{
buck_control(true);
drv_delay_ms(5);
drv_delay_ms(4);
dpdm_power_a1_gate_enable(false);
}
}
@ -355,35 +361,35 @@ void comp_powerout_ready_machine(comp_powerout_info_s *powerout_info)
// 单C口且无协议时,电流设回正常的 3.3A
// 单A口且无协议时,电流设回正常的 3.3A
// 这个后续的时间暂时定为2秒
if(user_app.first_power_cnt == 0)
{
if(typec_is_attched()
&& !port_a1_is_attached()
)
{
if(dpdm_power_get_next_protocol() == PROTOCOL_UNKNOWN
|| dpdm_power_get_next_protocol() == PROTOCOL_APPLE
|| dpdm_power_get_next_protocol() == PROTOCOL_DCP
|| dpdm_power_get_next_protocol() == PROTOCOL_QC_PRE)
{
pwr_request.request_cur = CURRENT_3P4A;
}
}
// if(user_app.first_power_cnt == 0)
// {
// if(typec_is_attched()
// && !port_a1_is_attached()
// )
// {
// if(dpdm_power_get_next_protocol() == PROTOCOL_UNKNOWN
// || dpdm_power_get_next_protocol() == PROTOCOL_APPLE
// || dpdm_power_get_next_protocol() == PROTOCOL_DCP
// || dpdm_power_get_next_protocol() == PROTOCOL_QC_PRE)
// {
// pwr_request.request_cur = CURRENT_3P4A;
// }
// }
if(!typec_is_attched()
&& port_a1_is_attached()
//&& (pwr_request.request_vol <= VOLTAGE_5P5V)
)
{
if(dpdm_power_get_next_protocol() == PROTOCOL_UNKNOWN
|| dpdm_power_get_next_protocol() == PROTOCOL_APPLE
|| dpdm_power_get_next_protocol() == PROTOCOL_DCP
|| dpdm_power_get_next_protocol() == PROTOCOL_QC_PRE)
{
pwr_request.request_cur = CURRENT_3P4A;
}
}
}
// if(!typec_is_attched()
// && port_a1_is_attached()
// //&& (pwr_request.request_vol <= VOLTAGE_5P5V)
// )
// {
// if(dpdm_power_get_next_protocol() == PROTOCOL_UNKNOWN
// || dpdm_power_get_next_protocol() == PROTOCOL_APPLE
// || dpdm_power_get_next_protocol() == PROTOCOL_DCP
// || dpdm_power_get_next_protocol() == PROTOCOL_QC_PRE)
// {
// pwr_request.request_cur = CURRENT_3P4A;
// }
// }
// }
if((powerout_info->last_vol != pwr_request.request_vol) ||
@ -440,6 +446,14 @@ void comp_powerout_open_nmos(void)
goto end;
}
// 开C口MOS前, 判断如果A口负载也在, 则把电流加大到5.5A
if(port_a1_is_attached()
&& g_powerout_info.set_vol < VOLTAGE_5P5V)
{
comp_set_current(&g_powerout_info, CURRENT_5P5A); // 需要立刻设置
drv_delay_ms(20); // 等待CC环设置完成
}
g_powerout_info.powerout_flags.bf.gate_states = true;
comp_port_nmos_ctrl(GATE_C, true);
end:

10
PD_CPS8841H_33W/code/component/src/comp_protocol_manager.c

@ -35,6 +35,16 @@ void buck_control(bool enable)
void dpdm_power_a1_gate_enable(bool is_en)
{
log_info("GATEA:%d\n", is_en);
// 开C口MOS前, 判断如果A口负载也在, 则把电流加大到5.5A
if(is_en
&& typec_is_attched()
&& g_powerout_info.set_vol < VOLTAGE_5P5V)
{
comp_set_current(&g_powerout_info, CURRENT_5P5A); // 需要立刻设置
drv_delay_ms(20); // 等待CC环设置完成
}
comp_port_nmos_ctrl(GATE_A, is_en);
}

4
PD_CPS8841H_33W/code/platform/protocol/pd_protocol/inc/pd_protocol.h

@ -121,8 +121,8 @@ typedef struct pd_port_s
uint8_t pd_send_new_src_cap_enable;
uint8_t pd_new_src_pdo;
const pd_pdo_info_s *pd_old_src_pdo;
// uint8_t pd_new_src_pdo;
// const pd_pdo_info_s *pd_old_src_pdo;
#if TYPEC_INSERT_DEBOUNCE_SUPPORT
typec_inseret_deb_infos_s typec_inseret_deb_infos;

2
PD_CPS8841H_33W/code/platform/protocol/pd_protocol/inc/pd_send_new_src_cap.h

@ -10,5 +10,5 @@
void pd_new_src_cap_update_work(pd_port_s *pd_port);
void pd_dpm_update_source_cap(pd_port_s *pd_port, const pd_pdo_info_s *pdo, uint8_t src_cap_idx);
void pd_restart_send_src_cap(pd_port_s *pd_port);
void pd_restart_send_src_cap(pd_port_s *pd_port, uint8_t src_cap_idx);
#endif

23
PD_CPS8841H_33W/code/platform/protocol/pd_protocol/src/pd_send_new_src_cap.c

@ -5,21 +5,28 @@ void pd_dpm_update_source_cap(pd_port_s *pd_port, const pd_pdo_info_s *pdo, uint
{
pd_param_s *pd_param = &pd_port->pd_prl_param;
pd_port->pd_new_src_pdo = src_cap_idx;
// pd_port->pd_new_src_pdo = src_cap_idx;
log_info("updata src_cap:%d\n", src_cap_idx);
log_info("cnt:%d\n", pdo->pdo_cnt);
pd_param->pd_assist.src_cap_send.pdo_cnt = pdo->pdo_cnt;
memcpy(&pd_param->pd_assist.src_cap_send.pd_pdos[0].byte, &pdo->pdo0, 28);
//src ext
pd_param->pd_assist.pd_scedb.scedb_bits.src_pdp = pdo->src_pdp;
if(!pd_port->pd_send_new_src_cap_enable)
pd_port->pd_old_src_pdo = pdo;
// if(!pd_port->pd_send_new_src_cap_enable)
// pd_port->pd_old_src_pdo = pdo;
}
void pd_restart_send_src_cap(pd_port_s *pd_port)
void pd_restart_send_src_cap(pd_port_s *pd_port, uint8_t src_cap_idx)
{
if(user_app.current_src_cap_idx == src_cap_idx)
{
return;
}
pd_port->pd_send_new_src_cap_enable = true;
user_app.current_src_cap_idx = src_cap_idx;
}
@ -45,15 +52,17 @@ void pd_new_src_cap_update_work(pd_port_s *pd_port)
(pd_param->pd_pe_status.pe_status == PE_SRC_Startup)
)
{
// log_info("%s %d\n", __func__, __LINE__);
log_info("send_cap:%d\n", user_app.current_src_cap_idx);
pd_dpm_update_source_cap(pd_port,
&pd_port->pd_curr_config->src_cap_info[pd_port->pd_new_src_pdo],
pd_port->pd_new_src_pdo);
&pd_port->pd_curr_config->src_cap_info[user_app.current_src_cap_idx],
user_app.current_src_cap_idx);
pd_port->pd_send_new_src_cap_enable = false;
if(pd_param->pd_pe_status.pe_status != PE_SRC_Startup)
{
log_info("send_cap:%d\n", pd_port->pd_send_new_src_cap_enable);
// log_info("send_cap:%d\n", user_app.current_src_cap_idx);
pd_param->pd_flags.pd_process_flag.bits.ams_start_flag = (pd_param->pd_assist.pd_spec_rev == PD_VER);
pd_param->pd_pe_status.pe_status = PE_SRC_Send_Capabilities;
pd_param->pd_pe_status.pe_process_status = pd_entry_status;

2
PD_CPS8841H_33W/code/platform/protocol/pd_protocol/src/pd_typec_detect_patch.c

@ -111,7 +111,7 @@ static void pd_update_typec_connect_sta(pd_port_s *pd_port)
{
typec_reset(pd_port);
dpdm_reset();
log_info("%s %d\n", __func__, __LINE__);
// log_info("%s %d\n", __func__, __LINE__);
}
if((pd_param->typec_status.typec_process_status == typec_enter_status) &&

6
PD_CPS8841H_33W/code/platform/protocol/qc_protocol/src/qc_protocol.c

@ -67,12 +67,6 @@ void qc_voltage_request_work(qc_port_s *qc_port)
{
iset = CURRENT_3P4A;
// A + C 且都在5V时, 在powerout里会把电流设为5.5A
// 仅测试,单A口时,实际设置3.3A能出4A
// if(!typec_is_attched() && port_a1_is_attached())
// {
// iset = CURRENT_3P3A - 400;
// }
}
else if(qc_param->qc_assist.request_vol == 9000)
{

2
PD_CPS8841H_33W/code/prl_portable/inc/pd.h

@ -35,7 +35,7 @@ static inline void pd_port_typec_prl_handler(pd_port_s *pd_port)
static inline void pd_port_restart_send_src_cap(pd_port_s *pd_port, const pd_pdo_info_s *new_src_pdo)
{
pd_restart_send_src_cap(pd_port);
// pd_restart_send_src_cap(pd_port);
}

37
PD_CPS8841H_33W/code/prl_portable/src/pd.c

@ -47,29 +47,36 @@ void pd_src_cap_msg_assemble_patch(pd_param_s *pd_param)
uint16_t i;
pdo_cnt = pd_param->pd_assist.src_cap_send.pdo_cnt;
// log_info("%s %d\n", __func__, __LINE__);
// log_info("pdo_cnt%d idx:%d\n", pdo_cnt, user_app.current_src_cap_idx);
pd_dpm_update_source_cap(&g_pd_port,
&g_pd_port.pd_curr_config->src_cap_info[user_app.current_src_cap_idx],
user_app.current_src_cap_idx);
pd_src_cap_msg_assemble(pd_param);
//find pps_pdo cnt
for(i = 0; i < pdo_cnt; i++)
{
if(pd_param->pd_assist.src_cap_send.pd_pdos[i].base.type == PD_PDO_TYPE_AUG &&
pd_param->pd_assist.src_cap_send.pd_pdos[i].SRC_PPS_PDO_bits.Programmable_Pwr_Supply == PD_PDO_AUG_TYPE_SPR)
{
pps_cnt++;
}
}
// for(i = 0; i < pdo_cnt; i++)
// {
// if(pd_param->pd_assist.src_cap_send.pd_pdos[i].base.type == PD_PDO_TYPE_AUG &&
// pd_param->pd_assist.src_cap_send.pd_pdos[i].SRC_PPS_PDO_bits.Programmable_Pwr_Supply == PD_PDO_AUG_TYPE_SPR)
// {
// pps_cnt++;
// }
// }
pdo_cnt -= (pd_param->pd_assist.pd_spec_rev == 1) ? pps_cnt : 0;
// pdo_cnt -= (pd_param->pd_assist.pd_spec_rev == 1) ? pps_cnt : 0;
uint8_t len;
pd_data_msg_header_assemble(Data_Source_Cap, pdo_cnt, &pd_param->pd_assist);
// uint8_t len;
// pd_data_msg_header_assemble(Data_Source_Cap, pdo_cnt, &pd_param->pd_assist);
len = pdo_cnt * 4;
// len = pdo_cnt * 4;
memcpy(&pd_param->pd_assist.pd_sent_pkt.pd_sent_buf[2], &pd_param->pd_assist.src_cap_send.pd_pdos[0].byte[0], len);
// memcpy(&pd_param->pd_assist.pd_sent_pkt.pd_sent_buf[2], &pd_param->pd_assist.src_cap_send.pd_pdos[0].byte[0], len);
pd_param->pd_assist.pd_sent_pkt.length = len + 2;
pd_param->pd_flags.pd_prl_flag.prl_packet_recived_from_pe = true;
// pd_param->pd_assist.pd_sent_pkt.length = len + 2;
// pd_param->pd_flags.pd_prl_flag.prl_packet_recived_from_pe = true;
}

Loading…
Cancel
Save