单片机 N76E003 实现 QC2.0 QC3.0 USB Type-C协议

单片机 N76E003 实现 QC2.0 QC3.0 USB Type-C协议_第1张图片

/*************笔记****************
1、本QC方案采用PWM调节电压。
2、
3、
4、
5、
***********************************/
/* -----------------------------------------宏定义-----------------------------------------*/
#define Voltage_06_PWM 18 //0.6V的占空比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/
xdata uint8_t  QC_Mode_Choice = 0;       //0--不使用QC协议  1--QC2.0   2--QC3.0
xdata uint8_t  QC20_Voltage_Choice = 0;  //0--默认5V        1--9V      2--12V     3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void)
{
    if (QC_Mode_Choice == 1) //QC2.0
    {
        switch (QC20_Voltage_Choice)
        {
            case 0: //D+ -->0  D- -->0    ==>5V  或者 握手重置
                USBDP_PWM(0);
                USBDM_PWM(0);
                break;
            case 1://D+ -->3.3  D- -->0.6 ==>9V
                USBDP_PWM(100);
                USBDM_PWM(Voltage_06_PWM);
                break;
            case 2://D+ -->0.6  D- -->0.6 ==>12V
                USBDP_PWM(Voltage_06_PWM);
                USBDM_PWM(Voltage_06_PWM);
                break;
            case 3://D+ -->3.3  D- -->3.3 ==>20V  如果不支持则无变化
                USBDP_PWM(100);
                USBDM_PWM(100);
                break;
            default:
                break;
        }
    }
    else if (QC_Mode_Choice == 2)//QC3.0
    {
        //D+ -->0.6  D- -->3.3 ==>进入QC3.0模式或者连续模式 (充电头如果不支持那么)
        USBDP_PWM(Voltage_06_PWM);
        USBDM_PWM(100);
    }
}

void QC30_Add_Voltage(void)
{
    if (QC_Mode_Choice == 2)
    {
        //D+ -->3.3  -->100ms -->D+ -->0.6   ==>QC3.0模式 增加电压
        USBDP_PWM(100);
        os_wait(K_IVL, 100, 0);//500ms
        USBDP_PWM(Voltage_06_PWM);
    }

}

void QC30_Reduce_Voltage(void)
{
    if (QC_Mode_Choice == 2)
    {
        //D- -->0.6  -->100ms -->D- -->3.3   ==>QC3.0模式 减少电压
        USBDM_PWM(100);
        os_wait(K_IVL, 100, 0);//500ms
        USBDM_PWM(Voltage_06_PWM);
    }
}

#ifndef _QC3_0_H
#define _QC3_0_H
/* -----------------------------------------宏定义-----------------------------------------*/
#define Config_USBDP_CH  4
//              <0=> PWM0  <1=> PWM1   <2=> PWM2   <3=> PWM3   <4=> PWM4    <5=> PWM5
#define Config_USBDM_CH  4
//              <0=> PWM0  <1=> PWM1   <2=> PWM2   <3=> PWM3   <4=> PWM4    <5=> PWM5

#define USBDP_PWM(Num) PWM_InputData(Config_USBDP_CH, (((Config_PWM_Cycle+1)/100)*Num));  //Num代表百分比
#define USBDM_PWM(Num) PWM_InputData(Config_USBDM_CH, (((Config_PWM_Cycle+1)/100)*Num));  //Num代表百分比
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/
extern xdata uint8_t  QC_Mode_Choice;       //0--不使用QC协议  1--QC2.0   2--QC3.0
extern xdata uint8_t  QC20_Voltage_Choice;  //0--默认5V        1--9V      2--12V     3--20V
/* -----------------------------------------应用程序---------------------------------------*/
void QC_Voltage_Switch(void);
void QC30_Add_Voltage(void);
void QC30_Reduce_Voltage(void);
#endif

