單片機 FUSB302 PD1.0 PD2.0 PD協議 Demo 例子 代碼


/* -----------------------------------------宏定義-----------------------------------------*/

/* -----------------------------------------頭文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------結構體定義-------------------------------------*/

/* -----------------------------------------全局變量定義-----------------------------------*/
uint8_t       CCx_PIN_Useful     = 0;   //0爲沒有 1爲cc1 2爲cc2 注意 爲1的時候 不排除2有效
uint8_t       USB302_INT         = 0;   //0--無PD消息通知  1--PD消息通知

xdata uint8_t USB302_TX_Buff[20] = {0}; //存放消息內容——TX
xdata uint8_t USB302_RX_Buff[40] = {0}; //存放消息內容——RX
uint8_t       RX_Length          = 0;   //接收內容的長度

uint8_t       PD_STEP            = 0;   //0--PD協議未選擇  1--PD協議已選擇  2--收到數據消息  3--數據讀取完畢並解析

uint8_t       PD_MSG_ID          = 0;   //消息ID號
uint8_t       PD_Version         = 0;   //器件版本號

uint8_t       PPS_State          = 0;   //pps的控制狀態 0:不是pps檔 1:在pps檔非調整模式 2:pps檔調整模式
uint16_t      PPS_VOL   = 50000 / 20;   //pps的電壓 20mv檔 默認5V

xdata PD_Source_Capabilities_TypeDef PD_Source_Capabilities_Inf[7] = {0};
uint8_t PD_Source_Capabilities_Inf_num = 0;

const uint8_t PD_Resq[14] =
{
    0x12, 0x12, 0x12, 0x13, 0x86,
    0x42, 0x14,
    0x00, 0x00, 0x00, 0x03,
    0xff, 0x14, 0xA1
};

/******************
筆記:
1、DelayTick = 2
2、ADDR:SD0==0==0x44 ; SD0==1==0x44  【寫命令0x44  讀命令0x44|1】
*******************/
code IIC_TYPE FUSB302_IIC = {2, 0x44};


uint8_t now_obj = 0;
uint8_t old_obj = 0;

xdata uint16_t Supporting_voltage[10] = {0};
xdata uint16_t Supporting_current[10] = {0};

uint16_t PPS_MAX_VOL = 0, PPS_MIN_VOL = 0; //當前擋位支持的最高最低電壓
/* -----------------------------------------應用程序---------------------------------------*/
void USB302_Wite_Reg(uint8_t REG_ADDR, uint8_t DATA)
{
    IIC_Start();                     // 啓動
    IIC_WriteByte(FUSB302_IIC.ADDR); // 設備地址
    IIC_Wait_ACK();                  // 等待數據響應
    IIC_WriteByte(REG_ADDR);         // 發送寄存器地址
    IIC_Wait_ACK();                  // 等待數據響應
    IIC_WriteByte(DATA);             // 發送數據
    IIC_Wait_ACK();                  // 等待數據響應
    IIC_Stop();                      // 停止
}
void USB302_Wite_FIFO(uint8_t *Data, uint8_t Length)
{
    uint8_t i = 0;
    IIC_Start();                     // 啓動
    IIC_WriteByte(FUSB302_IIC.ADDR); // 設備地址
    IIC_Wait_ACK();                  // 等待數據響應
    IIC_WriteByte(0x43);             // 發送寄存器地址
    IIC_Wait_ACK();                  // 等待數據響應
    for (i = 0; i < Length; i++)
    {
        IIC_WriteByte(Data[i]);      // 發送數據
        IIC_Wait_ACK();              // 等待數據響應
    }
    IIC_Stop();                      // 停止
}
/*********************************************
函數名:USB302_Read_Same(部分)
功  能:讀地址數據
形  參:REG_ADDR--寄存器地址
返回值:
備  注:
作  者:薛建強
時  間:2020/04/16
**********************************************/
void USB302_Read_Same(uint8_t REG_ADDR)
{
    IIC_Start();                   // 啓動
    IIC_WriteByte(FUSB302_IIC.ADDR);   // 發送地址
    IIC_Wait_ACK();                // 等待數據響應
    IIC_WriteByte(REG_ADDR);           // 發送地址
    IIC_Wait_ACK();                // 等待數據響應

    IIC_Start();                   // 啓動
    IIC_WriteByte(FUSB302_IIC.ADDR | 1); // 發送地址
    IIC_Wait_ACK();                // 等待數據響應
}
/*********************************************
函數名:USB302_Read_Reg
功  能:讀地址數據
形  參:REG_ADDR--寄存器地址
返回值:
備  注:
作  者:薛建強
時  間:2020/04/16
**********************************************/
uint8_t USB302_Read_Reg(uint8_t REG_ADDR)
{
    uint8_t GET_DATA = 0;
    USB302_Read_Same(REG_ADDR);
    GET_DATA = IIC_ReadByte();     // 獲取數據
    IIC_Wait_ACK();                // 等待數據響應
    IIC_Stop();                    // 停止
    return GET_DATA;
}
/*********************************************
函數名:USB302_Read_FIFO
功  能:讀地址數據
形  參:Data--數據數組  Length--數據長度
返回值:
備  注:讀取地址-->0x43
作  者:薛建強
時  間:2020/04/16
**********************************************/
void USB302_Read_FIFO(uint8_t *Data, uint8_t Length)
{
    uint8_t i = 0;
    USB302_Read_Same(0x43);//數據起始地址
    for (i = 0; i < Length; i++)
    {
        if (i == (Length - 1))
        {
            Data[i] =  IIC_ReceiveData(0);
        }
        else
        {
            Data[i] =  IIC_ReceiveData(1);
        }
    }
    IIC_Stop();            // 停止
}


