/* ****************************************************************************** * * @file charger_module.c * @brief charger module * * * @version 1.0 * @date 2022/07/12 17:35:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2022/07/12 Alex build this file ****************************************************************************** */ /*_____ I N C L U D E S ____________________________________________________*/ #include "charger_module.h" #include "adc.h" #include "sys_tim.h" #include "discharge_module.h" #include "system.h" #include "vox_module.h" #include "led.h" bit Charger_Done = 0; #if CHARGER_ENABLE /******************************************************************************\ Macro definitions \******************************************************************************/ #define NTC_PRO_DEBOUNCE_TIM 10 /******************************************************************************\ Variables definitions \******************************************************************************/ //idata TE_CHG_STA ChgStatus; // 系统状态定义 //bit NTC_Low_Pro_Flag = 0; //bit NTC_High_Pro_Flag = 0; //bit NTC_CHG_02C_Flag = 0; //bit NTC_CHG_1C_Flag = 0; /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * void Charger_init(void) * * Description : Charger Initialization * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ #if 0 void Charger_Init(void) { SFRADDR = PMU_CTL1; SFRDATA |= 0x07; //电池低压检测 enable 信号;电池低压检测档位选择:3.3V /* Setting CV */ REG_CHG2 = 0x00; //0:4.20V;1:4.35V /* Setting CHG Current */ REG_CHG1 = 0x03; //000:100mA;001:200mA;010:250mA;011:300mA;100:350mA;101:400mA;110:450mA;111:500mA } #endif /* ******************************************************************************* * void Charger_Current_Set(void) * * Description : Charger Initialization * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ #if 0 void Charger_Current_Set(void) { uint16_t Charger_CurADC_Value = 0; /* 通过外部电阻ADC1值设置充电电流值 */ Charger_CurADC_Value = ADC_Chn_Value(ADC_CH1); /* Setting CV */ REG_CHG2 = 0x00; //0:4.20V;1:4.35V /* Setting CHG Current */ REG_CHG1 = 0x03; //000:100mA;001:200mA;010:250mA;011:300mA;100:350mA;101:400mA;110:450mA;111:500mA } #endif /* ******************************************************************************* * uint8_t Charger_NTC_Control(uint8_t Charge_sta) * * Description : Charger NTC Control * NTC 支持 103 和 104 电阻,NTC 温度检测由软件通过 ADC 采集 NTC 引脚电压。 * 如果支持电量计温度检测线性化,支持电量计方案 103 的 NTC 需要并一个 8.2k * 电阻(20uA 电流,103 NTC 需要串联 10k 电阻),104 的 NTC 并联 82k 电阻。 * 在使能充电前,软件先检测NTC 温度,如果 NTC 浮空,屏蔽 NTC 功能, * 并锁定;如果 NTC 下拉到 0V,关闭充电和放电。NTC 保护后,软件关闭充电, * 温度恢复正常并持续 100ms,再继续充电。 * * Arguments : NTC_Protect_Type_e NTC_Type:Shield 、JEITA or IEC;Charge_sta:Charge or not * Returns :NTC_Flag (0:Shield; 1:JEITA; 2:IEC) * Notes : NONE * ******************************************************************************* */ #if NTC_ENABLE uint8_t PMU_NTC_Control(void) { uint16_t NTC_Adc = 0; uint8_t nNTC_Pro_Flag = 0; static bit NTC_Low_Pro_Flag; static bit NTC_High_Pro_Flag; #if NTC_ENABLE NTC_Adc = ADC_NTC_Value(); #endif if(NTC_Adc >= 2000) ////屏蔽NTC功能,NTC浮空,屏蔽 NTC 功能,并锁定。 { return 1; } if(NTC_Adc <= T_0C && NTC_Adc > T_45C) //NTC正常 { if(NTC_Low_Pro_Flag) { if( NTC_Adc < T_3C ) { NTC_Low_Pro_Flag = 0; nNTC_Pro_Flag = 0; } else { nNTC_Pro_Flag = 1; } } if(NTC_High_Pro_Flag) { if( NTC_Adc > T_42C ) { NTC_High_Pro_Flag = 0; nNTC_Pro_Flag = 0; } else { nNTC_Pro_Flag = 1; } } } else //异常不充电 { if(NTC_Adc > T_0C) { NTC_Low_Pro_Flag = 1; } else if(NTC_Adc < T_45C) { NTC_High_Pro_Flag = 1; } nNTC_Pro_Flag = 1; } return nNTC_Pro_Flag; } #endif /* ******************************************************************************* * void Charger_Handler(void) * * Description : Charger Handle. ---- 充电过程除了根据 NTC 动态调节充电电流和截止电压外,其他由硬件控制。充电过程 发生异常,硬件进行相应处理,并发送标志位,软件可以进行相应处理。 * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ /* 1、充电超时:充电超时后,软件关闭充电使能,等待VIN拔出。 */ void Charger_Handler(void) { if( !(CHIP_STA4 & 0x80) ) //未检测到Power good,则关闭Charger使能后返回。 { CHG_CTL &= ~0x01; //Disable Charger IRQ_FLAG9 = 0x10; //未充电,需清Charg complete interrupt中断 Charger_Done = 0; return; } /*各项保护都无需软件处理,只处理充电超时,超时后需要等VBUS重新插拔后才重新开始Charger流程。*/ if ( IRQ_FLAG9 & 0x0C ) //充电超时,Tricle charg and Fast charge timeout { CHG_CTL &= ~0x01; //Disable Charger if ( IRQ_FLAG10 & 0xC0 ) //Plugin\Plugout interrupt { IRQ_FLAG9 = 0x0C; IRQ_FLAG10 = 0xC0; //Clear Plugin\Plugout interrupt } return; } else /*充电未超时,存在Plug则清Plugin\Plugout int*/ { if( IRQ_FLAG10 & 0xC0 ) { IRQ_FLAG10 = 0xC0; //Clear Plugin\Plugout interrupt } } #if NTC_ENABLE /*NTC Handle*/ //使能Charger前先检测NTC温度,异常就不开充电。(CHIP_STA4 & 0x80):PG if( PMU_NTC_Control() ) //NTC保护,不充电。 { CHG_CTL &= ~0x01; //Disable Charger. return; } #endif if( IRQ_FLAG9 & 0x10 ) //Charg complete interrupt { #if ADC_ENABLE #ifdef _DEBUG_CHARGER printf("Chg Done\r\n"); #endif if( Vbat_Adc < BAT_RECHARG ) { //CHG_CTL |= 0x01; //Enable Charger IRQ_FLAG9 = 0x10; #ifdef _DEBUG_CHARGER printf("En Chg\r\n"); #endif } else { CHG_CTL &= ~0x01; //Disable Charger #ifdef _DEBUG_CHARGER printf("Dis Chg\r\n"); #endif } Charger_Done = 1; #endif } else { CHG_CTL |= 0x01; //Enable Charger Charger_Done = 0; } } #endif