/*********************************************
函数名:System_Configuration
功  能:内外设初始化
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void System_Configuration(void)
{
    uint8_t temp = 0;
    SystemReg.RunningState      = 1;
    SystemReg.RunningState_Flag = 0;
    Pwm_Configuration();               //   PWM初始化
    Exit_Configuration();              //   端口中断使能

    Adc_Configuration();               //   ADC初始化
    SystemInit.ADC = 1;
    Key_Configuration();               //   按键初始化
    SystemReg.First_Start = 0;
    LowPower_Tmr = 10;
    SystemReg.RunningState = 1;//关机
}

/*********************************************
函数名:StartRunTask
功  能:OS运行起始任务
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void StartRunTask() _task_ 0
{
    System_Configuration();      //   初始化系统
    os_create_task(1);  //创建任务1
    os_create_task(2);  //创建任务2
    QC_Voltage_Switch();//选择充电协议
    for (;;)
    {
        if (SystemInit.PWM == 0)
        {
            PWM_INIT();//初始化灯光
            SystemInit.PWM = 1;
        }
        if (SystemInit.QC_Handshake == 0)//QC协议握手
        {
            USBDP_PWM(Voltage_06_PWM);//D+ 0.6V
            USBDM_PWM(0);//D- 0V
            if (time < 250 && ++time > 7)
            {
                time = 0;
                QC_Voltage_Switch();//选择充电协议
                SystemInit.QC_Handshake = 1;
            }
        }
        os_wait(K_IVL, 200, 0);//500ms
    }
}


/*********************************************
函数名:StartKeyTask
功  能:按键扫描
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void StartKeyTask(void) _task_ 1
{
    uint8_t KEY_state = 0;
    uint16_t time = 0;
    uint8_t i = 0;
    os_wait(K_IVL, 30, 0);//0.01s==100ms
    for (;;)
    {
        KEY_state = Key_Scan(&Key1_Type, 1);
        switch (KEY_state)
        {
            case 1://短按
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice == 1)
                    {
                        if (QC20_Voltage_Choice < 3 && ++QC20_Voltage_Choice > 2) QC20_Voltage_Choice = 0;
                        if (QC20_Voltage_Choice >= 3)
                        {
                            QC20_Voltage_Choice = 0;
                        }
                        QC_Voltage_Switch();//选择充电电压
                    }
                    else if (QC_Mode_Choice == 2)
                    {
                        QC30_Add_Voltage();
                    }
                }
                break;
            case 2://长按
                break;
            case 3://双击
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
                    if (QC_Mode_Choice >= 3)
                    {
                        QC_Mode_Choice = 0;
                    }
                    QC_Voltage_Switch();//选择充电电压
                }
                break;
            default:
                break;
        }
        KEY_state = Key_Scan(&Key2_Type, 2);
        switch (KEY_state)
        {
            case 1://短按
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice == 1)
                    {
                        if (QC20_Voltage_Choice > 0)
                        {
                            --QC20_Voltage_Choice;
                        }
                        QC_Voltage_Switch();//选择充电电压
                    }
                    if (QC_Mode_Choice == 2)
                    {
                        QC30_Reduce_Voltage();
                    }
                }
                break;
            case 2://长按
                break;
            case 3://双击
                if (SystemInit.QC_Handshake == 1)
                {
                    if (QC_Mode_Choice < 3 && ++QC_Mode_Choice > 2) QC_Mode_Choice = 0;
                    if (QC_Mode_Choice >= 3)
                    {
                        QC_Mode_Choice = 0;
                    }
                    QC_Voltage_Switch();//选择充电电压
                }
                break;
            default:
                break;
        }
        os_wait(K_IVL, 10, 0);//0.01s==10ms
    }
}
/* -----------------------------------------结构体定义-------------------------------------*/
typedef struct
{
    uint8_t   RunningState      : 2; //0开机  1低功耗待机
    uint8_t   RunningState_Flag : 2; //0关闭效果   1开机/2关机效果
    uint8_t   First_Start       : 2; //初始化完成: 0--初始化完成 1--未初始化
    uint8_t   Mode              : 2; //0--  1--  2--

    uint8_t   Level             : 3; //
	  uint8_t                     : 3;

} SYSTEM_REG;

typedef struct
{
    uint8_t ADC              : 1; //0--未初始化  1--已经初始化  (外围模拟采集)
    uint8_t PWM              : 1; //0--未初始化  1--已经初始化  (外围模拟输出)
    uint8_t LED_And_LampEN   : 1; //0--未初始化  1--已经初始化  (LED指示灯及灯光使能脚)
    uint8_t                  : 5;
} SYSTEM_INIT;
/* -----------------------------------------全局变量定义-----------------------------------*/
extern SYSTEM_REG      SystemReg;
extern SYSTEM_INIT     SystemInit;

你可能感兴趣的:(单片机)