/*********************************************
函數名:USB302_Chech_CCx
功  能:檢測cc腳上是否有連接
形  參:
返回值:0--失敗, 1--成功
備  注:[usb302器件手冊.pdf]--21頁
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
uint8_t USB302_Chech_CCx(void)
{
    uint8_t Read_State;
    USB302_Wite_Reg(0x0C, 0x02); // PD協議重置
    USB302_Wite_Reg(0x0C, 0x03); /* FUSB302器件寄存器復位*/
    os_wait(K_IVL, 5, 0);//5ms
    USB302_Wite_Reg(0x0B, 0x0F); /* 全電源啓動-->PWR[0]:帶備用和喚醒的電路。
                                                 PWR[1]:測量塊區的接收器供電和電流基準。
                                                 PWR[2]:測量塊區電源。
                                                 PWR[3]:啓用內部振盪器。*/

    USB302_Wite_Reg(0x02, 0x07); // CC1/CC2設置爲下拉電阻 且 開啓MEAS_CC1(使用測量塊區[監控或測量]CC1電壓)
    os_wait(K_IVL, 2, 0);//2ms
    Read_State = USB302_Read_Reg(0x40); //讀FUSB302狀態寄存器
    USB302_Wite_Reg(0x02, 0x03);        //切換到初始狀態 即只保留CC1/CC2設置爲下拉電阻
    Read_State &= 0x03;                 //只看低2位 看CC1/CC2有沒有電壓   BC_LVL[1:0]==0->(<200mV)  1->[200,660]mV  2->[660,1230]mV 3->(>1230)mV
    if (Read_State > 0)                 //只要存在高電平,則代表CC1狀態正常
    {
        CCx_PIN_Useful = 1;
        return 1;
    }
    USB302_Wite_Reg(0x02, 0x0B);        //CC1/CC2設置爲下拉電阻 且 開啓MEAS_CC2(使用測量塊區[監控或測量]CC2電壓)
    os_wait(K_IVL, 2, 0);//2ms
    Read_State = USB302_Read_Reg(0x40); //讀FUSB302狀態寄存器
    USB302_Wite_Reg(0x02, 0x03);        //切換到初始狀態 即只保留CC1/CC2設置爲下拉電阻
    Read_State &= 0x03;                 //只看低2位 看CC1/CC2有沒有電壓   BC_LVL[1:0]==0->(<200mV)  1->[200,660]mV  2->[660,1230]mV 3->(>1230)mV
    if (Read_State > 0)                 //只要存在高電平,則代表CC1狀態正常
    {
        CCx_PIN_Useful = 2;
        return 1;
    }
    return 0;
}
/*********************************************
函數名:IIC_Init_Check_USB302
功  能:檢測器件是否正常
形  參:
返回值:0--失敗, 1--成功
備  注:[usb302器件手冊.pdf]--21頁
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
uint8_t IIC_Init_Check_USB302(void)
{
    uint8_t Read_Back;
    IIC_Init();
    Read_Back = USB302_Read_Reg(0x01);//讀取器件ID
    if (Read_Back < 0x83 && Read_Back > 0x7F)//讀到的ID只可能是0x80 0x81 0x82 中的一個 代表版本號
    {

    }
    else
    {
        return 0;
    }
    USB302_Wite_Reg(0x0C, 0x03); /*FUSB302器件寄存器復位*/
    return 1;
}

