/* -----------------------------------------宏定義-----------------------------------------*/
/* -----------------------------------------頭文件-----------------------------------------*/
#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
}
}