/*********************************************
函數名:USB302_Init
功  能:器件初始化
形  參:
返回值:0--失敗, 1--成功
備  注:[usb302器件手冊.pdf]--21頁
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
uint8_t USB302_Init(void)
{
    if (USB302_Chech_CCx() == 0)//檢測cc腳上是否有連接
    {
        return 0; //檢查有沒有接着設備
    }
    USB302_Wite_Reg(0x09, 0x40); //發送器件重置數據包(最高優先級)
    USB302_Wite_Reg(0x0C, 0x03); /* FUSB302器件寄存器復位*/

    os_wait(K_IVL, 5, 0);//5ms
    USB302_Wite_Reg(0x09, 0x07); //使能自動重試 3次自動重試
    USB302_Wite_Reg(0x0E, 0xFC); //使能各種中斷

    USB302_Wite_Reg(0x0F, 0x01); //使能CRC校驗成功中斷
    USB302_Wite_Reg(0x0A, 0xEF); //屏蔽CRC校驗
    USB302_Wite_Reg(0x06, 0x00); //清空各種狀態
    USB302_Wite_Reg(0x0C, 0x02); //復位PD
    if (CCx_PIN_Useful == 1)
    {
        USB302_Wite_Reg(0x02, 0x05); //CC1設置爲下拉電阻 開啓CC1引腳的ADC檢測
        USB302_Wite_Reg(0x03, 0x41); //將器件的PD協議設置爲2.0.且在CC1引腳上啓用BMC傳輸驅動程序。
    }
    else if (CCx_PIN_Useful == 2)
    {
        USB302_Wite_Reg(0x02, 0x0A); // CC2設置爲下拉電阻 開啓CC1引腳的ADC檢測
        USB302_Wite_Reg(0x03, 0x42); // 將器件的PD協議設置爲2.0.且在CC2引腳上啓用BMC傳輸驅動程序。
    }
    USB302_Wite_Reg(0x0B, 0x0F);     /* 全電源啓動-->PWR[0]:帶備用和喚醒的電路。
                                                     PWR[1]:測量塊區的接收器供電和電流基準。
                                                     PWR[2]:測量塊區電源。
                                                     PWR[3]:啓用內部振盪器。*/
    USB302_Read_Reg(0x3E); //讀取中斷標記寄存器1
    USB302_Read_Reg(0x3F); //讀取中斷標記寄存器2 只有GoodCRC中斷
    USB302_Read_Reg(0x42); //讀取中斷標記寄存器2 主要是TX_FULL/RX_FULL
    RX_Length  = 0;
    USB302_INT = 0;
    PD_STEP    = 0;
    PD_Source_Capabilities_Inf_num = 0;
    /*  USB302_Wite_Reg(0x07, 0x04); // Flush RX*/
    return 1;
}

/*********************************************
函數名:USB302_Dis_Init
功  能:器件復位
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
void USB302_Dis_Init(void)
{
    USB302_Wite_Reg(0x0C, 0x03); /* FUSB302器件寄存器復位*/
    USB302_INT     = 0;
    CCx_PIN_Useful = 0;
    PD_STEP        = 0;
    PD_MSG_ID      = 0;
}

/*********************************************
函數名:USB302_Read_Service
功  能:讀取器件FIFO寄存器緩存數
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
void USB302_Read_Service(void)
{
    uint8_t i = 0;
    USB302_Read_Reg(0x3E); //清中斷
    USB302_Read_Reg(0x42); //清中斷
    USB302_RX_Buff[0] = USB302_Read_Reg(0x43) & 0xe0;
    if (USB302_RX_Buff[0] > 0x40) //E0 C0 A0 80 60 都是允許的值
    {
        //小端 高8位後來
        USB302_Read_FIFO(USB302_RX_Buff + 1, 2);
        i = USB302_RX_Buff[2] & 0x70; //取數量位 報告了有幾組電壓的意思 每個電壓報告組有4字節
        i >>= 2;
        i += 2; //獲得要讀的數量
        RX_Length = i + 3;
        USB302_Read_FIFO(USB302_RX_Buff + 3, i);
    }
    USB302_Wite_Reg(0x07, 0x04);//清空RX FIFO
}

/*********************************************
函數名:PD_Msg_ID_ADD
功  能:PD消息包計次(發送一次遞增一次)
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
void PD_Msg_ID_ADD(void)
{
    PD_MSG_ID++;
    if (PD_MSG_ID > 7)
    {
        PD_MSG_ID = 0;
    }
}

/*********************************************
函數名:USB302_Read_Data_State
功  能:讀取數據狀態
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/10
使  用:
**********************************************/
void USB302_Read_Data_State(void)
{
    uint8_t i = 0;
    if (USB302_INT)
    {
        USB302_Read_Service();//讀取器件FIFO寄存器緩存數
        USB302_INT = 0;
        if (RX_Length >= 5) //至少要讀得5個包
        {
            PD_Msg_ID_ADD();//遞增一次消息號
            i = USB302_RX_Buff[2] & 0x70;
            if (i == 0) //控制消息
            {
                i = (USB302_RX_Buff[1] & 0x07); //獲取包類型
                switch (i)
                {
                    case 1://GoodCRC 表示通訊crc校驗沒問題
                        break;
                    case 3://Accept  表示充電器接受了用電器的請求
                        break;
                    case 4://Reject  表示充電器拒絕了用電器的請求  比如說電壓 電流請求不合規格
                        break;
                    case 6://PS_RDY  表示請求的電壓已就緒 一般是在Accept 後幾百ms 由充電器發出 告訴用電器電壓已經調整好了
                        break;
                    case 8://Get_Sink_Cap  必須回覆點東西
                        os_wait(K_IVL, 1, 0);//1ms
                        break;
                    default:
                        break;
                }
            }
            else//數據消息
            {
                if ((USB302_RX_Buff[1] & 0x07) == 0x01) //充電頭支持的功能
                {
                    if (PD_STEP == 0)
                    {
                        i = USB302_RX_Buff[1] & 0xC0;
                        PD_Version = i;
                        i >>= 1;
                        if (CCx_PIN_Useful == 1) //調整PD版本
                        {
                            i |= 0x05;
                        }
                        else if (CCx_PIN_Useful == 2)
                        {
                            i |= 0x06;
                        }
                        USB302_Wite_Reg(0x03, i);
                        os_wait(K_IVL, 1, 0);//1ms
                        USB302_Wite_Reg(0x0C, 0x02); // 復位PD協議
                        USB302_Wite_Reg(0x07, 0x04);
                        PD_STEP = 1;
                        USB302_INT = 0;
                        PD_MSG_ID = 0; //現在開始正式從0開始記錄
                        return;
                    }
                    i = USB302_RX_Buff[2] & 0x70;
                    i >>= 4;
                    PD_Source_Capabilities_Inf_num = i;

                    for (i = 0; i < PD_Source_Capabilities_Inf_num; i++)
                    {
                        PD_Source_Capabilities_Inf[i].PDC_INF[0] = USB302_RX_Buff[4 * i + 3];
                        PD_Source_Capabilities_Inf[i].PDC_INF[1] = USB302_RX_Buff[4 * i + 4];
                        PD_Source_Capabilities_Inf[i].PDC_INF[2] = USB302_RX_Buff[4 * i + 5];
                        PD_Source_Capabilities_Inf[i].PDC_INF[3] = USB302_RX_Buff[4 * i + 6];
                    }
                    PD_STEP = 2;
                    PPS_State = 0; //恢復pps 擋位
                }
                //else if((USB302_RX_Buff[1]&0x07)==0x03)//Request Message
                //{}
            }
        }
    }
}


void Load_TX_Buff(void)//幫忙裝填發送buff
{
    uint8_t i;
    for (i = 0; i < 14; i++)
    {
        USB302_TX_Buff[i] = PD_Resq[i];
    }
    USB302_TX_Buff[6] |= PD_MSG_ID << 1;
    USB302_TX_Buff[5] |= PD_Version;
}


/*********************************************
函數名:USB302_Send_Requse
功  能:發送請求 調整電壓/電流
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
void USB302_Send_Requse(uint8_t objects)
{
    uint8_t i = 0;
    uint16_t cachecur = 0;
    if (objects > PD_Source_Capabilities_Inf_num)
    {
        return;
    }
    //Load_Requse_TX_Buff();
    for (i = 0; i < 14; i++) //裝填發送buff
    {
        USB302_TX_Buff[i] = PD_Resq[i];
    }
    USB302_TX_Buff[6] |= PD_MSG_ID << 1;
    USB302_TX_Buff[5] |= PD_Version;

    USB302_TX_Buff[10] |= (objects + 1) << 4;
    i = PD_Source_Capabilities_Inf[objects].PDC_INF[3] & 0xc0;
    if ((i == 0x00) || (i == 0x80)) // Fixed and Variable Request Data Object
    {
        USB302_TX_Buff[7] = PD_Source_Capabilities_Inf[objects].PDC_INF[0];
        USB302_TX_Buff[8] = PD_Source_Capabilities_Inf[objects].PDC_INF[1] & 0x03;
        USB302_TX_Buff[9] |= USB302_TX_Buff[8] << 2;
        USB302_TX_Buff[8] |= USB302_TX_Buff[7] << 2;
        USB302_TX_Buff[9] |= USB302_TX_Buff[7] >> 6;
        PPS_State = 0; //不是pps檔
    }
    else
    {
        *((uint8_t *)&cachecur + 1) = PD_Source_Capabilities_Inf[i].PDC_INF[0]; //低位
        *(uint8_t *)&cachecur = PD_Source_Capabilities_Inf[i].PDC_INF[1] & 0x03; //高位
        if (i == 0xC0) //pps
        {
            if (PPS_State == 0)
            {
                PPS_State = 1; //記錄爲在pps上面了
                PPS_VOL = 5000 / 20; //恢復pps電壓
            }
            cachecur /= 5;
            cachecur -= 1;
            USB302_TX_Buff[7] = cachecur; //吧電流存進去 50ma 進制
            USB302_TX_Buff[8] = PPS_VOL << 1;
            USB302_TX_Buff[9] |= PPS_VOL >> 7;
        }
        else//電池
        {
            PPS_State = 0; //不是pps檔
        }
    }
    //USB302_Wite_Reg(0x0B, 0x0F);//全電源  感覺沒必要
    USB302_Wite_Reg(0x06, 0x40);//清發送
    USB302_Wite_FIFO(USB302_TX_Buff, 14);
    USB302_Wite_Reg(0x06, 0x05);//開始發

    PD_Msg_ID_ADD();//加包
}


/*********************************************
函數名:USB302_Get_Data
功  能:讀取FIFO緩衝器內容
形  參:
返回值:
備  注:
作  者:薛建強
時  間:2020/04/17
使  用:
**********************************************/
void USB302_Get_Data(void)
{
    uint8_t i = 0;
    uint16_t cachevol = 0, cachecur = 0;
    if (PD_STEP == 2)
    {
        USB302_Send_Requse(0);//進行一次1包請求
        for (i = 0; i < PD_Source_Capabilities_Inf_num; i++)
        {
            if ((PD_Source_Capabilities_Inf[i].PDC_INF[3] & 0xc0) == 0) //普通
            {
                /*****讀取一組電流******/
                *((uint8_t *)&cachecur + 1) = PD_Source_Capabilities_Inf[i].PDC_INF[0];        //低位
                *(uint8_t *)&cachecur       = PD_Source_Capabilities_Inf[i].PDC_INF[1] & 0x03; //高位
                //cachecur*=10;
                /*****讀取一組電壓******/
                *((uint8_t *)&cachevol + 1) = PD_Source_Capabilities_Inf[i].PDC_INF[1] & 0xFC; //低位
                *(uint8_t *)&cachevol       = PD_Source_Capabilities_Inf[i].PDC_INF[2] & 0x0F; //高位
                cachevol >>= 2;
                cachevol *= 5;
                Supporting_voltage[i] = cachevol;
                Supporting_current[i] = cachecur;
            }
            else if ((PD_Source_Capabilities_Inf[i].PDC_INF[3] & 0xc0) == 0xc0) //pps可編程調整
            {
                cachecur = PD_Source_Capabilities_Inf[i].PDC_INF[0] & 0x7F; //電流
                cachecur >>= 1;
                *((uint8_t *)&cachevol + 1) = PD_Source_Capabilities_Inf[i].PDC_INF[1]; //低位 最小電壓
                *(uint8_t *)&cachevol = PD_Source_Capabilities_Inf[i].PDC_INF[2] >> 1; //高位 最大電壓
                if ((PD_Source_Capabilities_Inf[i].PDC_INF[2] & 0x01) == 1) //第24位 補上
                {
                    *(uint8_t *)&cachevol |= 0x80;
                }
                Supporting_voltage[i] = cachevol;
                Supporting_current[i] = cachecur;
            }
        }
        PD_STEP = 3;
    }
}



#ifndef _USB302_H
#define _USB302_H
/* -----------------------------------------宏定義-----------------------------------------*/
sbit USB302_EXIT = P1 ^ 2;

/* -----------------------------------------頭文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------結構體定義-------------------------------------*/
typedef struct
{
    uint8_t PDC_INF[4];
} PD_Source_Capabilities_TypeDef;
/* -----------------------------------------全局變量定義-----------------------------------*/
extern uint8_t PPS_State;//pps的控制狀態 0:不是pps檔 1:在pps檔非調整模式 2:pps檔調整模式
extern uint16_t PPS_VOL;//pps的當前電壓 20mv檔 默認5V
extern uint8_t USB302_INT;
extern uint16_t PPS_MAX_VOL,PPS_MIN_VOL;//當前擋位支持的最高最低電壓
extern uint8_t PD_STEP;
extern uint8_t now_obj;
extern uint8_t old_obj;
extern uint8_t PD_Source_Capabilities_Inf_num;
extern xdata PD_Source_Capabilities_TypeDef PD_Source_Capabilities_Inf[7];
/* -----------------------------------------應用程序---------------------------------------*/
uint8_t USB302_Init(void);
void USB302_Data_Service(void);//數據服務
void USB302_Read_Data_State(void);
void USB302_Send_Requse(uint8_t objects);
#endif

        if (UsbCheck == 0)
        {
            if (SystemInit.USB302_Handshake == 0) //PD協議握手
            {
                SystemInit.USB302_Handshake = USB302_Init();
                /*清除QC協議*/
                SystemInit.QC_Handshake = 0;
                QC_Mode_Choice          = 1;
                QC20_Voltage_Choice     = 0;
                QC_Voltage_Switch();//選擇充電協議
            }

            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;
                }
            }
            /************PD協議************/
            if (SystemInit.USB302_Handshake == 1)
            {
                USB302_Read_Data_State();//讀取PD消息狀態
            }
        }
        else//USB被拔出,清除握手協議
        {
            SystemInit.USB302_Handshake = 0;
            SystemInit.QC_Handshake     = 0;
            SystemReg .RunningState     = 1;//關機
        }
/*********************************************
函數名: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://短按
                /************PD協議************/
                if (SystemInit.USB302_Handshake == 1)
                {
                    if (PD_STEP == 3)//3--數據讀取完畢並解析
                    {
                        if (PPS_State > 1)
                        {
                            if (PPS_State == 2) //調整單位:1v
                            {
                                if ((PPS_VOL + 50) <= PPS_MAX_VOL)
                                {
                                    PPS_VOL += 50;
                                }
                            }
                            else if (PPS_State == 3) //調整單位:100mv
                            {
                                if ((PPS_VOL + 5) <= PPS_MAX_VOL)
                                {
                                    PPS_VOL += 5;
                                }
                            }
                            else if (PPS_State == 4) //調整單位:20mv
                            {
                                if (PPS_VOL < PPS_MAX_VOL)
                                {
                                    PPS_VOL += 1;
                                }
                            }
                            USB302_Send_Requse(now_obj);
                        }
                        else
                        {
                            if (now_obj < PD_Source_Capabilities_Inf_num - 1)
                            {
                                now_obj++;
                                PPS_VOL = 5000 / 20; //恢復pps電壓
                                USB302_Send_Requse(now_obj);
                            }
                        }
                    }
                }
                /************QC協議************/
                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://雙擊
                /************PD協議************/
                if (SystemInit.USB302_Handshake == 1)
                {
                    if (PPS_State > 1) //2調整1v 3調整100mv 4調整20mv
                    {
                        PPS_State++;
                        if (PPS_State > 4)PPS_State = 2;
                    }
                    else
                    {
                        PPS_State = 2;
                        //進入pps調節模式時,處理一次最高最低電壓 報文是100mv級別的
                        PPS_MAX_VOL = PD_Source_Capabilities_Inf[now_obj].PDC_INF[2] >> 1; //高位 最大電壓
                        PPS_MIN_VOL = PD_Source_Capabilities_Inf[now_obj].PDC_INF[1]; //低位 最小電壓
                        if ((PD_Source_Capabilities_Inf[now_obj].PDC_INF[2] & 0x01) == 1) //第24位 補上
                        {
                            PPS_MAX_VOL |= 0x80;
                        }
                        PPS_MAX_VOL *= 5;
                        PPS_MIN_VOL *= 5; //處理到20mv級別
                    }
                }
                /************QC協議************/
                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://短按
                /************PD協議************/
                if (SystemInit.USB302_Handshake == 1)
                {
                    if (PD_STEP == 3)
                    {
                        if (PPS_State > 1)//2調整1v 3調整100mv 4調整20mv
                        {
                            if (PPS_State == 2) //調整單位:1v
                            {
                                if ((PPS_VOL - 50) >= PPS_MIN_VOL)
                                {
                                    PPS_VOL -= 50;
                                }
                            }
                            else if (PPS_State == 3) //調整單位:100mv
                            {
                                if ((PPS_VOL - 5) >= PPS_MIN_VOL)
                                {
                                    PPS_VOL -= 5;
                                }
                            }
                            else if (PPS_State == 4) //調整單位:20mv
                            {
                                if (PPS_VOL > PPS_MIN_VOL)
                                {
                                    PPS_VOL -= 1;
                                }
                            }
                            USB302_Send_Requse(now_obj);
                        }
                        else
                        {
                            if (now_obj > 0)
                            {
                                now_obj--;
                                PPS_VOL = 5000 / 20; //恢復pps電壓
                                USB302_Send_Requse(now_obj);
                            }
                        }
                    }
                }
                /************QC協議************/
                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://雙擊
                /************PD協議************/
                if (SystemInit.USB302_Handshake == 1)
                {
                    if (PPS_State > 2) //2調整1v 3調整100mv 4調整20mv
                    {
                        PPS_State--;
                    }
                }
                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
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章