RF_W13无卡设备

上传云端
This commit is contained in:
yeyangwen
2026-01-19 16:09:27 +08:00
commit defafbaa4a
139 changed files with 89790 additions and 0 deletions

View File

@@ -0,0 +1,473 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_clk.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/**
* @brief LSIʱ<49>ӣ<EFBFBD>Hz<48><7A>
*/
uint32_t Freq_LSI = 0;
/*********************************************************************
* @fn LClk_Cfg
*
* @brief <20><>Ƶʱ<C6B5>ӵ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪵<EFBFBD>Դ
*
* @return none
*/
void LClk_Cfg(FunctionalState s)
{
uint8_t cfg = R8_LSI_CONFIG;
if(s == DISABLE)
{
cfg &= ~RB_CLK_LSI_PON;
}
else
{
cfg |= RB_CLK_LSI_PON;
}
sys_safe_access_enable();
R8_LSI_CONFIG = cfg;
sys_safe_access_disable();
}
/*********************************************************************
* @fn HSECFG_Current
*
* @brief HSE<53><45><EFBFBD><EFBFBD> ƫ<>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - 75%,100%,125%,150%
*
* @return none
*/
void HSECFG_Current(HSECurrentTypeDef c)
{
uint8_t x32M_c;
x32M_c = R8_XT32M_TUNE;
x32M_c = (x32M_c & 0xfc) | (c & 0x03);
sys_safe_access_enable();
R8_XT32M_TUNE = x32M_c;
sys_safe_access_disable();
}
/*********************************************************************
* @fn HSECFG_Capacitance
*
* @brief HSE<53><45><EFBFBD><EFBFBD> <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - refer to HSECapTypeDef
*
* @return none
*/
void HSECFG_Capacitance(HSECapTypeDef c)
{
uint8_t x32M_c;
x32M_c = R8_XT32M_TUNE;
x32M_c = (x32M_c & 0x0f) | (c << 4);
sys_safe_access_enable();
R8_XT32M_TUNE = x32M_c;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_InitClock
*
* @brief <20><>ʼ<EFBFBD><CABC> RTCʱ<43><CAB1>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>,<2C><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>Խ<EFBFBD><D4BD><>Ӿ<EFBFBD><D3BE><EFBFBD>Խ<EFBFBD><D4BD>
*
* @param cnt - the total number of cycles captured by the oscillator
*
* @return RTCʱ<43><CAB1>, 24~42KHz
*/
uint32_t RTC_InitClock(RTC_OSCCntTypeDef cnt)
{
uint32_t count;
uint32_t cyc;
uint32_t last_ov_cnt = 0;
uint32_t new_ov_cnt = 0;
uint32_t ov_cnt_ov_cnt = 0;
if(cnt<Count_32)
{
cyc = 1<<cnt;
}
else if(cnt<Count_1024)
{
cyc = 1<<(cnt+2);
}
else if(cnt<Count_2047)
{
cyc = 1024;
}
else
{
cyc = 2047;
}
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR | RB_OSC_CAL_IF;
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_CNT_CLR;
R8_OSC_CAL_CTRL = cnt;
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
sys_safe_access_disable();
while(!(R16_OSC_CAL_CNT&RB_OSC_CAL_IF))
{
new_ov_cnt = R8_OSC_CAL_OV_CNT;
if(new_ov_cnt<last_ov_cnt)
{
ov_cnt_ov_cnt++;
}
last_ov_cnt = new_ov_cnt;
}
count = ((uint32_t)R16_OSC_CAL_CNT&RB_OSC_CAL_CNT) + ((uint32_t)R8_OSC_CAL_OV_CNT+ov_cnt_ov_cnt*256)*16384;
Freq_LSI = GetSysClock()/(count/cyc);
return Freq_LSI;
}
/*********************************************************************
* @fn RTCInitTime
*
* @brief RTCʱ<43>ӳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ǰʱ<C7B0>䣬ע<E4A3AC><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱLSIƵ<49>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LSIƵ<49><C6B5><EFBFBD>нϴ󲨶<CFB4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ƫ<EFBFBD>
*
* @param y - <20><><EFBFBD><EFBFBD><EFBFBD>꣬MAX_Y = BEGYEAR + 44
* @param mon - <20><><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param h - <20><><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>MAX_H = 23
* @param m - <20><><EFBFBD>÷<EFBFBD><C3B7>ӣ<EFBFBD>MAX_M = 59
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>룬MAX_S = 59
*
* @return none
*/
void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s)
{
uint32_t t;
uint32_t year, month, day, sec2;
uint32_t t32k;
volatile uint8_t clk_pin;
uint32_t temp,temp1,temp2,temp3;
uint32_t tmp,tmp1,tmp2;
year = y;
month = mon;
day = 0;
while(year > BEGYEAR)
{
day += YearLength(year - 1);
year--;
}
while(month > 1)
{
day += monthLength(IsLeapYear(y), month - 2);
month--;
}
day += d - 1;
sec2 = (h % 24) * 1800 + m * 30 + s / 2;
t32k = (s & 1) ? (Freq_LSI) : (0);
t = sec2;
t = t << 16 | t32k;
temp = day * Freq_LSI;
temp1 = temp % 32768; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
temp = temp / 32768; // <20><><EFBFBD><EFBFBD>
temp2 = temp1 * 675; // temp1 / 32768 * 2831155200 / 65536
temp3 = temp2 % 512; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
temp2 = temp2 / 512; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
temp1 = temp3 * 128; // 2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> temp3 / 512 * 65536
tmp = sec2 * Freq_LSI;
tmp1 = tmp % 32768; // 2s<32><73><EFBFBD><EFBFBD>
tmp = tmp / 32768; // 2s<32><73>
tmp2 = tmp1 * 2 ; // 2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // tmp1 / 32768 * 65536
t32k = (t32k * Freq_LSI + 16384) / 32768; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
t32k += tmp2 + temp1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp += (t32k/65536) + temp2; // <20><>2s<32><73>
temp += (tmp/43200); // <20><><EFBFBD><EFBFBD>
t32k %= 65536; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp %= 43200; // 2s<32><73>
t = tmp; // 64000
t = t << 16 | t32k; // 1
do
{
clk_pin = (R8_LSI_CONFIG & RB_LSI_CLK_PIN);
} while(clk_pin != (R8_LSI_CONFIG & RB_LSI_CLK_PIN));
if(!clk_pin)
{
while(!clk_pin)
{
do
{
clk_pin = (R8_LSI_CONFIG & RB_LSI_CLK_PIN);
} while(clk_pin != (R8_LSI_CONFIG & RB_LSI_CLK_PIN));
}
}
sys_safe_access_enable();
R32_RTC_TRIG = temp;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_HI;
sys_safe_access_disable();
while((R32_RTC_TRIG & 0x3FFF) != (R32_RTC_CNT_DIV2 & 0x3FFF));
sys_safe_access_enable();
R32_RTC_TRIG = t;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetTime
*
* @brief <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
*
* @param py - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>꣬MAX_Y = BEGYEAR + 44
* @param pmon - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param pd - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param ph - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>MAX_H = 23
* @param pm - <20><>ȡ<EFBFBD><C8A1><EFBFBD>ķ<EFBFBD><C4B7>ӣ<EFBFBD>MAX_M = 59
* @param ps - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>룬MAX_S = 59
*
* @return none
*/
void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps)
{
uint32_t t;
uint32_t day, sec2, t32k;
uint32_t temp,temp1,temp2,temp3;
uint32_t tmp,tmp1,tmp2;
day = R32_RTC_CNT_DIV2 & 0x3FFF;
sec2 = R16_RTC_CNT_DIV1;
t32k = R16_RTC_CNT_LSI;
temp = day * 32768;
temp1 = temp % Freq_LSI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
temp = temp / Freq_LSI; // <20><><EFBFBD><EFBFBD>
temp2 = temp1 * 43200; // temp1 / Freq_LSI * 43200
temp3 = temp2 % Freq_LSI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
temp2 = temp2 / Freq_LSI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
temp1 = (temp3 * 65536 + Freq_LSI/2 ) / Freq_LSI; // 2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> temp3 / Freq_LSI * 65536
tmp = sec2 * 32768;
tmp1 = tmp % Freq_LSI; // 2s<32><73><EFBFBD><EFBFBD> 5376
tmp = tmp / Freq_LSI; // 2s<32><73> 1799
tmp2 = (tmp1 * 65536 + Freq_LSI/2 ) / Freq_LSI; // 2sΪ<73><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // tmp1 / Freq_LSI * 65536 11010
t32k = (t32k * 32768 + Freq_LSI/2 ) / Freq_LSI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 54525
t32k += tmp2 + temp1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp += (t32k/65536) + temp2; // <20><>2s<32><73>
temp += (tmp/43200); // <20><><EFBFBD><EFBFBD>
t32k %= 65536; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp %= 43200; // 2s<32><73>
t = tmp * 2 + ((t32k < 0x8000) ? 0 : 1);
*py = BEGYEAR;
while(temp >= YearLength(*py))
{
temp -= YearLength(*py);
(*py)++;
}
*pmon = 0;
while(temp >= monthLength(IsLeapYear(*py), *pmon))
{
temp -= monthLength(IsLeapYear(*py), *pmon);
(*pmon)++;
}
(*pmon)++;
*pd = temp + 1;
*ph = t / 3600;
*pm = t % 3600 / 60;
*ps = t % 60;
}
/*********************************************************************
* @fn RTC_SetCycleLSI
*
* @brief <20><><EFBFBD><EFBFBD>LSIʱ<49>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>õ<EFBFBD>ǰRTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>MAX_CYC = 0xA8BFFFFF = 2831155199
*
* @return none
*/
void RTC_SetCycleLSI(uint32_t cyc)
{
volatile uint8_t clk_pin;
do
{
clk_pin = (R8_LSI_CONFIG & RB_LSI_CLK_PIN);
} while((clk_pin != (R8_LSI_CONFIG & RB_LSI_CLK_PIN)) || (!clk_pin));
sys_safe_access_enable();
R32_RTC_TRIG = cyc;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetCycleLSI
*
* @brief <20><><EFBFBD><EFBFBD>LSIʱ<49>ӣ<EFBFBD><D3A3><EFBFBD>ȡ<EFBFBD><C8A1>ǰRTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param none
*
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_CYC = 0xA8BFFFFF = 2831155199
*/
uint32_t RTC_GetCycleLSI(void)
{
volatile uint32_t i;
do
{
i = R32_RTC_CNT_LSI;
} while(i != R32_RTC_CNT_LSI);
return (i);
}
/*********************************************************************
* @fn RTC_TMRFunCfg
*
* @brief RTC<54><43>ʱģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD>ע<EFBFBD>ⶨʱ<E2B6A8><CAB1>׼<EFBFBD>̶<EFBFBD>Ϊ32768Hz<48><7A>
*
* @param t - refer to RTC_TMRCycTypeDef
*
* @return none
*/
void RTC_TMRFunCfg(RTC_TMRCycTypeDef t)
{
sys_safe_access_enable();
R8_RTC_MODE_CTRL &= ~(RB_RTC_TMR_EN | RB_RTC_TMR_MODE);
sys_safe_access_disable();
sys_safe_access_enable();
R8_RTC_MODE_CTRL |= RB_RTC_TMR_EN | (t);
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_TRIGFunCfg
*
* @brief RTCʱ<43><EFBFBD><E4B4A5>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param cyc - <20><><EFBFBD>Ե<EFBFBD>ǰʱ<C7B0><CAB1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>LSIʱ<49><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void RTC_TRIGFunCfg(uint32_t cyc)
{
uint32_t t;
t = RTC_GetCycleLSI() + cyc;
if(t > RTC_MAX_COUNT)
{
t -= RTC_MAX_COUNT;
}
sys_safe_access_enable();
R32_RTC_TRIG = t;
R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_ModeFunDisable
*
* @brief RTC ģʽ<C4A3><CABD><EFBFBD>ܹر<DCB9>
*
* @param m - <20><>Ҫ<EFBFBD>رյĵ<D5B5>ǰģʽ
*
* @return none
*/
void RTC_ModeFunDisable(RTC_MODETypeDef m)
{
uint8_t i = 0;
if(m == RTC_TRIG_MODE)
{
i |= RB_RTC_TRIG_EN;
}
else if(m == RTC_TMR_MODE)
{
i |= RB_RTC_TMR_EN;
}
sys_safe_access_enable();
R8_RTC_MODE_CTRL &= ~(i);
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetITFlag
*
* @brief <20><>ȡRTC<54>жϱ<D0B6>־
*
* @param f - refer to RTC_EVENTTypeDef
*
* @return <20>жϱ<D0B6>־״̬
*/
uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f)
{
if(f == RTC_TRIG_EVENT)
{
return (R8_RTC_FLAG_CTRL & RB_RTC_TRIG_FLAG);
}
else
{
return (R8_RTC_FLAG_CTRL & RB_RTC_TMR_FLAG);
}
}
/*********************************************************************
* @fn RTC_ClearITFlag
*
* @brief <20><><EFBFBD><EFBFBD>RTC<54>жϱ<D0B6>־
*
* @param f - refer to RTC_EVENTTypeDef
*
* @return none
*/
void RTC_ClearITFlag(RTC_EVENTTypeDef f)
{
switch(f)
{
case RTC_TRIG_EVENT:
R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR;
break;
case RTC_TMR_EVENT:
R8_RTC_FLAG_CTRL = RB_RTC_TMR_CLR;
break;
default:
break;
}
}

View File

@@ -0,0 +1,44 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_cmp.c
* Author : WCH
* Version : V1.0
* Date : 2024/12/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
void CMP_Init (CMPSwTypeDef s, CMPNrefLevelTypeDef v)
{
R8_CMP_CTRL_0 = (s << 2)|(v << 4);
}
void CMP_OutToTIMCAPCfg(FunctionalState s)
{
if (s)
{
R8_CMP_CTRL_0 |= RB_CMP_CAP;
}
else
{
R8_CMP_CTRL_0 &= ~RB_CMP_CAP;
}
}
void CMP_INTCfg (CMPOutSelTypeDef sel, FunctionalState s)
{
R8_CMP_CTRL_1 = (sel << 2);
if (s)
{
R8_CMP_CTRL_1 |= RB_CMP_IE;
}
else
{
R8_CMP_CTRL_1 &= ~RB_CMP_IE;
}
}

View File

@@ -0,0 +1,157 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_flash.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/* RESET_EN */
#define RESET_Enable 0x00000008
#define RESET_Disable 0xFFFFFFF7
/* LOCKUP_RST_EN */
#define UART_NO_KEY_Enable 0x00000100
#define UART_NO_KEY_Disable 0xFFFFFEFF
/* BOOT_PIN */
#define BOOT_PIN_PB22 0x00000200
#define BOOT_PIN_PB11 0xFFFFFDFF
/* FLASH_WRProt */
#define FLASH_WRProt 0xFFF003FF
/*********************************************************************
* @fn FLASH_ROM_READ
*
* @brief Read Flash
*
* @param StartAddr - read address
* @param Buffer - read buffer
* @param len - read len
*
* @return none
*/
void FLASH_ROM_READ(uint32_t StartAddr, void *Buffer, uint32_t len)
{
uint32_t i, Length = (len + 3) >> 2;
uint32_t *pCode = (uint32_t *)StartAddr;
uint32_t *pBuf = (uint32_t *)Buffer;
for(i = 0; i < Length; i++)
{
*pBuf++ = *pCode++;
}
}
/*********************************************************************
* @fn UserOptionByteConfig
*
* @brief Configure User Option Byte.<2E><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч,<2C><>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ֻ<EFBFBD><D6BB><EFBFBD>޸<EFBFBD>һ<EFBFBD><D2BB>
* (ʹ<>øú<C3B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ùٷ<C3B9><D9B7><EFBFBD><E1B9A9>.S<>ļ<EFBFBD><C4BC><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>øú<C3B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>Խӿ<D4BD>Ĭ<EFBFBD>Ϲر<CFB9>)
*
* @param RESET_EN - <20>ⲿ<EFBFBD><E2B2BF>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
* @param UART_NO_KEY_EN - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
* @param FLASHProt_Size - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><>λ4K)
*
* @return 0-Success, 1-Err
*/
uint8_t UserOptionByteConfig(FunctionalState RESET_EN, FunctionalState UART_NO_KEY_EN,
uint32_t FLASHProt_Size)
{
uint32_t s, t;
FLASH_ROM_READ(0x14, &s, 4);
if(s == 0xF5F9BDA9)
{
s = 0;
FLASH_EEPROM_CMD(CMD_GET_ROM_INFO, 0x3EFFC, &s, 4);
s &= 0xFF;
if(RESET_EN == ENABLE)
s |= RESET_Enable;
else
s &= RESET_Disable;
/* bit[7:0]-bit[31-24] */
s |= ((~(s << 24)) & 0xFF000000); //<2F><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣȡ<CFA2><C8A1><EFBFBD><EFBFBD>
if(UART_NO_KEY_EN == ENABLE)
s |= UART_NO_KEY_Enable;
/* bit[23-10] */
s &= 0xFF0003FF;
s |= ((FLASHProt_Size << 10) | (5 << 20)) & 0x00FFFC00;
/*Write user option byte*/
FLASH_ROM_WRITE(0x14, &s, 4);
/* Verify user option byte */
FLASH_ROM_READ(0x14, &t, 4);
if(s == t)
return 0;
else
return 1;
}
return 1;
}
/*********************************************************************
* @fn UserOptionByteClose_SWD
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>Խӿ<D4BD>
*
* @return 0-Success, 1-Err
*/
uint8_t UserOptionByteClose_SWD(void)
{
uint32_t s, t;
return 1;
}
/*********************************************************************
* @fn UserOptionByte_Active
*
* @brief <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA>Զ<EFBFBD><D4B6><EFBFBD>λ
*
* @return 0-Success, 1-Err
*/
void UserOptionByte_Active(void)
{
FLASH_ROM_SW_RESET();
sys_safe_access_enable();
R16_INT_LSI_TUNE = 0xFFFF;
sys_safe_access_disable();
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
sys_safe_access_disable();
while(1);
}
/*********************************************************************
* @fn GET_UNIQUE_ID
*
* @brief get 64 bit unique ID
*
* @param Buffer - Pointer to the buffer where data should be stored, Must be aligned to 4 bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
void GET_UNIQUE_ID(uint8_t *Buffer)
{
uint16_t temp;
FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_MAC_ADDR, Buffer, 0 );
temp = (Buffer[0]|(Buffer[1]<<8)) + (Buffer[2]|(Buffer[3]<<8)) + (Buffer[4]|(Buffer[5]<<8));
Buffer[6] = temp&0xFF;
Buffer[7] = (temp>>8)&0xFF;
}

View File

@@ -0,0 +1,145 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_gpio.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn GPIOA_ModeCfg
*
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param pin - PA0-PA15
* @param mode - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void GPIOA_ModeCfg(uint32_t pin, GPIOModeTypeDef mode)
{
switch(mode)
{
case GPIO_ModeIN_Floating:
R32_PA_PD_DRV &= ~pin;
R32_PA_PU &= ~pin;
R32_PA_DIR &= ~pin;
break;
case GPIO_ModeIN_PU:
R32_PA_PD_DRV &= ~pin;
R32_PA_PU |= pin;
R32_PA_DIR &= ~pin;
break;
case GPIO_ModeIN_PD:
R32_PA_PD_DRV |= pin;
R32_PA_PU &= ~pin;
R32_PA_DIR &= ~pin;
break;
case GPIO_ModeOut_PP_5mA:
R32_PA_PD_DRV &= ~pin;
R32_PA_DIR |= pin;
break;
case GPIO_ModeOut_PP_20mA:
R32_PA_PD_DRV |= pin;
R32_PA_DIR |= pin;
break;
default:
break;
}
}
/*********************************************************************
* @fn GPIOA_ITModeCfg
*
* @brief GPIOA<4F><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param pin - PA0-PA15
* @param mode - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode)
{
switch(mode)
{
case GPIO_ITMode_LowLevel: // <20>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
R16_PA_INT_MODE &= ~pin;
R32_PA_CLR |= pin;
break;
case GPIO_ITMode_HighLevel: // <20>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
R16_PA_INT_MODE &= ~pin;
R32_PA_OUT |= pin;
break;
case GPIO_ITMode_FallEdge: // <20>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD>
R16_PA_INT_MODE |= pin;
R32_PA_CLR |= pin;
break;
case GPIO_ITMode_RiseEdge: // <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
R16_PA_INT_MODE |= pin;
R32_PA_OUT |= pin;
break;
default:
break;
}
R16_PA_INT_IF = pin;
R16_PA_INT_EN |= pin;
}
/*********************************************************************
* @fn GPIOPinRemap
*
* @brief <20><><EFBFBD><EFBFBD><E8B9A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
*
* @param s - <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ӳ<EFBFBD><D3B3>
* @param perph - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO_pins_remap_define
*
*
* @return none
*/
void GPIOPinRemap(FunctionalState s, uint16_t perph)
{
if(s)
{
R16_PIN_ALTERNATE_H |= perph;
}
else
{
R16_PIN_ALTERNATE_H &= ~perph;
}
}
/*********************************************************************
* @fn GPIOADigitalCfg
*
* @brief I/O pin<69><6E><EFBFBD>ֹ<EFBFBD><D6B9>ܿ<EFBFBD><DCBF><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪶<EFBFBD>ӦI/O pin<69><6E><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>
* @param pin - PA0-PA11
*/
void GPIOADigitalCfg(FunctionalState s, uint16_t pin)
{
if(s)
{
R16_PIN_ALTERNATE &= ~pin;
}
else
{
R16_PIN_ALTERNATE |= pin;
}
}

View File

@@ -0,0 +1,672 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_i2c.c
* Author : WCH
* Version : V1.0
* Date : 2021/03/15
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn I2C_Init
*
* @brief Initializes the I2Cx peripheral according to the specified
* parameters in the I2C_InitStruct.
*
* @param I2C_Mode - refer to I2C_ModeTypeDef
* @param I2C_ClockSpeed - Specifies the clock frequency(Hz).
* This parameter must be set to a value lower than 400kHz
* @param I2C_DutyCycle - Specifies the I2C fast mode duty cycle.refer to I2C_DutyTypeDef
* @param I2C_Ack - Enables or disables the acknowledgement.refer to I2C_AckTypeDef
* @param I2C_AckAddr - Specifies if 7-bit or 10-bit address is acknowledged.refer to I2C_AckAddrTypeDef
* @param I2C_OwnAddress1 - Specifies the first device own address.
* This parameter can be a 7-bit or 10-bit address.
*
* @return none
*/
void I2C_Init(I2C_ModeTypeDef I2C_Mode, uint32_t I2C_ClockSpeed, I2C_DutyTypeDef I2C_DutyCycle,
I2C_AckTypeDef I2C_Ack, I2C_AckAddrTypeDef I2C_AckAddr, uint16_t I2C_OwnAddress1)
{
uint32_t sysClock;
uint16_t tmpreg;
I2C_SoftwareResetCmd(ENABLE);
I2C_SoftwareResetCmd(DISABLE);
sysClock = GetSysClock();
R16_I2C_CTRL2 &= ~RB_I2C_FREQ;
R16_I2C_CTRL2 |= (sysClock / 1000000);
R16_I2C_CTRL1 &= ~RB_I2C_PE;
if(I2C_ClockSpeed <= 100000)
{
tmpreg = (sysClock / (I2C_ClockSpeed << 1)) & RB_I2C_CCR;
if(tmpreg < 0x04)
tmpreg = 0x04;
R16_I2C_RTR = (((sysClock / 1000000) + 1) > 0x3F) ? 0x3F : ((sysClock / 1000000) + 1);
}
else
{
if(I2C_DutyCycle == I2C_DutyCycle_2)
{
tmpreg = (sysClock / (I2C_ClockSpeed * 3)) & RB_I2C_CCR;
}
else
{
tmpreg = (sysClock / (I2C_ClockSpeed * 25)) & RB_I2C_CCR;
tmpreg |= I2C_DutyCycle_16_9;
}
if(tmpreg == 0)
{
tmpreg |= (uint16_t)0x0001;
}
tmpreg |= RB_I2C_F_S;
R16_I2C_RTR = (uint16_t)((((sysClock / 1000000) * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1);
}
R16_I2C_CKCFGR = tmpreg;
R16_I2C_CTRL1 |= RB_I2C_PE;
R16_I2C_CTRL1 &= ~(RB_I2C_SMBUS | RB_I2C_SMBTYPE | RB_I2C_ACK);
R16_I2C_CTRL1 |= I2C_Mode | I2C_Ack;
R16_I2C_OADDR1 &= 0;
R16_I2C_OADDR1 |= I2C_AckAddr | I2C_OwnAddress1;
}
/*********************************************************************
* @fn I2C_Cmd
*
* @brief Enables or disables the specified I2C peripheral.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_Cmd(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_PE;
else
R16_I2C_CTRL1 &= ~RB_I2C_PE;
}
/*********************************************************************
* @fn I2C_GenerateSTART
*
* @brief Generates I2Cx communication START condition.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_GenerateSTART(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_START;
else
R16_I2C_CTRL1 &= ~RB_I2C_START;
}
/*********************************************************************
* @fn I2C_GenerateSTOP
*
* @brief Generates I2Cx communication STOP condition.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_GenerateSTOP(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_STOP;
else
R16_I2C_CTRL1 &= ~RB_I2C_STOP;
}
/*********************************************************************
* @fn I2C_AcknowledgeConfig
*
* @brief Enables or disables the specified I2C acknowledge feature.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_AcknowledgeConfig(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_ACK;
else
R16_I2C_CTRL1 &= ~RB_I2C_ACK;
}
/*********************************************************************
* @fn I2C_OwnAddress2Config
*
* @brief Configures the specified I2C own address2.
*
* @param Address - specifies the 7bit I2C own address2.
*
* @return none
*/
void I2C_OwnAddress2Config(uint8_t Address)
{
R16_I2C_OADDR2 &= ~RB_I2C_ADD2;
R16_I2C_OADDR2 |= (uint16_t)(Address & RB_I2C_ADD2);
}
/*********************************************************************
* @fn I2C_DualAddressCmd
*
* @brief Enables or disables the specified I2C dual addressing mode.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_DualAddressCmd(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_OADDR2 |= RB_I2C_ENDUAL;
else
R16_I2C_OADDR2 &= ~RB_I2C_ENDUAL;
}
/*********************************************************************
* @fn I2C_GeneralCallCmd
*
* @brief Enables or disables the specified I2C general call feature.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_GeneralCallCmd(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_ENGC;
else
R16_I2C_CTRL1 &= ~RB_I2C_ENGC;
}
/*********************************************************************
* @fn I2C_ITConfig
*
* @brief Enables or disables the specified I2C interrupts.
*
* @param I2C_IT - specifies the I2C interrupts sources to be enabled or disabled.
* I2C_IT_BUF - Buffer interrupt mask.
* I2C_IT_EVT - Event interrupt mask.
* I2C_IT_ERR - Error interrupt mask.
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_ITConfig(I2C_ITTypeDef I2C_IT, FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL2 |= I2C_IT;
else
R16_I2C_CTRL2 &= (uint16_t)~I2C_IT;
}
/*********************************************************************
* @fn I2C_SendData
*
* @brief Sends a data byte through the I2Cx peripheral.
*
* @param Data - Byte to be transmitted.
*
* @return none
*/
void I2C_SendData(uint8_t Data)
{
R16_I2C_DATAR = Data;
}
/*********************************************************************
* @fn I2C_ReceiveData
*
* @brief Returns the most recent received data by the I2Cx peripheral.
*
* @return The value of the received data.
*/
uint8_t I2C_ReceiveData(void)
{
return (uint8_t)R16_I2C_DATAR;
}
/*********************************************************************
* @fn I2C_Send7bitAddress
*
* @brief Transmits the address byte to select the slave device.
*
* @param Address - specifies the slave address which will be transmitted.
* @param I2C_Direction - specifies whether the I2C device will be a Transmitter or a Receiver.
* I2C_Direction_Transmitter - Transmitter mode.
* I2C_Direction_Receiver - Receiver mode.
*
* @return none
*/
void I2C_Send7bitAddress(uint8_t Address, uint8_t I2C_Direction)
{
if(I2C_Direction != I2C_Direction_Transmitter)
Address |= OADDR1_ADD0_Set;
else
Address &= OADDR1_ADD0_Reset;
R16_I2C_DATAR = Address;
}
/*********************************************************************
* @fn I2C_SoftwareResetCmd
*
* @brief Enables or disables the specified I2C software reset.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_SoftwareResetCmd(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_SWRST;
else
R16_I2C_CTRL1 &= ~RB_I2C_SWRST;
}
/*********************************************************************
* @fn I2C_NACKPositionConfig
*
* @brief Selects the specified I2C NACK position in master receiver mode.
*
* @param I2C_NACKPosition - specifies the NACK position.
* I2C_NACKPosition_Next - indicates that the next byte will be the last received byte.
* I2C_NACKPosition_Current - indicates that current byte is the last received byte.
*
* @return none
*/
void I2C_NACKPositionConfig(uint16_t I2C_NACKPosition)
{
if(I2C_NACKPosition == I2C_NACKPosition_Next)
R16_I2C_CTRL1 |= I2C_NACKPosition_Next;
else
R16_I2C_CTRL1 &= I2C_NACKPosition_Current;
}
/*********************************************************************
* @fn I2C_SMBusAlertConfig
*
* @brief Drives the SMBusAlert pin high or low for the specified I2C.
*
* @param I2C_SMBusAlert - specifies SMBAlert pin level.
* I2C_SMBusAlert_Low - SMBAlert pin driven low.
* I2C_SMBusAlert_High - SMBAlert pin driven high.
*
* @return none
*/
void I2C_SMBusAlertConfig(uint16_t I2C_SMBusAlert)
{
if(I2C_SMBusAlert == I2C_SMBusAlert_Low)
R16_I2C_CTRL1 |= I2C_SMBusAlert_Low;
else
R16_I2C_CTRL1 &= I2C_SMBusAlert_High;
}
/*********************************************************************
* @fn I2C_TransmitPEC
*
* @brief Enables or disables the specified I2C PEC transfer.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_TransmitPEC(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_PEC;
else
R16_I2C_CTRL1 &= ~RB_I2C_PEC;
}
/*********************************************************************
* @fn I2C_PECPositionConfig
*
* @brief Selects the specified I2C PEC position.
*
* @param I2C_PECPosition - specifies the PEC position.
* I2C_PECPosition_Next - indicates that the next byte is PEC.
* I2C_PECPosition_Current - indicates that current byte is PEC.
*
* @return none
*/
void I2C_PECPositionConfig(uint16_t I2C_PECPosition)
{
if(I2C_PECPosition == I2C_PECPosition_Next)
R16_I2C_CTRL1 |= I2C_PECPosition_Next;
else
R16_I2C_CTRL1 &= I2C_PECPosition_Current;
}
/*********************************************************************
* @fn I2C_CalculatePEC
*
* @brief Enables or disables the PEC value calculation of the transferred bytes.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_CalculatePEC(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_ENPEC;
else
R16_I2C_CTRL1 &= ~RB_I2C_ENPEC;
}
/*********************************************************************
* @fn I2C_GetPEC
*
* @brief Returns the PEC value for the specified I2C.
*
* @return The PEC value.
*/
uint8_t I2C_GetPEC(void)
{
return (R16_I2C_STAR2 >> 8);
}
/*********************************************************************
* @fn I2C_ARPCmd
*
* @brief Enables or disables the specified I2C ARP.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_ARPCmd(FunctionalState NewState)
{
if(NewState != DISABLE)
R16_I2C_CTRL1 |= RB_I2C_EBARP;
else
R16_I2C_CTRL1 &= ~RB_I2C_EBARP;
}
/*********************************************************************
* @fn I2C_StretchClockCmd
*
* @brief Enables or disables the specified I2C Clock stretching.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void I2C_StretchClockCmd(FunctionalState NewState)
{
if(NewState == DISABLE)
R16_I2C_CTRL1 |= RB_I2C_NOSTRETCH;
else
R16_I2C_CTRL1 &= ~RB_I2C_NOSTRETCH;
}
/*********************************************************************
* @fn I2C_FastModeDutyCycleConfig
*
* @brief Selects the specified I2C fast mode duty cycle.
*
* @param I2C_DutyCycle - specifies the fast mode duty cycle.
* I2C_DutyCycle_2 - I2C fast mode Tlow/Thigh = 2.
* I2C_DutyCycle_16_9 - I2C fast mode Tlow/Thigh = 16/9.
*
* @return none
*/
void I2C_FastModeDutyCycleConfig(uint16_t I2C_DutyCycle)
{
if(I2C_DutyCycle != I2C_DutyCycle_16_9)
R16_I2C_CKCFGR &= ~I2C_DutyCycle_16_9;
else
R16_I2C_CKCFGR |= I2C_DutyCycle_16_9;
}
/*********************************************************************
* @fn I2C_CheckEvent
*
* @brief Checks whether the last I2Cx Event is equal to the one passed as parameter.
*
* @param I2C_EVENT - specifies the event to be checked.
* I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1.
* I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1.
* I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1.
* I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1.
* I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1.
* I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2.
* (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2.
* (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2.
* I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3.
* (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3.
* (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3.
* I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2.
* I2C_EVENT_SLAVE_STOP_DETECTED : EV4.
* I2C_EVENT_MASTER_MODE_SELECT : EV5.
* I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6.
* I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6.
* I2C_EVENT_MASTER_BYTE_RECEIVED : EV7.
* I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8.
* I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2.
* I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9.
*
* @return 1 - SUCCESS or 0 - ERROR.
*/
uint8_t I2C_CheckEvent(uint32_t I2C_EVENT)
{
uint32_t lastevent = 0;
uint32_t flag1 = 0, flag2 = 0;
uint8_t status = 0;
flag1 = R16_I2C_STAR1;
flag2 = R16_I2C_STAR2;
flag2 = flag2 << 16;
lastevent = (flag1 | flag2) & FLAG_Mask;
if((lastevent & I2C_EVENT) == I2C_EVENT)
{
status = !0;
}
else
{
status = 0;
}
return status;
}
/*********************************************************************
* @fn I2C_GetLastEvent
*
* @brief Returns the last I2Cx Event.
*
* @return The last event.
*/
uint32_t I2C_GetLastEvent(void)
{
uint32_t lastevent = 0;
uint32_t flag1 = 0, flag2 = 0;
flag1 = R16_I2C_STAR1;
flag2 = R16_I2C_STAR2;
flag2 = flag2 << 16;
lastevent = (flag1 | flag2) & FLAG_Mask;
return lastevent;
}
/*********************************************************************
* @fn I2C_GetFlagStatus
*
* @brief Checks whether the last I2Cx Event is equal to the one passed as parameter.
*
* @param I2C_FLAG - specifies the flag to check.
* I2C_FLAG_DUALF - Dual flag (Slave mode).
* I2C_FLAG_SMBHOST - SMBus host header (Slave mode).
* I2C_FLAG_SMBDEFAULT - SMBus default header (Slave mode).
* I2C_FLAG_GENCALL - General call header flag (Slave mode).
* I2C_FLAG_TRA - Transmitter/Receiver flag.
* I2C_FLAG_BUSY - Bus busy flag.
* I2C_FLAG_MSL - Master/Slave flag.
* I2C_FLAG_SMBALERT - SMBus Alert flag.
* I2C_FLAG_TIMEOUT - Timeout or Tlow error flag.
* I2C_FLAG_PECERR - PEC error in reception flag.
* I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode).
* I2C_FLAG_AF - Acknowledge failure flag.
* I2C_FLAG_ARLO - Arbitration lost flag (Master mode).
* I2C_FLAG_BERR - Bus error flag.
* I2C_FLAG_TXE - Data register empty flag (Transmitter).
* I2C_FLAG_RXNE - Data register not empty (Receiver) flag.
* I2C_FLAG_STOPF - Stop detection flag (Slave mode).
* I2C_FLAG_ADD10 - 10-bit header sent flag (Master mode).
* I2C_FLAG_BTF - Byte transfer finished flag.
* I2C_FLAG_ADDR - Address sent flag (Master mode) "ADSL"
* Address matched flag (Slave mode)"ENDA".
* I2C_FLAG_SB - Start bit flag (Master mode).
*
* @return FlagStatus - SET or RESET.
*/
FlagStatus I2C_GetFlagStatus(uint32_t I2C_FLAG)
{
FlagStatus bitstatus = RESET;
__IO uint32_t i2creg = 0, i2cxbase = 0;
i2cxbase = (uint32_t)BA_I2C;
i2creg = I2C_FLAG >> 28;
I2C_FLAG &= FLAG_Mask;
if(i2creg != 0)
{
i2cxbase += 0x14;
}
else
{
I2C_FLAG = (uint32_t)(I2C_FLAG >> 16);
i2cxbase += 0x18;
}
if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn I2C_ClearFlag
*
* @brief Clears the I2Cx's pending flags.
*
* @param I2C_FLAG - specifies the flag to clear.
* I2C_FLAG_SMBALERT - SMBus Alert flag.
* I2C_FLAG_TIMEOUT - Timeout or Tlow error flag.
* I2C_FLAG_PECERR - PEC error in reception flag.
* I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode).
* I2C_FLAG_AF - Acknowledge failure flag.
* I2C_FLAG_ARLO - Arbitration lost flag (Master mode).
* I2C_FLAG_BERR - Bus error flag.
*
* @return none
*/
void I2C_ClearFlag(uint32_t I2C_FLAG)
{
uint32_t flagpos = 0;
flagpos = I2C_FLAG & FLAG_Mask;
R16_I2C_STAR1 = (uint16_t)~flagpos;
}
/*********************************************************************
* @fn I2C_GetITStatus
*
* @brief Checks whether the specified I2C interrupt has occurred or not.
*
* @param II2C_IT - specifies the interrupt source to check.
* I2C_FLAG_SMBALERT - SMBus Alert flag.
* I2C_FLAG_TIMEOUT - Timeout or Tlow error flag.
* I2C_FLAG_PECERR - PEC error in reception flag.
* I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode).
* I2C_FLAG_AF - Acknowledge failure flag.
* I2C_FLAG_ARLO - Arbitration lost flag (Master mode).
* I2C_FLAG_BERR - Bus error flag.
* I2C_FLAG_TXE - Data register empty flag (Transmitter).
* I2C_FLAG_RXNE - Data register not empty (Receiver) flag.
* I2C_FLAG_STOPF - Stop detection flag (Slave mode).
* I2C_FLAG_ADD10 - 10-bit header sent flag (Master mode).
* I2C_FLAG_BTF - Byte transfer finished flag.
* I2C_FLAG_ADDR - Address sent flag (Master mode) "ADSL"
* Address matched flag (Slave mode)"ENDA".
* I2C_FLAG_SB - Start bit flag (Master mode).
*
* @return none
*/
ITStatus I2C_GetITStatus(uint32_t I2C_IT)
{
ITStatus bitstatus = RESET;
uint32_t enablestatus = 0;
enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (R16_I2C_CTRL2));
I2C_IT &= FLAG_Mask;
if(((R16_I2C_STAR1 & I2C_IT) != (uint32_t)RESET) && enablestatus)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn I2C_ClearITPendingBit
*
* @brief Clears the I2Cx interrupt pending bits.
*
* @param I2C_IT - specifies the interrupt pending bit to clear.
* I2C_IT_SMBALERT - SMBus Alert interrupt.
* I2C_IT_TIMEOUT - Timeout or Tlow error interrupt.
* I2C_IT_PECERR - PEC error in reception interrupt.
* I2C_IT_OVR - Overrun/Underrun interrupt (Slave mode).
* I2C_IT_AF - Acknowledge failure interrupt.
* I2C_IT_ARLO - Arbitration lost interrupt (Master mode).
* I2C_IT_BERR - Bus error interrupt.
*
* @return none
*/
void I2C_ClearITPendingBit(uint32_t I2C_IT)
{
uint32_t flagpos = 0;
flagpos = I2C_IT & FLAG_Mask;
R16_I2C_STAR1 = (uint16_t)~flagpos;
}

View File

@@ -0,0 +1,63 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_keyscan.c
* Author : WCH
* Version : V1.0
* Date : 2024/12/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn KeyScan_Cfg
*
* @brief <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD>ɨ<EFBFBD><EFBFBD><E8B9A6>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><E8B9A6>
* @param keyScanPin - <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EBB0B4>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>IOʹ<4F><CAB9>
* @param ClkDiv - <20><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>ʱ<EFBFBD>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ԴLSI
* @param Rep - <20><><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><E8B5BD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
*
* @return none
*/
void KeyScan_Cfg(uint8_t s, uint16_t keyScanPin, uint16_t ClkDiv, uint16_t Rep)
{
if(s == DISABLE)
{
R16_KEY_SCAN_CTRL &= ~(RB_SCAN_START_EN);
}
else
{
R16_KEY_SCAN_CTRL |= keyScanPin | ClkDiv | Rep;
R16_KEY_SCAN_CTRL |= RB_SCAN_START_EN;
}
}
/*********************************************************************
* @fn KeyPress_Wake
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB><EFBFBD>˯<EFBFBD><CBAF>ʹ<EFBFBD><CAB9>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>
*
* @return none
*/
void KeyPress_Wake(uint8_t s)
{
if(s == DISABLE)
{
sys_safe_access_enable();
R8_SLP_CLK_OFF0 &= ~(RB_SLP_KEYSCAN_WAKE);
sys_safe_access_disable();
}
else
{
sys_safe_access_enable();
R8_SLP_CLK_OFF0 |= RB_SLP_KEYSCAN_WAKE;
sys_safe_access_disable();
}
}

View File

@@ -0,0 +1,246 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_pwm.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn PWMX_CycleCfg
*
* @brief PWM 8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - refer to PWMX_CycleTypeDef
*
* @return none
*/
void PWMX_CycleCfg(PWMX_CycleTypeDef cyc)
{
switch(cyc)
{
case PWMX_Cycle_256:
R8_PWM_CONFIG &= ~(0x07);
break;
case PWMX_Cycle_255:
R8_PWM_CONFIG |= 0x01;
break;
case PWMX_Cycle_128:
R8_PWM_CONFIG |= (1 << 1);
break;
case PWMX_Cycle_127:
R8_PWM_CONFIG |= (1 << 1) | 0x01;
break;
case PWMX_Cycle_64:
R8_PWM_CONFIG |= (2 << 1);
break;
case PWMX_Cycle_63:
R8_PWM_CONFIG |= (2 << 1) | 0x01;
break;
default:
break;
}
}
/*********************************************************************
* @fn PWMX_16bit_CycleCfg
*
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - 16λ<36><CEBB><EFBFBD><EFBFBD>
*
* @return none
*/
void PWMX_16bit_CycleCfg(uint8_t ch, uint16_t cyc)
{
if(ch & (CH_PWM1|CH_PWM2|CH_PWM3))
{
R16_PWM_CYC_VALUE = cyc;
}
if(ch & (CH_PWM4|CH_PWM5))
{
R16_PWM_CYC1_VALUE = cyc;
}
}
/*********************************************************************
* @fn PWMX_16bit_ACTOUT
*
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param s - control pwmx function, ENABLE or DISABLE
*
* @return none
*/
void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, FunctionalState s)
{
uint8_t i;
if(s == DISABLE)
{
R8_PWM_OUT_EN &= ~(ch);
}
else
{
(pr) ? (R8_PWM_POLAR |= (ch)) : (R8_PWM_POLAR &= ~(ch));
for(i = 0; i < 5; i++)
{
if((ch >> i) & 1)
{
if(i<3)
{
*((volatile uint16_t *)((&R16_PWM1_DATA) + i)) = da;
}
else
{
*((volatile uint16_t *)((&R16_PWM4_DATA) + (i-3))) = da;
}
}
}
R8_PWM_OUT_EN |= (ch);
}
}
/*********************************************************************
* @fn PWMX_ACTOUT
*
* @brief PWM 8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param s - control pwmx function, ENABLE or DISABLE
*
* @return none
*/
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s)
{
uint8_t i;
if(s == DISABLE)
{
R8_PWM_OUT_EN &= ~(ch);
}
else
{
(pr) ? (R8_PWM_POLAR |= (ch)) : (R8_PWM_POLAR &= ~(ch));
switch(ch)
{
case CH_PWM1:
*((volatile uint16_t *)((&R8_PWM1_DATA))) = da;
break;
case CH_PWM2:
*((volatile uint16_t *)((&R8_PWM2_DATA))) = da;
break;
case CH_PWM3:
*((volatile uint16_t *)((&R8_PWM3_DATA))) = da;
break;
case CH_PWM4:
*((volatile uint16_t *)((&R8_PWM4_DATA))) = da;
break;
case CH_PWM5:
*((volatile uint16_t *)((&R8_PWM5_DATA))) = da;
break;
default:
break;
}
R8_PWM_OUT_EN |= (ch);
}
}
/*********************************************************************
* @fn PWMX_AlterOutCfg
*
* @brief PWM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param ch - select group of PWM alternate output
* RB_PWM4_5_STAG_EN - PWM4 <20><> PWM5 ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param s - control pwmx function, ENABLE or DISABLE
*
* @return none
*/
void PWMX_AlterOutCfg(uint8_t ch, FunctionalState s)
{
if(s == DISABLE)
{
R8_PWM_CONFIG &= ~(ch);
}
else
{
R8_PWM_CONFIG |= (ch);
}
}
/*********************************************************************
* @fn PWMX_SyncOutCfg
*
* @brief PWM ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param s - control pwmx function, ENABLE or DISABLE
*
* @return none
*/
void PWMX_SyncOutCfg(FunctionalState s)
{
if(s == DISABLE)
{
R8_PWM_CONFIG &= ~(RB_PWM_SYNC_EN);
}
else
{
R8_PWM_CONFIG |= RB_PWM_SYNC_EN;
R8_PWM_CONFIG |= RB_PWM_SYNC_START;
}
}
/*********************************************************************
* @fn PWM_DMACfg
*
* @brief <20><><EFBFBD><EFBFBD>PWM DMA<4D><41><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
* @param startAddr - DMA <20><>ʼ<EFBFBD><CABC>ַ
* @param endAddr - DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
* @param m - <20><><EFBFBD><EFBFBD>DMAģʽ
* @param ch - <20><><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
*
* @return none
*/
void PWM_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, PWM_DMAModeTypeDef m, PWM_DMAChannel ch)
{
if(s == DISABLE)
{
R8_PWM_DMA_CTRL = 0;
}
else
{
R32_PWM_DMA_BEG = startAddr & 0xFFFF;
R32_PWM_DMA_END = endAddr & 0xFFFF;
if(m)
R8_PWM_DMA_CTRL = RB_DMA_ADDR_LOOP | RB_DMA_ENABLE;
else
R8_PWM_DMA_CTRL = RB_DMA_ENABLE;
if(ch != Mode_DMACH4_5)
{
if(ch == Mode_DMACH1_3) R8_PWM_DMA_CTRL |= RB_DMA_SEL;
else R8_PWM_CONFIG |= RB_PWM_SYNC_EN | RB_PWM_SYNC_START;
}
}
}

View File

@@ -0,0 +1,300 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_pwr.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn PWR_PeriphClkCfg
*
* @brief <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>λ
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @param perph - please refer to Peripher CLK control bit define
*
* @return none
*/
void PWR_PeriphClkCfg(FunctionalState s, uint16_t perph)
{
uint32_t sleep_ctrl = R32_SLEEP_CONTROL;
if(s == DISABLE)
{
sleep_ctrl |= perph;
}
else
{
sleep_ctrl &= ~perph;
}
sys_safe_access_enable();
R32_SLEEP_CONTROL = sleep_ctrl;
sys_safe_access_disable();
}
/*********************************************************************
* @fn PWR_PeriphWakeUpCfg
*
* @brief ˯<>߻<EFBFBD><DFBB><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪴<EFBFBD><F2BFAAB4><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD>߻<EFBFBD><DFBB>ѹ<EFBFBD><D1B9><EFBFBD>
* @param perph - <20><>Ҫ<EFBFBD><D2AA><EFBFBD>õĻ<C3B5><C4BB><EFBFBD>Դ
* RB_GPIO_WAKE_MODE - GPIO<49><4F><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>ģʽʹ<CABD><CAB9> 1:<3A><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>,RB_SLP_GPIO_EDGE_MODE=1,˫<><CBAB><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>
* RB_SLP_GPIO_EDGE_MODE=0,<2C><><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>;0:<3A><>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
* RB_SLP_USB_WAKE - USBFS Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_USB2_WAKE - USBHS Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_RTC_WAKE - RTC Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_GPIO_WAKE - GPIO Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_BAT_WAKE - BAT Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_GPIO_EDGE_MODE - GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6>ܻ<EFBFBD><DCBB><EFBFBD>
* @param mode - refer to WakeUP_ModeypeDef
*
* @return none
*/
void PWR_PeriphWakeUpCfg(FunctionalState s, uint8_t perph, WakeUP_ModeypeDef mode)
{
if(s == DISABLE)
{
sys_safe_access_enable();
R8_SLP_WAKE_CTRL &= ~perph;
sys_safe_access_disable();
}
else
{
sys_safe_access_enable();
R8_SLP_WAKE_CTRL |= RB_WAKE_EV_MODE | perph;
sys_safe_access_disable();
sys_safe_access_enable();
R8_SLP_POWER_CTRL &= ~(RB_WAKE_DLY_MOD);
sys_safe_access_disable();
sys_safe_access_enable();
R8_SLP_POWER_CTRL |= mode;
sys_safe_access_disable();
}
}
/*********************************************************************
* @fn PowerMonitor
*
* @brief <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪴˹<F2BFAAB4><CBB9><EFBFBD>
* @param vl - refer to VolM_LevelypeDef
*
* @return none
*/
void PowerMonitor(FunctionalState s, VolM_LevelypeDef vl)
{
uint8_t ctrl = R8_BAT_DET_CTRL;
uint8_t cfg = R8_BAT_DET_CFG;
if(s == DISABLE)
{
sys_safe_access_enable();
R8_BAT_DET_CTRL = 0;
sys_safe_access_disable();
}
else
{
cfg = vl & 0x03;
ctrl = RB_BAT_MON_EN;
sys_safe_access_enable();
R8_BAT_DET_CTRL = ctrl;
R8_BAT_DET_CFG = cfg;
sys_safe_access_disable();
mDelayuS(1);
sys_safe_access_enable();
R8_BAT_DET_CTRL |= RB_BAT_LOW_IE;
sys_safe_access_disable();
}
}
/*********************************************************************
* @fn LowPower_Idle
*
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Idleģʽ
*
* @param none
*
* @return none
*/
__HIGH_CODE
void LowPower_Idle(void)
{
FLASH_ROM_SW_RESET();
R8_FLASH_CTRL = 0x04; //flash<73>ر<EFBFBD>
PFIC->SCTLR &= ~(1 << 2); // sleep
__WFI();
__nop();
__nop();
}
/*********************************************************************
* @fn LowPower_Halt
*
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Haltģʽ<C4A3><CABD><EFBFBD>˵͹<CBB5><CDB9><EFBFBD><EFBFBD>е<EFBFBD>HSI/5ʱ<35><CAB1><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD>Ҫ<EFBFBD>û<EFBFBD><C3BB>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ϵͳʱ<CDB3><CAB1>Դ
*
* @param none
*
* @return none
*/
__HIGH_CODE
void LowPower_Halt(void)
{
uint8_t x32Mpw;
FLASH_ROM_SW_RESET();
R8_FLASH_CTRL = 0x04; //flash<73>ر<EFBFBD>
x32Mpw = R8_XT32M_TUNE;
if(!(R8_HFCK_PWR_CTRL&RB_CLK_XT32M_KEEP))
{
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%<25><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
}
sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // <20>رյ<D8B1>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
sys_safe_access_disable();
sys_safe_access_enable();
R8_XT32M_TUNE = x32Mpw;
sys_safe_access_disable();
sys_safe_access_enable();
R8_PLL_CONFIG |= (1 << 5);
sys_safe_access_disable();
PFIC->SCTLR |= (1 << 2); //deep sleep
__WFI();
__nop();
__nop();
sys_safe_access_enable();
R8_PLL_CONFIG &= ~(1 << 5);
sys_safe_access_disable();
}
/*******************************************************************************
* Function Name : LowPower_Sleep
* Description : <20>͹<EFBFBD><CDB9><EFBFBD>-Sleepģʽ<C4A3><CABD>
* Input : rm:
RB_PWR_RAM12K - 12K retention SRAM <20><><EFBFBD><EFBFBD>
RB_PWR_EXTEND - USB <20><> BLE <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򹩵<EFBFBD>
RB_PWR_XROM - FlashROM <20><><EFBFBD><EFBFBD>
NULL - <09><><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ϵ<EFBFBD>
* Return : None
*******************************************************************************/
__HIGH_CODE
void LowPower_Sleep(uint16_t rm)
{
uint8_t x32Mpw;
uint16_t power_plan;
uint8_t clk_sys_cfg;
uint16_t hfck_pwr_ctrl;
clk_sys_cfg = R8_CLK_SYS_CFG;
hfck_pwr_ctrl = R8_HFCK_PWR_CTRL;
x32Mpw = R8_XT32M_TUNE;
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%<25><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // <20>رյ<D8B1>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
sys_safe_access_disable();
sys_safe_access_enable();
R8_XT32M_TUNE = x32Mpw;
sys_safe_access_disable();
PFIC->SCTLR |= (1 << 2); //deep sleep
power_plan = RB_PWR_PLAN_EN | RB_PWR_CORE | rm | (2<<11);
sys_safe_access_enable();
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀǰ<C4BF>õ<EFBFBD>3584
R8_SLP_POWER_CTRL |= 0x40;
R16_POWER_PLAN = power_plan;
sys_safe_access_disable();
sys_safe_access_enable();
R8_CLK_SYS_CFG = CLK_SOURCE_HSE_PLL_24MHz;
sys_safe_access_disable();
// if((R16_CLK_SYS_CFG & RB_CLK_SYS_MOD) == 0x40)
// {
// sys_safe_access_enable();
// R16_CLK_SYS_CFG = (R16_CLK_SYS_CFG&(~RB_CLK_PLL_DIV))|24;
// sys_safe_access_disable();
// }
// sys_safe_access_enable();
// R8_PLL_CONFIG |= (1 << 5);
// sys_safe_access_disable();
__WFI();
__nop();
__nop();
sys_safe_access_enable();
R8_CLK_SYS_CFG = clk_sys_cfg;
// R8_HFCK_PWR_CTRL = hfck_pwr_ctrl;
sys_safe_access_disable();
sys_safe_access_enable();
R16_POWER_PLAN &= ~RB_PWR_PLAN_EN;
R16_POWER_PLAN &= ~RB_XT_PRE_EN;
sys_safe_access_disable();
// sys_safe_access_enable();
// R8_PLL_CONFIG &= ~(1 << 5);
// sys_safe_access_disable();
DelayUs(40);
}
/*********************************************************************
* @fn LowPower_Shutdown
*
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Shutdownģʽ<C4A3><CABD><EFBFBD>˵͹<CBB5><CDB9><EFBFBD><EFBFBD>е<EFBFBD>HSI/5ʱ<35><CAB1><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD>Ҫ<EFBFBD>û<EFBFBD><C3BB>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ϵͳʱ<CDB3><CAB1>Դ
* @note ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>DCDC<44><43><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرգ<D8B1><D5A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>ٴδ<D9B4><CEB4><EFBFBD>
*
* @param rm - <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ѡ<EFBFBD><D1A1>
* RB_PWR_RAM12K - 12K retention SRAM <20><><EFBFBD><EFBFBD>
* RB_PWR_EXTEND - USB <20><> BLE <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򹩵<EFBFBD>
* NULL - <20><><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ϵ<EFBFBD>
*
* @return none
*/
__HIGH_CODE
void LowPower_Shutdown(uint16_t rm)
{
uint8_t x32Mpw;
FLASH_ROM_SW_RESET();
x32Mpw = R8_XT32M_TUNE;
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%<25><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // <20>رյ<D8B1>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
sys_safe_access_disable();
sys_safe_access_enable();
R8_XT32M_TUNE = x32Mpw;
sys_safe_access_disable();
PFIC->SCTLR |= (1 << 2); //deep sleep
SetSysClock(CLK_SOURCE_HSE_PLL_24MHz);
sys_safe_access_enable();
R8_SLP_POWER_CTRL |= 0x40;
sys_safe_access_disable();
sys_safe_access_enable();
R16_POWER_PLAN = RB_PWR_PLAN_EN | rm;
sys_safe_access_disable();
__WFI();
__nop();
__nop();
FLASH_ROM_SW_RESET();
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
sys_safe_access_disable();
}

View File

@@ -0,0 +1,454 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_SPI.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn SPI_MasterDefInit
*
* @brief <20><><EFBFBD><EFBFBD>ģʽĬ<CABD>ϳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ0+3<><33>ȫ˫<C8AB><CBAB>+8MHz
*
* @param none
*
* @return none
*/
void SPI_MasterDefInit(void)
{
R8_SPI_CLOCK_DIV = 4; // <20><>Ƶʱ<C6B5><CAB1>4<EFBFBD><34>Ƶ
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE;
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF; // <20><><EFBFBD><EFBFBD>BUFFER/FIFO<46>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>IF_BYTE_END<4E><44>־
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41>ʽ
}
/*********************************************************************
* @fn SPI_2WIRE_MasterOutputInit
*
* @brief <20><><EFBFBD><EFBFBD>2<EFBFBD>߷<EFBFBD><DFB7><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*
* @param none
*
* @return none
*/
void SPI_2WIRE_MasterOutputInit(void)
{
R8_SPI_CLOCK_DIV = 4; // <20><>Ƶʱ<C6B5><CAB1>4<EFBFBD><34>Ƶ
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE | RB_SPI_2WIRE_MOD; // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF; // <20><><EFBFBD><EFBFBD>BUFFER/FIFO<46>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>IF_BYTE_END<4E><44>־
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41>ʽ
}
/*********************************************************************
* @fn SPI_2WIRE_MasterReceiveInit
*
* @brief <20><><EFBFBD><EFBFBD>2<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*
* @param none
*
* @return none
*/
void SPI_2WIRE_MasterReceiveInit(void)
{
R8_SPI_CLOCK_DIV = 4; // <20><>Ƶʱ<C6B5><CAB1>4<EFBFBD><34>Ƶ
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_SCK_OE | RB_SPI_2WIRE_MOD; // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF; // <20><><EFBFBD><EFBFBD>BUFFER/FIFO<46>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>IF_BYTE_END<4E><44>־
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41>ʽ
}
/*********************************************************************
* @fn SPI_2WIRE_SlaveInputInit
*
* @brief <20>ӻ<EFBFBD>2<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*
* @param none
*
* @return none
*/
void SPI_2WIRE_SlaveInputInit(void)
{
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_2WIRE_MOD | RB_SPI_MODE_SLAVE;
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF | RB_MST_CLK_SEL;
}
/*********************************************************************
* @fn SPI_2WIRE_SlaveOutputInit
*
* @brief <20>ӻ<EFBFBD>2<EFBFBD>߷<EFBFBD><DFB7><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*
* @param none
*
* @return none
*/
void SPI_2WIRE_SlaveOutputInit(void)
{
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_2WIRE_MOD | RB_SPI_MODE_SLAVE;
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF;
}
/*********************************************************************
* @fn SPI_CLKCfg
*
* @brief SPI <20><>׼ʱ<D7BC><CAB1><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>= d*Tsys
*
* @param c - ʱ<>ӷ<EFBFBD>Ƶϵ<C6B5><CFB5>
*
* @return none
*/
void SPI_CLKCfg(uint8_t c)
{
if(c == 2)
{
R8_SPI_CTRL_CFG |= RB_SPI_MST_DLY_EN;
}
else
{
R8_SPI_CTRL_CFG &= ~RB_SPI_MST_DLY_EN;
}
R8_SPI_CLOCK_DIV = c;
}
/*********************************************************************
* @fn SPI_DataMode
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
*
* @param m - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ refer to ModeBitOrderTypeDef
*
* @return none
*/
void SPI_DataMode(ModeBitOrderTypeDef m)
{
switch(m)
{
case Mode0_LowBitINFront:
R8_SPI_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
R8_SPI_CTRL_CFG |= RB_SPI_BIT_ORDER;
break;
case Mode0_HighBitINFront:
R8_SPI_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
R8_SPI_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
break;
case Mode3_LowBitINFront:
R8_SPI_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
R8_SPI_CTRL_CFG |= RB_SPI_BIT_ORDER;
break;
case Mode3_HighBitINFront:
R8_SPI_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
R8_SPI_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
break;
default:
break;
}
}
/*********************************************************************
* @fn SPI_MasterSendByte
*
* @brief <20><><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD> (buffer)
*
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
*
* @return none
*/
void SPI_MasterSendByte(uint8_t d)
{
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R16_SPI_TOTAL_CNT = 1;
R8_SPI_FIFO = d;
while(!(R8_SPI_INT_FLAG & RB_SPI_FREE));
}
/*********************************************************************
* @fn SPI_MasterRecvByte
*
* @brief <20><><EFBFBD>յ<EFBFBD><D5B5>ֽ<EFBFBD> (buffer)
*
* @param none
*
* @return <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD>
*/
uint8_t SPI_MasterRecvByte(void)
{
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R8_SPI_BUFFER = 0xFF; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(!(R8_SPI_INT_FLAG & RB_SPI_FREE));
return (R8_SPI_BUFFER);
}
/*********************************************************************
* @fn SPI_MasterTrans
*
* @brief ʹ<><CAB9>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ֽ<EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*
* @return none
*/
void SPI_MasterTrans(uint8_t *pbuf, uint16_t len)
{
uint16_t sendlen;
sendlen = len;
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
R16_SPI_TOTAL_CNT = sendlen; // <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END;
while(sendlen)
{
if(R8_SPI_FIFO_COUNT < SPI_FIFO_SIZE)
{
R8_SPI_FIFO = *pbuf;
pbuf++;
sendlen--;
}
}
while(R8_SPI_FIFO_COUNT != 0); // <20>ȴ<EFBFBD>FIFO<46>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*********************************************************************
* @fn SPI_MasterRecv
*
* @brief ʹ<><CAB9>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6>ֽ<EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*
* @return none
*/
void SPI_MasterRecv(uint8_t *pbuf, uint16_t len)
{
uint16_t readlen;
readlen = len;
R8_SPI_CTRL_MOD |= RB_SPI_FIFO_DIR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
R16_SPI_TOTAL_CNT = len; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ȳ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END;
while(readlen)
{
if(R8_SPI_FIFO_COUNT)
{
*pbuf = R8_SPI_FIFO;
pbuf++;
readlen--;
}
}
}
/*********************************************************************
* @fn SPI_MasterDMATrans
*
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
void SPI_MasterDMATrans(uint8_t *pbuf, uint16_t len)
{
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R16_SPI_DMA_BEG = (uint32_t)pbuf;
R16_SPI_DMA_END = (uint32_t)(pbuf + len);
R16_SPI_TOTAL_CNT = len;
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;
R8_SPI_CTRL_CFG |= RB_SPI_DMA_ENABLE;
while(!(R8_SPI_INT_FLAG & RB_SPI_IF_CNT_END));
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
}
/*********************************************************************
* @fn SPI_MasterDMARecv
*
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
void SPI_MasterDMARecv(uint8_t *pbuf, uint16_t len)
{
R8_SPI_CTRL_MOD |= RB_SPI_FIFO_DIR;
R16_SPI_DMA_BEG = (uint32_t)pbuf;
R16_SPI_DMA_END = (uint32_t)(pbuf + len);
R16_SPI_TOTAL_CNT = len;
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;
R8_SPI_CTRL_CFG |= RB_SPI_DMA_ENABLE;
while(!(R8_SPI_INT_FLAG & RB_SPI_IF_CNT_END));
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
}
/*********************************************************************
* @fn SPI_SlaveInit
*
* @brief <20>豸ģʽĬ<CABD>ϳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MISO<53><4F>GPIO<49><4F>ӦΪ<D3A6><CEAA><EFBFBD><EFBFBD>ģʽ
*
* @return none
*/
void SPI_SlaveInit(void)
{
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_MODE_SLAVE;
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF;
}
/*********************************************************************
* @fn SPI_2WIRE_SlaveInit
*
* @brief <20>豸2<E8B1B8><32>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC>
*
* @return none
*/
void SPI_2WIRE_SlaveInit(void)
{
R8_SPI_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_2WIRE_MOD | RB_SPI_MODE_SLAVE;
R8_SPI_CTRL_CFG |= RB_SPI_AUTO_IF;
}
/*********************************************************************
* @fn SPI_SlaveRecvByte
*
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t SPI_SlaveRecvByte(void)
{
R8_SPI_CTRL_MOD |= RB_SPI_FIFO_DIR;
while(R8_SPI_FIFO_COUNT == 0);
return R8_SPI_FIFO;
}
/*********************************************************************
* @fn SPI_SlaveSendByte
*
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void SPI_SlaveSendByte(uint8_t d)
{
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R16_SPI_TOTAL_CNT = 1;
R8_SPI_FIFO = d;
while(R8_SPI_FIFO_COUNT != 0); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*********************************************************************
* @fn SPI_SlaveRecv
*
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
__HIGH_CODE
void SPI_SlaveRecv(uint8_t *pbuf, uint16_t len)
{
uint16_t revlen;
revlen = len;
R8_SPI_CTRL_MOD |= RB_SPI_FIFO_DIR;
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END;
while(revlen)
{
if(R8_SPI_FIFO_COUNT)
{
*pbuf = R8_SPI_FIFO;
pbuf++;
revlen--;
}
}
}
/*********************************************************************
* @fn SPI_SlaveTrans
*
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*
* @return none
*/
__HIGH_CODE
void SPI_SlaveTrans(uint8_t *pbuf, uint16_t len)
{
uint16_t sendlen;
sendlen = len;
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END;
while(sendlen)
{
if(R8_SPI_FIFO_COUNT < SPI_FIFO_SIZE)
{
R8_SPI_FIFO = *pbuf;
pbuf++;
sendlen--;
}
}
while(R8_SPI_FIFO_COUNT != 0); // <20>ȴ<EFBFBD>FIFO<46>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*********************************************************************
* @fn SPI_SlaveDMARecv
*
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
void SPI_SlaveDMARecv(uint8_t *pbuf, uint16_t len)
{
R8_SPI_CTRL_MOD |= RB_SPI_FIFO_DIR;
R16_SPI_DMA_BEG = (uint32_t)pbuf;
R16_SPI_DMA_END = (uint32_t)(pbuf + len);
R16_SPI_TOTAL_CNT = len;
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;
R8_SPI_CTRL_CFG |= RB_SPI_DMA_ENABLE;
while(!(R8_SPI_INT_FLAG & RB_SPI_IF_CNT_END));
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
}
/*********************************************************************
* @fn SPI_SlaveDMATrans
*
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
void SPI_SlaveDMATrans(uint8_t *pbuf, uint16_t len)
{
R8_SPI_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R16_SPI_DMA_BEG = (uint32_t)pbuf;
R16_SPI_DMA_END = (uint32_t)(pbuf + len);
R16_SPI_TOTAL_CNT = len;
R8_SPI_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;
R8_SPI_CTRL_CFG |= RB_SPI_DMA_ENABLE;
while(!(R8_SPI_INT_FLAG & RB_SPI_IF_CNT_END));
R8_SPI_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
}

View File

@@ -0,0 +1,421 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_SYS.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn SetSysClock
*
* @brief <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
*
* @param sc - ϵͳʱ<CDB3><CAB1>Դѡ<D4B4><D1A1> refer to SYS_CLKTypeDef
*
* @return none
*/
__HIGH_CODE
void SetSysClock(SYS_CLKTypeDef sc)
{
uint16_t clk_sys_cfg;
uint8_t i;
uint8_t x32M_c;
if(sc == RB_CLK_SYS_MOD) // LSI
{
sys_safe_access_enable();
R8_CLK_SYS_CFG |= RB_CLK_SYS_MOD;
sys_safe_access_disable();
}
else
{
if(!(R8_HFCK_PWR_CTRL & RB_CLK_XT32M_PON))
{
x32M_c = R8_XT32M_TUNE;
sys_safe_access_enable();
R8_XT32M_TUNE |= 0x03;
R8_HFCK_PWR_CTRL |= RB_CLK_XT32M_PON;
sys_safe_access_disable();
clk_sys_cfg = R8_CLK_SYS_CFG;
sys_safe_access_enable();
R8_CLK_SYS_CFG |= 0xC0;
sys_safe_access_disable();
for(i=0; i<9; i++)
{
__nop();
}
sys_safe_access_enable();
R8_CLK_SYS_CFG = clk_sys_cfg;
R8_XT32M_TUNE = x32M_c;
sys_safe_access_disable();
}
if((sc & RB_CLK_SYS_MOD) == 0x40) // PLL div
{
sys_safe_access_enable();
R8_HFCK_PWR_CTRL |= RB_CLK_PLL_PON;
R8_FLASH_CFG = 0X01;
R8_FLASH_SCK |= 1<<4; //50M
sys_safe_access_disable();
}
else // 32M div
{
if((sc&0x1F) )
{
sys_safe_access_enable();
R8_FLASH_CFG = 0X02;
sys_safe_access_disable();
}
else
{
sys_safe_access_enable();
R8_FLASH_CFG = 0X07;
sys_safe_access_disable();
}
}
sys_safe_access_enable();
R8_CLK_SYS_CFG = sc;
sys_safe_access_disable();
}
}
/*********************************************************************
* @fn GetSysClock
*
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳʱ<CDB3><CAB1>
*
* @param none
*
* @return Hz
*/
uint32_t GetSysClock(void)
{
if((R8_CLK_SYS_CFG & RB_CLK_SYS_MOD) == RB_CLK_SYS_MOD)
{ // 32K<32><4B><EFBFBD><EFBFBD>Ƶ
return (Freq_LSI);
}
else if((R8_CLK_SYS_CFG & RB_CLK_SYS_MOD) == 0x40)
{
return (600000000 / ((R8_CLK_SYS_CFG & 0x1f)?(R8_CLK_SYS_CFG & 0x1f):32));
}
else
{ // 32M<32><4D><EFBFBD>з<EFBFBD>Ƶ
return (32000000 / ((R8_CLK_SYS_CFG & 0x1f)?(R8_CLK_SYS_CFG & 0x1f):32));
}
}
/*********************************************************************
* @fn SYS_GetInfoSta
*
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳ<CFB5><CDB3>Ϣ״̬
*
* @param i - refer to SYS_InfoStaTypeDef
*
* @return <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i)
{
if(i == STA_SAFEACC_ACT)
{
return (R8_SAFE_ACCESS_SIG & RB_SAFE_ACC_ACT);
}
else
{
return (R8_GLOB_CFG_INFO & (1 << i));
}
}
/*********************************************************************
* @fn SYS_ResetExecute
*
* @brief ִ<><D6B4>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
*
* @param none
*
* @return none
*/
__HIGH_CODE
void SYS_ResetExecute(void)
{
FLASH_ROM_SW_RESET();
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
sys_safe_access_disable();
}
/*********************************************************************
* @fn SYS_DisableAllIrq
*
* @brief <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ж<EFBFBD>ֵ
*
* @param pirqv - <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ֵ
*
* @return none
*/
void SYS_DisableAllIrq(uint32_t *pirqv)
{
*pirqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24);
PFIC->IRER[0] = 0xffffffff;
PFIC->IRER[1] = 0xffffffff;
asm volatile("fence.i");
}
/*********************************************************************
* @fn SYS_RecoverIrq
*
* @brief <20>ָ<EFBFBD>֮ǰ<D6AE>رյ<D8B1><D5B5>ж<EFBFBD>ֵ
*
* @param irq_status - <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ֵ
*
* @return none
*/
void SYS_RecoverIrq(uint32_t irq_status)
{
PFIC->IENR[0] = (irq_status << 8);
PFIC->IENR[1] = (irq_status >> 24);
}
/*********************************************************************
* @fn SYS_GetSysTickCnt
*
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳ(SYSTICK)<29><><EFBFBD><EFBFBD>ֵ
*
* @param none
*
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
*/
uint32_t SYS_GetSysTickCnt(void)
{
return SysTick->CNTL;
}
/*********************************************************************
* @fn WWDG_ITCfg
*
* @brief <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ж<EFBFBD>
*
* @return none
*/
void WWDG_ITCfg(FunctionalState s)
{
uint8_t ctrl = R8_RST_WDOG_CTRL;
if(s == DISABLE)
{
ctrl &= ~RB_WDOG_INT_EN;
}
else
{
ctrl |= RB_WDOG_INT_EN;
}
sys_safe_access_enable();
R8_RST_WDOG_CTRL = ctrl;
sys_safe_access_disable();
}
/*********************************************************************
* @fn WWDG_ResetCfg
*
* @brief <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>λ
*
* @return none
*/
void WWDG_ResetCfg(FunctionalState s)
{
uint8_t ctrl = R8_RST_WDOG_CTRL;
if(s == DISABLE)
{
ctrl &= ~RB_WDOG_RST_EN;
}
else
{
ctrl |= RB_WDOG_RST_EN;
}
sys_safe_access_enable();
R8_RST_WDOG_CTRL = ctrl;
sys_safe_access_disable();
}
/*********************************************************************
* @fn WWDG_ClearFlag
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ؼ<EFBFBD><D8BC><EFBFBD>ֵҲ<D6B5><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void WWDG_ClearFlag(void)
{
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_WDOG_INT_FLAG;
sys_safe_access_disable();
}
/*********************************************************************
* @fn HardFault_Handler
*
* @brief Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>и<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϊ<EFBFBD>ϵ縴λ
*
* @param none
*
* @return none
*/
__INTERRUPT
__HIGH_CODE
__attribute__((weak))
void HardFault_Handler(void)
{
FLASH_ROM_SW_RESET();
sys_safe_access_enable();
R16_INT_LSI_TUNE = 0xFFFF;
sys_safe_access_disable();
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
sys_safe_access_disable();
while(1);
}
/*********************************************************************
* @fn mDelayuS
*
* @brief uS <20><>ʱ
*
* @param t - ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
__HIGH_CODE
void mDelayuS(uint16_t t)
{
uint32_t i;
#if(FREQ_SYS == 100000000)
i = t * 25;
#elif(FREQ_SYS == 75000000)
i = (t * 25)>>1;
#elif(FREQ_SYS == 60000000)
i = t * 10;
#elif(FREQ_SYS == 50000000)
i = (t * 25)>>1;
#elif(FREQ_SYS == 40000000)
i = t * 10;
#elif(FREQ_SYS == 30000000)
i = t * 5;
#elif(FREQ_SYS == 25000000)
i = (t * 25)>>2;
#elif(FREQ_SYS == 24000000)
i = t * 6;
#elif(FREQ_SYS == 20000000)
i = t * 5;
#elif(FREQ_SYS == 16000000)
i = t << 2;
#elif(FREQ_SYS == 8000000)
i = t << 1;
#elif(FREQ_SYS == 6400000)
i = t * 8 / 5;
#elif(FREQ_SYS == 4000000)
i = t;
#elif(FREQ_SYS == 2000000)
i = t >> 1;
#elif(FREQ_SYS == 1000000)
i = t >> 2;
#else
i = t;
#endif
#if((FREQ_SYS == 75000000)||\
(FREQ_SYS == 60000000)||\
(FREQ_SYS == 30000000))
while(--i)
{
__nop();
};
#else
do
{
__nop();
}while(--i);
#endif
}
/*********************************************************************
* @fn mDelaymS
*
* @brief mS <20><>ʱ
*
* @param t - ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
__HIGH_CODE
void mDelaymS(uint16_t t)
{
do
{
mDelayuS(1000);
}while(--t);
}
//YYW,20250918
//#ifdef DEBUG
//int _write(int fd, char *buf, int size)
//{
// int i;
// for(i = 0; i < size; i++)
// {
// while(R8_UART_TFC == UART_FIFO_SIZE); /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> */
// R8_UART_THR = *buf++; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
// }
// return size;
//}
//
//#endif
/*********************************************************************
* @fn _sbrk
*
* @brief Change the spatial position of data segment.
*
* @return size: Data length
*/
__attribute__((used))
void *_sbrk(ptrdiff_t incr)
{
extern char _end[];
static char *curbrk = _end;
if ((curbrk + incr < _end) || ((uint32_t)curbrk + incr > (__get_SP() - 64)))
return NULL - 1;
curbrk += incr;
return curbrk - incr;
}
/*********************************************************************
* @fn __wrap_memcpy
*
* @brief wrap memcpy
*
* @return dst
*/
__HIGH_CODE
void *__wrap_memcpy(void *dst, void *src, size_t size)
{
__MCPY(dst, src, (void *)((uint32_t)src+size));
return dst;
}

View File

@@ -0,0 +1,132 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_timer0.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn TMR_TimerInit
*
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param t - <20><>ʱʱ<CAB1><EFBFBD><E4A3AC><EFBFBD>ڵ<EFBFBD>ǰϵͳʱ<CDB3><CAB1>Tsys, <20><EFBFBD><EEB3A4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> 67108864
*
* @return none
*/
void TMR_TimerInit(uint32_t t)
{
R32_TMR_CNT_END = t;
R8_TMR_CTRL_MOD = RB_TMR_ALL_CLEAR;
R8_TMR_CTRL_MOD = RB_TMR_COUNT_EN;
}
/*********************************************************************
* @fn TMR_EXTSingleCounterInit
*
* @brief <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param cap - <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void TMR_EXTSingleCounterInit(CapModeTypeDef cap)
{
R8_TMR_CTRL_MOD = RB_TMR_ALL_CLEAR;
R8_TMR_CTRL_MOD = RB_TMR_COUNT_EN | RB_TMR_CAP_COUNT | RB_TMR_MODE_IN | (cap << 6);
}
/*********************************************************************
* @fn TMR_PWMInit
*
* @brief PWM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
*
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
*
* @return none
*/
void TMR_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts)
{
R8_TMR_CTRL_MOD = RB_TMR_ALL_CLEAR;
R8_TMR_CTRL_MOD = (pr << 4) | (ts << 6);
}
/*********************************************************************
* @fn TMR_CapInit
*
* @brief <20>ⲿ<EFBFBD>źŲ<C5BA>׽<EFBFBD><D7BD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param cap - select capture mode, refer to CapModeTypeDef
*
* @return none
*/
void TMR_CapInit(CapModeTypeDef cap)
{
R8_TMR_CTRL_MOD = RB_TMR_ALL_CLEAR;
R8_TMR_CTRL_MOD = RB_TMR_COUNT_EN | RB_TMR_MODE_IN | (cap << 6);
}
/*********************************************************************
* @fn TMR_DMACfg
*
* @brief <20><><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
* @param startAddr - DMA <20><>ʼ<EFBFBD><CABC>ַ
* @param endAddr - DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
* @param m - <20><><EFBFBD><EFBFBD>DMAģʽ
*
* @return none
*/
void TMR_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, DMAModeTypeDef m)
{
if(s == DISABLE)
{
R8_TMR_CTRL_DMA = 0;
}
else
{
R16_TMR_DMA_BEG = startAddr & 0xFFFF;
R16_TMR_DMA_END = endAddr & 0xFFFF;
if(m)
R8_TMR_CTRL_DMA = RB_TMR_DMA_LOOP | RB_TMR_DMA_ENABLE;
else
R8_TMR_CTRL_DMA = RB_TMR_DMA_ENABLE;
}
}
/*********************************************************************
* @fn ENC_Config
*
* @brief <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param encReg - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ֵ(<28><><EFBFBD><EFBFBD>ֵ0xFFFF)
* @param m - <20><><EFBFBD><EFBFBD>ENCģʽ
*
* @return none
*/
void ENC_Config(uint8_t s, uint32_t encReg, ENCModeTypeDef m)
{
if(s == DISABLE)
{
R8_ENC_REG_CTRL &= ~(RB_START_ENC_EN);
}
else
{
R8_ENC_REG_CTRL |= (m << 1) | RB_START_ENC_EN;
R32_ENC_REG_CEND |= encReg;
}
}

View File

@@ -0,0 +1,160 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_UART.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
/*********************************************************************
* @fn UART_DefInit
*
* @brief <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void UART_DefInit(void)
{
UART_BaudRateCfg(115200);
R8_UART_FCR = (2 << 6) | RB_FCR_FIFO_EN; // FIFO<46>򿪣<EFBFBD><F2BFAAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
R8_UART_LCR = RB_LCR_WORD_SZ;
R8_UART_IER = RB_IER_TXD_EN;
R8_UART_DIV = 1;
}
/*********************************************************************
* @fn UART_BaudRateCfg
*
* @brief <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param baudrate - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void UART_BaudRateCfg(uint32_t baudrate)
{
uint32_t x;
x = 10 * GetSysClock() / 8 / baudrate;
x = (x + 5) / 10;
R16_UART_DL = (uint16_t)x;
}
/*********************************************************************
* @fn UART_ByteTrigCfg
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param b - <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> refer to UARTByteTRIGTypeDef
*
* @return none
*/
void UART_ByteTrigCfg(UARTByteTRIGTypeDef b)
{
R8_UART_FCR = (R8_UART_FCR & ~RB_FCR_FIFO_TRIG) | (b << 6);
}
/*********************************************************************
* @fn UART_INTCfg
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - <20>жϿ<D0B6><CFBF><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>Ӧ<EFBFBD>ж<EFBFBD>
* @param i - <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
* RB_IER_MODEM_CHG - <20><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> UART ֧<>֣<EFBFBD>
* RB_IER_LINE_STAT - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·״̬<D7B4>ж<EFBFBD>
* RB_IER_THR_EMPTY - <20><><EFBFBD>ͱ<EFBFBD><CDB1>ּĴ<D6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* RB_IER_RECV_RDY - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*
* @return none
*/
void UART_INTCfg(FunctionalState s, uint8_t i)
{
if(s)
{
R8_UART_IER |= i;
R8_UART_MCR |= RB_MCR_INT_OE;
}
else
{
R8_UART_IER &= ~i;
}
}
/*********************************************************************
* @fn UART_SendString
*
* @brief <20><><EFBFBD>ڶ<EFBFBD><DAB6>ֽڷ<D6BD><DAB7><EFBFBD>
*
* @param buf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*
* @return none
*/
void UART_SendString(uint8_t *buf, uint16_t l)
{
uint16_t len = l;
while(len)
{
if(R8_UART_TFC != UART_FIFO_SIZE)
{
R8_UART_THR = *buf++;
len--;
}
}
}
/*********************************************************************
* @fn UART_RecvString
*
* @brief <20><><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD>
*
* @param buf - <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
*
* @return <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
uint16_t UART_RecvString(uint8_t *buf)
{
uint16_t len = 0;
while(R8_UART_RFC)
{
*buf++ = R8_UART_RBR;
len++;
}
return (len);
}
/*********************************************************************
* @fn UART_Remap
*
* @brief <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
*
* @param s - <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ӳ<EFBFBD><D3B3>
* @param perph - дTx<54><78>Rx<52><78>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ϵ
*
*
* @return none
*/
void UART_Remap(FunctionalState s, UARTTxPinRemapDef u_tx, UARTRxPinRemapDef u_rx)
{
if(s)
{
R16_PIN_ALTERNATE_H &= ~(RB_UART_TXD | RB_UART_RXD); // <20>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ縴λ<E7B8B4><CEBB>ShutDown˯<6E><CBAF>ʱ<EFBFBD><CAB1>0
R16_PIN_ALTERNATE_H |= (u_tx << 3) | u_rx;
}
else
{
R16_PIN_ALTERNATE_H &= ~(RB_UART_TXD | RB_UART_RXD);
}
}

View File

@@ -0,0 +1,113 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbdev.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
uint8_t *pEP0_RAM_Addr;
uint8_t *pEP1_RAM_Addr;
uint8_t *pEP2_RAM_Addr;
uint8_t *pEP3_RAM_Addr;
/*********************************************************************
* @fn USB_DeviceInit
*
* @brief USB<53><EFBFBD><E8B1B8><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>˵㣬8<E3A3AC><38>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
*
* @param none
*
* @return none
*/
void USB_DeviceInit(void)
{
R8_USB_CTRL = 0x00; // <20><><EFBFBD>趨ģʽ<><C8A1> RB_UC_CLR_ALL
R8_UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN; // <20>˵<EFBFBD>4 OUT+IN,<2C>˵<EFBFBD>1 OUT+IN
R8_UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN; // <20>˵<EFBFBD>2 OUT+IN,<2C>˵<EFBFBD>3 OUT+IN
R16_UEP0_DMA = (uint16_t)(uint32_t)pEP0_RAM_Addr;
R16_UEP1_DMA = (uint16_t)(uint32_t)pEP1_RAM_Addr;
R16_UEP2_DMA = (uint16_t)(uint32_t)pEP2_RAM_Addr;
R16_UEP3_DMA = (uint16_t)(uint32_t)pEP3_RAM_Addr;
R8_UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
R8_UEP1_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
R8_UEP2_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
R8_UEP3_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
R8_UEP4_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
R8_USB_DEV_AD = 0x00;
R8_USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN; // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڼ<EFBFBD><DABC>жϱ<D0B6>־δ<D6BE><CEB4><EFBFBD><EFBFBD>ǰ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>NAK
R16_PIN_ALTERNATE |= RB_PIN_USB_EN | RB_UDP_PU_EN; // <20><>ֹUSB<53>˿ڸ<CBBF><DAB8>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
R8_USB_INT_FG = 0xFF; // <20><><EFBFBD>жϱ<D0B6>־
R8_UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN; // <20><><EFBFBD><EFBFBD>USB<53>˿<EFBFBD>
R8_USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER;
}
/*********************************************************************
* @fn DevEP1_IN_Deal
*
* @brief <20>˵<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*
* @return none
*/
void DevEP1_IN_Deal(uint8_t l)
{
R8_UEP1_T_LEN = l;
R8_UEP1_CTRL = (R8_UEP1_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
}
/*********************************************************************
* @fn DevEP2_IN_Deal
*
* @brief <20>˵<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*
* @return none
*/
void DevEP2_IN_Deal(uint8_t l)
{
R8_UEP2_T_LEN = l;
R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
}
/*********************************************************************
* @fn DevEP3_IN_Deal
*
* @brief <20>˵<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*
* @return none
*/
void DevEP3_IN_Deal(uint8_t l)
{
R8_UEP3_T_LEN = l;
R8_UEP3_CTRL = (R8_UEP3_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
}
/*********************************************************************
* @fn DevEP4_IN_Deal
*
* @brief <20>˵<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*
* @return none
*/
void DevEP4_IN_Deal(uint8_t l)
{
R8_UEP4_T_LEN = l;
R8_UEP4_CTRL = (R8_UEP4_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
}

View File

@@ -0,0 +1,695 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbhost.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
#if DISK_LIB_ENABLE
#include "CHRV3UFI.H"
#endif
uint8_t UsbDevEndp0Size; // USB<53><EFBFBD>Ķ˵<C4B6>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
uint8_t FoundNewDev;
_RootHubDev ThisUsbDev; //ROOT<4F><54>
_DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // <20>ٶ<EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ⲿHUB,ÿ<><C3BF><EFBFBD>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB_MAX_PORTS<54><53><EFBFBD>˿<EFBFBD>(<28><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>)
uint8_t *pHOST_RX_RAM_Addr;
uint8_t *pHOST_TX_RAM_Addr;
/*<2A><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
__attribute__((aligned(4))) const uint8_t SetupGetDevDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_DEVICE, 0x00, 0x00, sizeof(USB_DEV_DESCR), 0x00};
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
__attribute__((aligned(4))) const uint8_t SetupGetCfgDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_CONFIG, 0x00, 0x00, 0x04, 0x00};
/*<2A><><EFBFBD><EFBFBD>USB<53><42>ַ*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbAddr[] = {USB_REQ_TYP_OUT, USB_SET_ADDRESS, USB_DEVICE_ADDR, 0x00,
0x00, 0x00, 0x00, 0x00};
/*<2A><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbConfig[] = {USB_REQ_TYP_OUT, USB_SET_CONFIGURATION, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00};
/*<2A><><EFBFBD><EFBFBD>USB<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbInterface[] = {USB_REQ_RECIP_INTERF, USB_SET_INTERFACE, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00};
/*<2A><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>STALL*/
__attribute__((aligned(4))) const uint8_t SetupClrEndpStall[] = {USB_REQ_TYP_OUT | USB_REQ_RECIP_ENDP, USB_CLEAR_FEATURE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/*********************************************************************
* @fn DisableRootHubPort
*
* @brief <20>ر<EFBFBD>ROOT-HUB<55>˿<EFBFBD><><CAB5><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Ѿ<EFBFBD><D1BE>Զ<EFBFBD><D4B6>ر<EFBFBD>,<2C>˴<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB>ṹ״̬
*
* @param none
*
* @return none
*/
void DisableRootHubPort(void)
{
#ifdef FOR_ROOT_UDISK_ONLY
CHRV3DiskStatus = DISK_DISCONNECT;
#endif
#ifndef DISK_BASE_BUF_LEN
ThisUsbDev.DeviceStatus = ROOT_DEV_DISCONNECT;
ThisUsbDev.DeviceAddress = 0x00;
#endif
}
/*********************************************************************
* @fn AnalyzeRootHub
*
* @brief <20><><EFBFBD><EFBFBD>ROOT-HUB״̬,<2C><><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>DisableRootHubPort()<29><><EFBFBD><EFBFBD>,<2C><><EFBFBD>˿ڹر<DAB9>,<2C><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD>˿ڵ<CBBF>״̬λ
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESSΪû<CEAA><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_CONNECTΪ<54><CEAA><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_DISCONΪ<4E><CEAA><EFBFBD><EFBFBD>Ͽ<EFBFBD>
*/
uint8_t AnalyzeRootHub(void)
{
uint8_t s;
s = ERR_SUCCESS;
if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH)
{ // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
#ifdef DISK_BASE_BUF_LEN
if(CHRV3DiskStatus == DISK_DISCONNECT
#else
if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT // <20><><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
#endif
|| (R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00)
{ // <20><><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><><CBB5><EFBFBD>Ǹղ<C7B8><D5B2><EFBFBD>
DisableRootHubPort(); // <20>رն˿<D5B6>
#ifdef DISK_BASE_BUF_LEN
CHRV3DiskStatus = DISK_CONNECT;
#else
ThisUsbDev.DeviceSpeed = R8_USB_MIS_ST & RB_UMS_DM_LEVEL ? 0 : 1;
ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED; //<2F><><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD>־
#endif
PRINT("USB dev in\n");
s = ERR_USB_CONNECT;
}
}
#ifdef DISK_BASE_BUF_LEN
else if(CHRV3DiskStatus >= DISK_CONNECT)
{
#else
else if(ThisUsbDev.DeviceStatus >= ROOT_DEV_CONNECTED)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD>
#endif
DisableRootHubPort(); // <20>رն˿<D5B6>
PRINT("USB dev out\n");
if(s == ERR_SUCCESS)
{
s = ERR_USB_DISCON;
}
}
// R8_USB_INT_FG = RB_UIF_DETECT; // <20><><EFBFBD>жϱ<D0B6>־
return (s);
}
/*********************************************************************
* @fn SetHostUsbAddr
*
* @brief <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
*
* @param addr - USB<53><EFBFBD><E8B1B8>ַ
*
* @return none
*/
void SetHostUsbAddr(uint8_t addr)
{
R8_USB_DEV_AD = (R8_USB_DEV_AD & RB_UDA_GP_BIT) | (addr & MASK_USB_ADDR);
}
/*********************************************************************
* @fn SetUsbSpeed
*
* @brief <20><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD>
*
* @param FullSpeed - USB<53>ٶ<EFBFBD>
*
* @return none
*/
void SetUsbSpeed(uint8_t FullSpeed)
{
#ifndef DISK_BASE_BUF_LEN
if(FullSpeed) // ȫ<><C8AB>
{
R8_USB_CTRL &= ~RB_UC_LOW_SPEED; // ȫ<><C8AB>
R8_UH_SETUP &= ~RB_UH_PRE_PID_EN; // <20><>ֹPRE PID
}
else
{
R8_USB_CTRL |= RB_UC_LOW_SPEED; // <20><><EFBFBD><EFBFBD>
}
#endif
(void)FullSpeed;
}
/*********************************************************************
* @fn ResetRootHubPort
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><E8B1B8>,<2C><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>,Ϊö<CEAA><C3B6><EFBFBD>豸׼<E8B1B8><D7BC>,<2C><><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>Ϊȫ<CEAA><C8AB>
*
* @param none
*
* @return none
*/
void ResetRootHubPort(void)
{
UsbDevEndp0Size = DEFAULT_ENDP0_SIZE; //USB<53><EFBFBD>Ķ˵<C4B6>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
SetHostUsbAddr(0x00);
R8_UHOST_CTRL &= ~RB_UH_PORT_EN; // <20>ص<EFBFBD><D8B5>˿<EFBFBD>
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
R8_UHOST_CTRL = (R8_UHOST_CTRL & ~RB_UH_LOW_SPEED) | RB_UH_BUS_RESET; // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>,<2C><>ʼ<EFBFBD><CABC>λ
mDelaymS(15); // <20><>λʱ<CEBB><CAB1>10mS<6D><53>20mS
R8_UHOST_CTRL = R8_UHOST_CTRL & ~RB_UH_BUS_RESET; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
mDelayuS(250);
R8_USB_INT_FG = RB_UIF_DETECT; // <20><><EFBFBD>жϱ<D0B6>־
}
/*********************************************************************
* @fn EnableRootHubPort
*
* @brief ʹ<><CAB9>ROOT-HUB<55>˿<EFBFBD>,<2C><>Ӧ<EFBFBD><D3A6>bUH_PORT_EN<45><4E>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>,<2C><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>·<EFBFBD><C2B7><EFBFBD>ʧ<EFBFBD><CAA7>
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESSΪ<53><CEAA><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_DISCONΪ<4E><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t EnableRootHubPort(void)
{
#ifdef DISK_BASE_BUF_LEN
if(CHRV3DiskStatus < DISK_CONNECT)
CHRV3DiskStatus = DISK_CONNECT;
#else
if(ThisUsbDev.DeviceStatus < ROOT_DEV_CONNECTED)
ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED;
#endif
if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH)
{ // <20><><EFBFBD>
#ifndef DISK_BASE_BUF_LEN
if((R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00)
{ // <20><>δʹ<CEB4><CAB9>
ThisUsbDev.DeviceSpeed = (R8_USB_MIS_ST & RB_UMS_DM_LEVEL) ? 0 : 1;
if(ThisUsbDev.DeviceSpeed == 0)
{
R8_UHOST_CTRL |= RB_UH_LOW_SPEED; // <20><><EFBFBD><EFBFBD>
}
}
#endif
R8_UHOST_CTRL |= RB_UH_PORT_EN; //ʹ<><CAB9>HUB<55>˿<EFBFBD>
return (ERR_SUCCESS);
}
return (ERR_USB_DISCON);
}
#ifndef DISK_BASE_BUF_LEN
/*********************************************************************
* @fn SelectHubPort
*
* @brief ѡ<><D1A1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB<55><42>
*
* @param HubPortIndex - ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5>ⲿHUB<55><42>ָ<EFBFBD><D6B8><EFBFBD>˿<EFBFBD>
*
* @return None
*/
void SelectHubPort(uint8_t HubPortIndex)
{
if(HubPortIndex) // ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5>ⲿHUB<55><42>ָ<EFBFBD><D6B8><EFBFBD>˿<EFBFBD>
{
SetHostUsbAddr(DevOnHubPort[HubPortIndex - 1].DeviceAddress); // <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
SetUsbSpeed(DevOnHubPort[HubPortIndex - 1].DeviceSpeed); // <20><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD>
if(DevOnHubPort[HubPortIndex - 1].DeviceSpeed == 0) // ͨ<><CDA8><EFBFBD>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53>豸ͨѶ<CDA8><D1B6>Ҫǰ<D2AA><C7B0>ID
{
R8_UEP1_CTRL |= RB_UH_PRE_PID_EN; // <20><><EFBFBD><EFBFBD>PRE PID
mDelayuS(100);
}
}
else
{
SetHostUsbAddr(ThisUsbDev.DeviceAddress); // <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
SetUsbSpeed(ThisUsbDev.DeviceSpeed); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD>ٶ<EFBFBD>
}
}
#endif
/*********************************************************************
* @fn WaitUSB_Interrupt
*
* @brief <20>ȴ<EFBFBD>USB<53>ж<EFBFBD>
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESS <20><><EFBFBD>ݽ<EFBFBD><DDBD>ջ<EFBFBD><D5BB>߷<EFBFBD><DFB7>ͳɹ<CDB3>,<2C><><EFBFBD><EFBFBD>ERR_USB_UNKNOWN <20><><EFBFBD>ݽ<EFBFBD><DDBD>ջ<EFBFBD><D5BB>߷<EFBFBD><DFB7><EFBFBD>ʧ<EFBFBD><CAA7>
*/
uint8_t WaitUSB_Interrupt(void)
{
uint16_t i;
for(i = WAIT_USB_TOUT_200US; i != 0 && (R8_USB_INT_FG & RB_UIF_TRANSFER) == 0; i--)
{
;
}
return ((R8_USB_INT_FG & RB_UIF_TRANSFER) ? ERR_SUCCESS : ERR_USB_UNKNOWN);
}
/*********************************************************************
* @fn USBHostTransact
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ŀ<EFBFBD>Ķ˵<C4B6><CBB5><EFBFBD>ַ/PID<49><44><EFBFBD><EFBFBD><><CDAC><EFBFBD><EFBFBD>־,<2C><>20uSΪ<53><CEAA>λ<EFBFBD><CEBB>NAK<41><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,0xFFFF<46><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>,<2C><>ʱ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><><CEAA><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><>öԱ<C3B6><D4B1>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>
*
* @param endp_pid - <20><><EFBFBD>ƺ͵<C6BA>ַ, <20><><34><CEBB>token_pid<69><64><EFBFBD><EFBFBD>, <20><><34>Ƕ˵<C7B6><CBB5><EFBFBD>ַ
* @param tog - ͬ<><CDAC><EFBFBD><EFBFBD>־
* @param timeout - <20><>ʱʱ<CAB1><CAB1>
*
* @return ERR_USB_UNKNOWN <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
* ERR_USB_DISCON <20><EFBFBD>Ͽ<EFBFBD>
* ERR_USB_CONNECT <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
* ERR_SUCCESS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout)
{
uint8_t TransRetry;
uint8_t s, r;
uint16_t i;
R8_UH_RX_CTRL = R8_UH_TX_CTRL = tog;
TransRetry = 0;
do
{
R8_UH_EP_PID = endp_pid; // ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PID<49><44>Ŀ<EFBFBD>Ķ˵<C4B6><CBB5><EFBFBD>
R8_USB_INT_FG = RB_UIF_TRANSFER;
for(i = WAIT_USB_TOUT_200US; i != 0 && (R8_USB_INT_FG & RB_UIF_TRANSFER) == 0; i--)
{
;
}
R8_UH_EP_PID = 0x00; // ֹͣUSB<53><42><EFBFBD><EFBFBD>
if((R8_USB_INT_FG & RB_UIF_TRANSFER) == 0)
{
return (ERR_USB_UNKNOWN);
}
if(R8_USB_INT_FG & RB_UIF_DETECT)
{ // USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
// mDelayuS( 200 ); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
R8_USB_INT_FG = RB_UIF_DETECT;
s = AnalyzeRootHub(); // <20><><EFBFBD><EFBFBD>ROOT-HUB״̬
if(s == ERR_USB_CONNECT)
FoundNewDev = 1;
#ifdef DISK_BASE_BUF_LEN
if(CHRV3DiskStatus == DISK_DISCONNECT)
{
return (ERR_USB_DISCON);
} // USB<53><EFBFBD>Ͽ<EFBFBD><CFBF>¼<EFBFBD>
if(CHRV3DiskStatus == DISK_CONNECT)
{
return (ERR_USB_CONNECT);
} // USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
#else
if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT)
{
return (ERR_USB_DISCON);
} // USB<53><EFBFBD>Ͽ<EFBFBD><CFBF>¼<EFBFBD>
if(ThisUsbDev.DeviceStatus == ROOT_DEV_CONNECTED)
{
return (ERR_USB_CONNECT);
} // USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
#endif
mDelayuS(200); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
if(R8_USB_INT_FG & RB_UIF_TRANSFER) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
{
if(R8_USB_INT_ST & RB_UIS_TOG_OK)
{
return (ERR_SUCCESS);
}
r = R8_USB_INT_ST & MASK_UIS_H_RES; // USB<53>豸Ӧ<E8B1B8><D3A6>״̬
if(r == USB_PID_STALL)
{
return (r | ERR_USB_TRANSFER);
}
if(r == USB_PID_NAK)
{
if(timeout == 0)
{
return (r | ERR_USB_TRANSFER);
}
if(timeout < 0xFFFFFFFF)
{
timeout--;
}
--TransRetry;
}
else
switch(endp_pid >> 4)
{
case USB_PID_SETUP:
case USB_PID_OUT:
if(r)
{
return (r | ERR_USB_TRANSFER);
} // <20><><EFBFBD>dz<EFBFBD>ʱ/<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
break; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
case USB_PID_IN:
if(r == USB_PID_DATA0 || r == USB_PID_DATA1)
{ // <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} // <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if(r)
{
return (r | ERR_USB_TRANSFER);
} // <20><><EFBFBD>dz<EFBFBD>ʱ/<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
break; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
default:
return (ERR_USB_UNKNOWN); // <20><><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
break;
}
}
else
{ // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>,<2C><>Ӧ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
R8_USB_INT_FG = 0xFF; /* <20><><EFBFBD>жϱ<D0B6>־ */
}
mDelayuS(15);
} while(++TransRetry < 3);
return (ERR_USB_TRANSFER); // Ӧ<><D3A6><EFBFBD><EFBFBD>ʱ
}
/*********************************************************************
* @fn HostCtrlTransfer
*
* @brief ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>,8<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pSetupReq<65><71>,DataBufΪ<66><CEAA>ѡ<EFBFBD><D1A1><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param DataBuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>պͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ôDataBuf<75><66>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param RetLen - ʵ<>ʳɹ<CAB3><C9B9>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>RetLenָ<6E><D6B8><EFBFBD><EFBFBD><EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD>
*
* @return ERR_USB_BUF_OVER IN״̬<D7B4>׶γ<D7B6><CEB3><EFBFBD>
* ERR_SUCCESS <20><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
*/
uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
{
uint16_t RemLen = 0;
uint8_t s, RxLen, RxCnt, TxCnt;
uint8_t *pBuf;
uint8_t *pLen;
pBuf = DataBuf;
pLen = RetLen;
mDelayuS(200);
if(pLen)
{
*pLen = 0; // ʵ<>ʳɹ<CAB3><C9B9>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
}
R8_UH_TX_LEN = sizeof(USB_SETUP_REQ);
s = USBHostTransact(USB_PID_SETUP << 4 | 0x00, 0x00, 200000 / 20); // SETUP<55>׶<EFBFBD>,200mS<6D><53>ʱ
if(s != ERR_SUCCESS)
{
return (s);
}
R8_UH_RX_CTRL = R8_UH_TX_CTRL = RB_UH_R_TOG | RB_UH_R_AUTO_TOG | RB_UH_T_TOG | RB_UH_T_AUTO_TOG; // Ĭ<><C4AC>DATA1
R8_UH_TX_LEN = 0x01; // Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD>״̬<D7B4>׶<EFBFBD>ΪIN
RemLen = pSetupReq->wLength;
PRINT("wLength: %x\n", RemLen);
if(RemLen && pBuf) // <20><>Ҫ<EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
{
PRINT("bRequestType: %x\n", pSetupReq->bRequestType);
if(pSetupReq->bRequestType & USB_REQ_TYP_IN) // <20><>
{
while(RemLen)
{
mDelayuS(200);
s = USBHostTransact(USB_PID_IN << 4 | 0x00, R8_UH_RX_CTRL, 200000 / 20); // IN<49><4E><EFBFBD><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
RxLen = R8_USB_RX_LEN < RemLen ? R8_USB_RX_LEN : RemLen;
RemLen -= RxLen;
if(pLen)
{
*pLen += RxLen; // ʵ<>ʳɹ<CAB3><C9B9>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
}
for(RxCnt = 0; RxCnt != RxLen; RxCnt++)
{
*pBuf = pHOST_RX_RAM_Addr[RxCnt];
pBuf++;
}
if(R8_USB_RX_LEN == 0 || (R8_USB_RX_LEN & (UsbDevEndp0Size - 1)))
{
break; // <20>̰<EFBFBD>
}
}
R8_UH_TX_LEN = 0x00; // ״̬<D7B4>׶<EFBFBD>ΪOUT
}
else // <20><>
{
while(RemLen)
{
mDelayuS(200);
R8_UH_TX_LEN = RemLen >= UsbDevEndp0Size ? UsbDevEndp0Size : RemLen;
for(TxCnt = 0; TxCnt != R8_UH_TX_LEN; TxCnt++)
{
pHOST_TX_RAM_Addr[TxCnt] = *pBuf;
pBuf++;
}
s = USBHostTransact(USB_PID_OUT << 4 | 0x00, R8_UH_TX_CTRL, 200000 / 20); // OUT<55><54><EFBFBD><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
RemLen -= R8_UH_TX_LEN;
if(pLen)
{
*pLen += R8_UH_TX_LEN; // ʵ<>ʳɹ<CAB3><C9B9>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
}
}
PRINT("Send: %d\n", *pLen);
// R8_UH_TX_LEN = 0x01; // ״̬<D7B4>׶<EFBFBD>ΪIN
}
}
mDelayuS(200);
s = USBHostTransact((R8_UH_TX_LEN ? USB_PID_IN << 4 | 0x00 : USB_PID_OUT << 4 | 0x00), RB_UH_R_TOG | RB_UH_T_TOG, 200000 / 20); // STATUS<55>׶<EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
if(R8_UH_TX_LEN == 0)
{
return (ERR_SUCCESS); // ״̬OUT
}
if(R8_USB_RX_LEN == 0)
{
return (ERR_SUCCESS); // ״̬IN,<2C><><EFBFBD><EFBFBD>IN״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
}
return (ERR_USB_BUF_OVER); // IN״̬<D7B4>׶δ<D7B6><CEB4><EFBFBD>
}
/*********************************************************************
* @fn CopySetupReqPkg
*
* @brief <20><><EFBFBD>ƿ<EFBFBD><C6BF>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pReqPkt - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
*
* @return none
*/
void CopySetupReqPkg(const uint8_t *pReqPkt) // <20><><EFBFBD>ƿ<EFBFBD><C6BF>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
uint8_t i;
for(i = 0; i != sizeof(USB_SETUP_REQ); i++)
{
((uint8_t *)pSetupReq)[i] = *pReqPkt;
pReqPkt++;
}
}
/*********************************************************************
* @fn CtrlGetDeviceDescr
*
* @brief <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pHOST_TX_RAM_Addr <20><>
*
* @param none
*
* @return ERR_USB_BUF_OVER <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
* ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlGetDeviceDescr(void)
{
uint8_t s;
uint8_t len;
UsbDevEndp0Size = DEFAULT_ENDP0_SIZE;
CopySetupReqPkg(SetupGetDevDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
UsbDevEndp0Size = ((PUSB_DEV_DESCR)Com_Buffer)->bMaxPacketSize0; // <20>˵<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>Ǽ򻯴<C7BC><F2BBAFB4><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>Ȼ<EFBFBD>ȡǰ8<C7B0>ֽں<D6BD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UsbDevEndp0Size<7A>ټ<EFBFBD><D9BC><EFBFBD>
if(len < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength)
{
return (ERR_USB_BUF_OVER); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
}
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn CtrlGetConfigDescr
*
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pHOST_TX_RAM_Addr <20><>
*
* @param none
*
* @return ERR_USB_BUF_OVER <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
* ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlGetConfigDescr(void)
{
uint8_t s;
uint8_t len;
CopySetupReqPkg(SetupGetCfgDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
if(len < ((PUSB_SETUP_REQ)SetupGetCfgDescr)->wLength)
{
return (ERR_USB_BUF_OVER); // <20><><EFBFBD>س<EFBFBD><D8B3>ȴ<EFBFBD><C8B4><EFBFBD>
}
len = ((PUSB_CFG_DESCR)Com_Buffer)->wTotalLength;
CopySetupReqPkg(SetupGetCfgDescr);
pSetupReq->wLength = len; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
#ifdef DISK_BASE_BUF_LEN
if(len > 64)
len = 64;
memcpy(TxBuffer, Com_Buffer, len); //U<>̲<EFBFBD><CCB2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TxBuffer
#endif
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn CtrlSetUsbAddress
*
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
*
* @param addr - <20><EFBFBD><E8B1B8>ַ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbAddress(uint8_t addr)
{
uint8_t s;
CopySetupReqPkg(SetupSetUsbAddr);
pSetupReq->wValue = addr; // USB<53><EFBFBD><E8B1B8>ַ
s = HostCtrlTransfer(NULL, NULL); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
SetHostUsbAddr(addr); // <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
mDelaymS(10); // <20>ȴ<EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn CtrlSetUsbConfig
*
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
*
* @param cfg - <20><><EFBFBD><EFBFBD>ֵ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbConfig(uint8_t cfg)
{
CopySetupReqPkg(SetupSetUsbConfig);
pSetupReq->wValue = cfg; // USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
return (HostCtrlTransfer(NULL, NULL)); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
}
/*********************************************************************
* @fn CtrlClearEndpStall
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>STALL
*
* @param endp - <20>˵<EFBFBD><CBB5><EFBFBD>ַ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlClearEndpStall(uint8_t endp)
{
CopySetupReqPkg(SetupClrEndpStall); // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>Ĵ<EFBFBD><C4B4><EFBFBD>
pSetupReq->wIndex = endp; // <20>˵<EFBFBD><CBB5><EFBFBD>ַ
return (HostCtrlTransfer(NULL, NULL)); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
}
/*********************************************************************
* @fn CtrlSetUsbIntercace
*
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD>ӿ<EFBFBD>
*
* @param cfg - <20><><EFBFBD><EFBFBD>ֵ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbIntercace(uint8_t cfg)
{
CopySetupReqPkg(SetupSetUsbInterface);
pSetupReq->wValue = cfg; // USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
return (HostCtrlTransfer(NULL, NULL)); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
}
/*********************************************************************
* @fn USB_HostInit
*
* @brief USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param none
*
* @return none
*/
void USB_HostInit(void)
{
R8_USB_CTRL = RB_UC_HOST_MODE;
R8_UHOST_CTRL = 0;
R8_USB_DEV_AD = 0x00;
R8_UH_EP_MOD = RB_UH_EP_TX_EN | RB_UH_EP_RX_EN;
R16_UH_RX_DMA = (uint32_t)pHOST_RX_RAM_Addr;
R16_UH_TX_DMA = (uint32_t)pHOST_TX_RAM_Addr;
R8_UH_RX_CTRL = 0x00;
R8_UH_TX_CTRL = 0x00;
R8_USB_CTRL = RB_UC_HOST_MODE | RB_UC_INT_BUSY | RB_UC_DMA_EN;
R8_UH_SETUP = RB_UH_SOF_EN;
R8_USB_INT_FG = 0xFF;
DisableRootHubPort();
R8_USB_INT_EN = RB_UIE_TRANSFER | RB_UIE_DETECT;
FoundNewDev = 0;
}

View File

@@ -0,0 +1,840 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbhost.c
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : source file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH57x_common.h"
#if DISK_LIB_ENABLE
#include "CHRV3UFI.H"
#endif
/* <20><><EFBFBD><EFBFBD>HID<49>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD> */
__attribute__((aligned(4))) const uint8_t SetupSetHIDIdle[] = {0x21, HID_SET_IDLE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/* <20><>ȡHID<49><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
__attribute__((aligned(4))) const uint8_t SetupGetHIDDevReport[] = {0x81, USB_GET_DESCRIPTOR, 0x00, USB_DESCR_TYP_REPORT,
0x00, 0x00, 0x41, 0x00};
/* <20><>ȡHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
__attribute__((aligned(4))) const uint8_t SetupGetHubDescr[] = {HUB_GET_HUB_DESCRIPTOR, HUB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_HUB, 0x00, 0x00, sizeof(USB_HUB_DESCR), 0x00};
__attribute__((aligned(4))) uint8_t Com_Buffer[128]; // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C3B6>ʱ<EFBFBD><CAB1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>ٽ<EFBFBD><D9BD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*********************************************************************
* @fn AnalyzeHidIntEndp
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>HID<49>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ,<2C><><EFBFBD><EFBFBD>HubPortIndex<65><78>0<EFBFBD><30><EFBFBD>浽ROOTHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ֵ<EFBFBD>򱣴浽HUB<55>½ṹ<C2BD><E1B9B9>
*
* @param buf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ HubPortIndex<65><78>0<EFBFBD><30>ʾ<EFBFBD><CABE>HUB<55><42><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ⲿHUB<55>µĶ˿ں<CBBF>
*
* @return <20>˵<EFBFBD><CBB5><EFBFBD>
*/
uint8_t AnalyzeHidIntEndp(uint8_t *buf, uint8_t HubPortIndex)
{
uint8_t i, s, l;
s = 0;
if(HubPortIndex)
{
memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // <20><><EFBFBD><EFBFBD><EFBFBD>ж϶˵<CFB6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͽӿ<CDBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP // <20>Ƕ˵<C7B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&& (((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_INTER // <20><><EFBFBD>ж϶˵<CFB6>
&& (((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_DIR_MASK)) // <20><>IN<49>˵<EFBFBD>
{ // <20><><EFBFBD><EFBFBD><EFBFBD>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ,λ7<CEBB><37><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>־λ,<2C><>0
if(HubPortIndex)
{
DevOnHubPort[HubPortIndex - 1].GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
}
else
{
ThisUsbDev.GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK; // <20>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>wMaxPacketSize<7A><65>bInterval
}
PRINT("%02x ", (uint16_t)ThisUsbDev.GpVar[s]);
s++;
if(s >= 4)
{
break; //ֻ<><D6BB><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>˵<EFBFBD>
}
}
l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>
if(l > 16)
{
break;
}
}
PRINT("\n");
return (s);
}
/*********************************************************************
* @fn AnalyzeBulkEndp
*
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>,GpVar[0]<5D><>GpVar[1]<5D><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4>˵㡣GpVar[2]<5D><>GpVar[3]<5D><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4>˵<EFBFBD>
*
* @param buf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ HubPortIndex<65><78>0<EFBFBD><30>ʾ<EFBFBD><CABE>HUB<55><42><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ⲿHUB<55>µĶ˿ں<CBBF>
*
* @return 0
*/
uint8_t AnalyzeBulkEndp(uint8_t *buf, uint8_t HubPortIndex)
{
uint8_t i, s1, s2, l;
s1 = 0;
s2 = 2;
if(HubPortIndex)
{
memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // <20><><EFBFBD><EFBFBD><EFBFBD>ж϶˵<CFB6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͽӿ<CDBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if((((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP) // <20>Ƕ˵<C7B6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&& ((((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_BULK)) // <20><><EFBFBD>ж϶˵<CFB6>
{
if(HubPortIndex)
{
if(((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_DIR_MASK)
{
DevOnHubPort[HubPortIndex - 1].GpVar[s1++] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
}
else
{
DevOnHubPort[HubPortIndex - 1].GpVar[s2++] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
}
}
else
{
if(((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_DIR_MASK)
{
ThisUsbDev.GpVar[s1++] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
}
else
{
ThisUsbDev.GpVar[s2++] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
}
}
if(s1 == 2)
{
s1 = 1;
}
if(s2 == 4)
{
s2 = 3;
}
}
l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>
if(l > 16)
{
break;
}
}
return (0);
}
/*********************************************************************
* @fn InitRootDevice
*
* @brief <20><>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8>ROOT-HUB<55>˿ڵ<CBBF>USB<53>
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t InitRootDevice(void)
{
uint8_t i, s;
uint8_t cfg, dv_cls, if_cls;
PRINT("Reset host port\n");
ResetRootHubPort(); // <20><><EFBFBD><EFBFBD><EFBFBD><E8B1B8>,<2C><>λ<EFBFBD><CEBB>Ӧ<EFBFBD>˿ڵ<CBBF>USB<53><42><EFBFBD><EFBFBD>
for(i = 0, s = 0; i < 100; i++)
{ // <20>ȴ<EFBFBD>USB<53><EFBFBD><E8B1B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,100mS<6D><53>ʱ
mDelaymS(1);
if(EnableRootHubPort() == ERR_SUCCESS)
{ // ʹ<>ܶ˿<DCB6>
i = 0;
s++;
if(s > 100)
{
break; // <20>Ѿ<EFBFBD><D1BE>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>100mS
}
}
}
if(i)
{ // <20><>λ<EFBFBD><CEBB><EFBFBD>豸û<E8B1B8><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DisableRootHubPort();
PRINT("Disable host port because of disconnect\n");
return (ERR_USB_DISCON);
}
SetUsbSpeed(ThisUsbDev.DeviceSpeed); // <20><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD>
PRINT("GetDevDescr: ");
s = CtrlGetDeviceDescr(); // <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
for(i = 0; i < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength; i++)
{
PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
}
PRINT("\n");
ThisUsbDev.DeviceVID = ((PUSB_DEV_DESCR)Com_Buffer)->idVendor; //<2F><><EFBFBD><EFBFBD>VID PID<49><44>Ϣ
ThisUsbDev.DevicePID = ((PUSB_DEV_DESCR)Com_Buffer)->idProduct;
dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass;
s = CtrlSetUsbAddress(((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue);
if(s == ERR_SUCCESS)
{
ThisUsbDev.DeviceAddress = ((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue; // <20><><EFBFBD><EFBFBD>USB<53><42>ַ
PRINT("GetCfgDescr: ");
s = CtrlGetConfigDescr();
if(s == ERR_SUCCESS)
{
for(i = 0; i < ((PUSB_CFG_DESCR)Com_Buffer)->wTotalLength; i++)
{
PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
}
PRINT("\n");
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ȡ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>ַ/<2F><><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>С<EFBFBD><D0A1>,<2C><><EFBFBD>±<EFBFBD><C2B1><EFBFBD>endp_addr<64><72>endp_size<7A><65> */
cfg = ((PUSB_CFG_DESCR)Com_Buffer)->bConfigurationValue;
if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_STORAGE))
{ // <20><>USB<53><EFBFBD><E6B4A2><EFBFBD>豸,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>U<EFBFBD><55>
#ifdef FOR_ROOT_UDISK_ONLY
CHRV3DiskStatus = DISK_USB_ADDR;
return (ERR_SUCCESS);
}
else
{
return (ERR_USB_UNSUPPORT);
}
#else
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_STORAGE;
PRINT("USB-Disk Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
}
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_PRINTER) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass == 0x01)
{ // <20>Ǵ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD>
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
// <09><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_PRINTER;
PRINT("USB-Print Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
}
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)
{ // <20><>HID<49><44><EFBFBD>豸,<2C><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>HID<49>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ
s = AnalyzeHidIntEndp(Com_Buffer, 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>HID<49>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ
PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s);
// <20><><EFBFBD><EFBFBD><EFBFBD>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ,λ7<CEBB><37><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>־λ,<2C><>0
if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol;
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
s = CtrlGetHIDDeviceReport(dv_cls); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
for(i = 0; i < 64; i++)
{
PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
}
PRINT("\n");
}
// <09><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
if(if_cls == 1)
{
ThisUsbDev.DeviceType = DEV_TYPE_KEYBOARD;
// <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ָʾ<D6B8><CABE>LED<45><44>
PRINT("USB-Keyboard Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
else if(if_cls == 2)
{
ThisUsbDev.DeviceType = DEV_TYPE_MOUSE;
// Ϊ<><CEAA><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>״̬,Ӧ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8A1><EFBFBD>ж϶˿ڵĵ<DAB5>ַ,<2C><><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>Ϣ
PRINT("USB-Mouse Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
s = ERR_USB_UNSUPPORT;
}
}
else if(dv_cls == USB_DEV_CLASS_HUB)
{ // <20><>HUB<55><42><EFBFBD>豸,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s = CtrlGetHubDescr();
if(s == ERR_SUCCESS)
{
PRINT("Max Port:%02X ", (((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts));
ThisUsbDev.GpHUBPortNum = ((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts; // <20><><EFBFBD><EFBFBD>HUB<55>Ķ˿<C4B6><CBBF><EFBFBD><EFBFBD><EFBFBD>
if(ThisUsbDev.GpHUBPortNum > HUB_MAX_PORTS)
{
ThisUsbDev.GpHUBPortNum = HUB_MAX_PORTS; // <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ṹDevOnHubPortʱ<74><CAB1>Ϊ<EFBFBD>ٶ<EFBFBD>ÿ<EFBFBD><C3BF>HUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB_MAX_PORTS<54><53><EFBFBD>˿<EFBFBD>
}
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_HUB;
//<2F><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ж϶˵<CFB6><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB<55>¼<EFBFBD>֪ͨ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ò<EFBFBD>ѯ״̬<D7B4><CCAC><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>HUB<55><42><EFBFBD>˿<EFBFBD><CBBF>ϵ<EFBFBD>,<2C><>ѯ<EFBFBD><D1AF><EFBFBD>˿<EFBFBD>״̬,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ӵ<EFBFBD>HUB<55>˿<EFBFBD>,<2C><>ʼ<EFBFBD><CABC><EFBFBD>
for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // <20><>HUB<55><42><EFBFBD>˿ڶ<CBBF><DAB6>ϵ<EFBFBD>
{
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // <20><><EFBFBD>ⲿHUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><E8B1B8>״̬
s = HubSetPortFeature(i, HUB_PORT_POWER);
if(s != ERR_SUCCESS)
{
PRINT("Ext-HUB Port_%1d# power on error\n", (uint16_t)i); // <20>˿<EFBFBD><CBBF>ϵ<EFBFBD>ʧ<EFBFBD><CAA7>
}
}
PRINT("USB-HUB Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
}
}
else
{ // <20><><EFBFBD>Խ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
// <09><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = DEV_TYPE_UNKNOW;
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS); /* δ֪<CEB4><EFBFBD><E8B1B8>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD> */
}
}
#endif
}
}
}
PRINT("InitRootDev Err = %02X\n", (uint16_t)s);
#ifdef FOR_ROOT_UDISK_ONLY
CHRV3DiskStatus = DISK_CONNECT;
#else
ThisUsbDev.DeviceStatus = ROOT_DEV_FAILED;
#endif
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (s);
}
/*********************************************************************
* @fn InitDevOnHub
*
* @brief <20><>ʼ<EFBFBD><CABC>ö<EFBFBD><C3B6><EFBFBD>ⲿHUB<55><42><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>USB<53>
*
* @param HubPortIndex - ָ<><D6B8><EFBFBD>ⲿHUB
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t InitDevOnHub(uint8_t HubPortIndex)
{
uint8_t i, s, cfg, dv_cls, if_cls;
uint8_t ifc;
PRINT("Init dev @ExtHub-port_%1d ", (uint16_t)HubPortIndex);
if(HubPortIndex == 0)
{
return (ERR_USB_UNKNOWN);
}
SelectHubPort(HubPortIndex); // ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5>ⲿHUB<55><42>ָ<EFBFBD><D6B8><EFBFBD>˿<EFBFBD>,ѡ<><D1A1><EFBFBD>ٶ<EFBFBD>
PRINT("GetDevDescr: ");
s = CtrlGetDeviceDescr(); // <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
DevOnHubPort[HubPortIndex - 1].DeviceVID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idVendor); //<2F><><EFBFBD><EFBFBD>VID PID<49><44>Ϣ
DevOnHubPort[HubPortIndex - 1].DevicePID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idProduct);
dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cfg = (1 << 4) + HubPortIndex; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>USB<53><42>ַ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ص<EFBFBD>
s = CtrlSetUsbAddress(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
if(s != ERR_SUCCESS)
{
return (s);
}
DevOnHubPort[HubPortIndex - 1].DeviceAddress = cfg; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42>ַ
PRINT("GetCfgDescr: ");
s = CtrlGetConfigDescr(); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
cfg = ((PUSB_CFG_DESCR)Com_Buffer)->bConfigurationValue;
for(i = 0; i < ((PUSB_CFG_DESCR)Com_Buffer)->wTotalLength; i++)
{
PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
}
PRINT("\n");
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ȡ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>ַ/<2F><><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>С<EFBFBD><D0A1>,<2C><><EFBFBD>±<EFBFBD><C2B1><EFBFBD>endp_addr<64><72>endp_size<7A><65> */
if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dv_cls == 0x00 && if_cls == USB_DEV_CLASS_STORAGE) // <20><>USB<53><EFBFBD><E6B4A2><EFBFBD>豸,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>U<EFBFBD><55>
{
AnalyzeBulkEndp(Com_Buffer, HubPortIndex);
for(i = 0; i != 4; i++)
{
PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]);
}
PRINT("\n");
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_STORAGE;
PRINT("USB-Disk Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
}
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && (((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)) // <20><>HID<49><44><EFBFBD>豸,<2C><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
ifc = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->cfg_descr.bNumInterfaces;
s = AnalyzeHidIntEndp(Com_Buffer, HubPortIndex); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>HID<49>ж϶˵<CFB6><CBB5>ĵ<EFBFBD>ַ
PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s);
if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol;
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
for(dv_cls = 0; dv_cls < ifc; dv_cls++)
{
s = CtrlGetHIDDeviceReport(dv_cls); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
for(i = 0; i < 64; i++)
{
PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
}
PRINT("\n");
}
}
//<2F><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
if(if_cls == 1)
{
DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_KEYBOARD;
//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ָʾ<D6B8><CABE>LED<45><44>
if(ifc > 1)
{
PRINT("USB_DEV_CLASS_HID Ready\n");
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //<2F><><EFBFBD><EFBFBD>HID<49>
}
PRINT("USB-Keyboard Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
else if(if_cls == 2)
{
DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_MOUSE;
//Ϊ<><CEAA><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>״̬,Ӧ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8A1><EFBFBD>ж϶˿ڵĵ<DAB5>ַ,<2C><><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>Ϣ
if(ifc > 1)
{
PRINT("USB_DEV_CLASS_HID Ready\n");
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //<2F><><EFBFBD><EFBFBD>HID<49>
}
PRINT("USB-Mouse Ready\n");
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS);
}
s = ERR_USB_UNSUPPORT;
}
}
else if(dv_cls == USB_DEV_CLASS_HUB) // <20><>HUB<55><42><EFBFBD>豸,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HUB;
PRINT("This program don't support Level 2 HUB\n"); // <20><>Ҫ֧<D2AA>ֶ༶HUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
s = HubClearPortFeature(i, HUB_PORT_ENABLE); // <20><>ֹHUB<55>˿<EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
s = ERR_USB_UNSUPPORT;
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD>
{
AnalyzeBulkEndp(Com_Buffer, HubPortIndex); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>
for(i = 0; i != 4; i++)
{
PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]);
}
PRINT("\n");
s = CtrlSetUsbConfig(cfg); // <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(s == ERR_SUCCESS)
{
//<2F><EFBFBD><E8B1A3><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
DevOnHubPort[HubPortIndex - 1].DeviceType = dv_cls ? dv_cls : if_cls;
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (ERR_SUCCESS); //δ֪<CEB4><EFBFBD><E8B1B8>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
}
}
PRINT("InitDevOnHub Err = %02X\n", (uint16_t)s);
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_FAILED;
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
return (s);
}
/*********************************************************************
* @fn EnumHubPort
*
* @brief ö<><C3B6>ָ<EFBFBD><D6B8>ROOT-HUB<55>˿<EFBFBD><CBBF>ϵ<EFBFBD><CFB5>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>˿<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB>Ƴ<EFBFBD><C6B3>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53>
*
* @param RootHubIndex - ROOT_HUB0<42><30>ROOT_HUB1
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t EnumHubPort()
{
uint8_t i, s;
for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ˿<C4B6><CBBF>Ƿ<EFBFBD><C7B7>б
{
SelectHubPort(0); // ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD>,<2C><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD><D9B6>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>USB<53><42>ַ
s = HubGetPortStatus(i); // <20><>ȡ<EFBFBD>˿<EFBFBD>״̬
if(s != ERR_SUCCESS)
{
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
}
if(((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) && (Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07)))) || (Com_Buffer[2] == 0x10))
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_CONNECTED; // <20><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
DevOnHubPort[i - 1].DeviceAddress = 0x00;
s = HubGetPortStatus(i); // <20><>ȡ<EFBFBD>˿<EFBFBD>״̬
if(s != ERR_SUCCESS)
{
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
}
DevOnHubPort[i - 1].DeviceSpeed = Com_Buffer[1] & (1 << (HUB_PORT_LOW_SPEED & 0x07)) ? 0 : 1; // <20><><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD>ȫ<EFBFBD><C8AB>
if(DevOnHubPort[i - 1].DeviceSpeed)
{
PRINT("Found full speed device on port %1d\n", (uint16_t)i);
}
else
{
PRINT("Found low speed device on port %1d\n", (uint16_t)i);
}
mDelaymS(200); // <20>ȴ<EFBFBD><C8B4><EFBFBD>ϵ<EFBFBD><CFB5>ȶ<EFBFBD>
s = HubSetPortFeature(i, HUB_PORT_RESET); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ӵĶ˿ڸ<CBBF>λ
if(s != ERR_SUCCESS)
{
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
}
PRINT("Reset port and then wait in\n");
do // <20><>ѯ<EFBFBD><D1AF>λ<EFBFBD>˿<EFBFBD><><D6B1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>״̬<D7B4><CCAC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
{
mDelaymS(1);
s = HubGetPortStatus(i);
if(s != ERR_SUCCESS)
{
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
}
} while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ȴ<EFBFBD>
mDelaymS(100);
s = HubClearPortFeature(i, HUB_C_PORT_RESET); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ɱ<EFBFBD>־
// s = HubSetPortFeature( i, HUB_PORT_ENABLE ); // <20><><EFBFBD><EFBFBD>HUB<55>˿<EFBFBD>
s = HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB>Ƴ<EFBFBD><C6B3><EFBFBD><E4BBAF>־
if(s != ERR_SUCCESS)
{
return (s);
}
s = HubGetPortStatus(i); // <20>ٶ<EFBFBD>ȡ״̬,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0)
{
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
s = InitDevOnHub(i); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53>
if(s != ERR_SUCCESS)
{
return (s);
}
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
}
else if(Com_Buffer[2] & (1 << (HUB_C_PORT_ENABLE & 0x07))) // <20><EFBFBD><E8B1B8><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
{
HubClearPortFeature(i, HUB_C_PORT_ENABLE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>־
PRINT("Device on port error\n");
s = HubSetPortFeature(i, HUB_PORT_RESET); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ӵĶ˿ڸ<CBBF>λ
if(s != ERR_SUCCESS)
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
do // <20><>ѯ<EFBFBD><D1AF>λ<EFBFBD>˿<EFBFBD><><D6B1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>״̬<D7B4><CCAC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
{
mDelaymS(1);
s = HubGetPortStatus(i);
if(s != ERR_SUCCESS)
return (s); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
} while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ȴ<EFBFBD>
}
else if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0) // <20><EFBFBD>Ѿ<EFBFBD><D1BE>Ͽ<EFBFBD>
{
if(DevOnHubPort[i - 1].DeviceStatus >= ROOT_DEV_CONNECTED)
{
PRINT("Device on port %1d removed\n", (uint16_t)i);
}
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // <20><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
if(Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07)))
{
HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // <20><><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><E4BBAF>־
}
}
}
return (ERR_SUCCESS); // <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
/*********************************************************************
* @fn EnumAllHubPort
*
* @brief ö<><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ⲿHUB<55><42><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>USB<53>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t EnumAllHubPort(void)
{
uint8_t s;
if((ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS) && (ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB)) // HUBö<42>ٳɹ<D9B3>
{
SelectHubPort(0); // ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD>,<2C><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD><D9B6>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>USB<53><42>ַ
s = EnumHubPort(); // ö<><C3B6>ָ<EFBFBD><D6B8>ROOT-HUB<55>˿<EFBFBD><CBBF>ϵ<EFBFBD><CFB5>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>˿<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB>Ƴ<EFBFBD><C6B3>¼<EFBFBD>
if(s != ERR_SUCCESS) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB<55>Ͽ<EFBFBD><CFBF><EFBFBD>
{
PRINT("EnumAllHubPort err = %02X\n", (uint16_t)s);
}
SetUsbSpeed(1); // Ĭ<><C4AC>Ϊȫ<CEAA><C8AB>
}
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn SearchTypeDevice
*
* @brief <20><>ROOT-HUB<55>Լ<EFBFBD><D4BC>ⲿHUB<55><42><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><E8B1B8><EFBFBD>ڵĶ˿ں<CBBF>,<2C><><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF>Ϊ0xFFFF<46><46>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* <20><>ȻҲ<C8BB><D2B2><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>USB<53>ij<EFBFBD><C4B3><EFBFBD>VID<49><44>ƷPID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><E8B1B8>VID<49><44>PID),<2C>Լ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param type - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8λΪROOT-HUB<55>˿ں<CBBF>,<2C><>8λΪ<CEBB>ⲿHUB<55>Ķ˿ں<CBBF>,<2C><>8λΪ0<CEAA><30><EFBFBD>豸ֱ<E8B1B8><D6B1><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD><CBBF><EFBFBD>
*/
uint16_t SearchTypeDevice(uint8_t type)
{
uint8_t RootHubIndex; //CH554ֻ<34><D6BB>һ<EFBFBD><D2BB>USB<53><42>,RootHubIndex = 0,ֻ<><EFBFBD><E8BFB4><EFBFBD><EFBFBD>ֵ<EFBFBD>ĵͰ<C4B5>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
uint8_t HubPortIndex;
RootHubIndex = 0;
if((ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS)) // <20>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB<55><42>ö<EFBFBD>ٳɹ<D9B3>
{
for(HubPortIndex = 1; HubPortIndex <= ThisUsbDev.GpHUBPortNum; HubPortIndex++) // <20><><EFBFBD><EFBFBD><EFBFBD>ⲿHUB<55>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>˿<EFBFBD>
{
if(DevOnHubPort[HubPortIndex - 1].DeviceType == type && DevOnHubPort[HubPortIndex - 1].DeviceStatus >= ROOT_DEV_SUCCESS)
{
return (((uint16_t)RootHubIndex << 8) | HubPortIndex); // <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>ö<EFBFBD>ٳɹ<D9B3>
}
}
}
if((ThisUsbDev.DeviceType == type) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS))
{
return ((uint16_t)RootHubIndex << 8); // <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>ö<EFBFBD>ٳɹ<D9B3>,<2C><>ROOT-HUB<55>˿<EFBFBD><CBBF><EFBFBD>
}
return (0xFFFF);
}
/*********************************************************************
* @fn SETorOFFNumLock
*
* @brief NumLock<63>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ж<EFBFBD>
*
* @param buf - <20><><EFBFBD>Ƽ<EFBFBD>ֵ
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t SETorOFFNumLock(uint8_t *buf)
{
uint8_t tmp[] = {0x21, 0x09, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00};
uint8_t len, s;
if((buf[2] == 0x53) & ((buf[0] | buf[1] | buf[3] | buf[4] | buf[5] | buf[6] | buf[7]) == 0))
{
for(s = 0; s != sizeof(tmp); s++)
{
((uint8_t *)pSetupReq)[s] = tmp[s];
}
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
}
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn CtrlGetHIDDeviceReport
*
* @brief <20><>ȡHID<49><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TxBuffer<65><72>
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t CtrlGetHIDDeviceReport(uint8_t infc)
{
uint8_t s;
uint8_t len;
CopySetupReqPkg(SetupSetHIDIdle);
pSetupReq->wIndex = infc;
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
CopySetupReqPkg(SetupGetHIDDevReport);
pSetupReq->wIndex = infc;
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn CtrlGetHubDescr
*
* @brief <20><>ȡHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com_Buffer<65><72>
*
* @param none
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t CtrlGetHubDescr(void)
{
uint8_t s;
uint8_t len;
CopySetupReqPkg(SetupGetHubDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
if(len < ((PUSB_SETUP_REQ)SetupGetHubDescr)->wLength)
{
return (ERR_USB_BUF_OVER); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
}
// if ( len < 4 ) return( ERR_USB_BUF_OVER ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn HubGetPortStatus
*
* @brief <20><>ѯHUB<55>˿<EFBFBD>״̬,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com_Buffer<65><72>
*
* @param HubPortIndex - <20>˿ں<CBBF>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubGetPortStatus(uint8_t HubPortIndex)
{
uint8_t s;
uint8_t len;
pSetupReq->bRequestType = HUB_GET_PORT_STATUS;
pSetupReq->bRequest = HUB_GET_STATUS;
pSetupReq->wValue = 0x0000;
pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0004;
s = HostCtrlTransfer(Com_Buffer, &len); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
if(s != ERR_SUCCESS)
{
return (s);
}
if(len < 4)
{
return (ERR_USB_BUF_OVER); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
}
return (ERR_SUCCESS);
}
/*********************************************************************
* @fn HubSetPortFeature
*
* @brief <20><><EFBFBD><EFBFBD>HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @param HubPortIndex - <20>˿ں<CBBF>
* @param FeatureSelt - <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
{
pSetupReq->bRequestType = HUB_SET_PORT_FEATURE;
pSetupReq->bRequest = HUB_SET_FEATURE;
pSetupReq->wValue = 0x0000 | FeatureSelt;
pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0000;
return (HostCtrlTransfer(NULL, NULL)); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
}
/*********************************************************************
* @fn HubClearPortFeature
*
* @brief <20><><EFBFBD><EFBFBD>HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @param HubPortIndex - <20>˿ں<CBBF>
* @param FeatureSelt - <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
{
pSetupReq->bRequestType = HUB_CLEAR_PORT_FEATURE;
pSetupReq->bRequest = HUB_CLEAR_FEATURE;
pSetupReq->wValue = 0x0000 | FeatureSelt;
pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0000;
return (HostCtrlTransfer(NULL, NULL)); // ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,243 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_clk.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_CLK_H__
#define __CH57x_CLK_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief ϵͳ<CFB5><CDB3>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
*/
typedef enum
{
CLK_SOURCE_LSI = 0xC0,
CLK_SOURCE_HSE_16MHz = (0x02),
CLK_SOURCE_HSE_8MHz = (0x04),
CLK_SOURCE_HSE_6_4MHz = (0x05),
CLK_SOURCE_HSE_4MHz = (0x08),
CLK_SOURCE_HSE_2MHz = (0x10),
CLK_SOURCE_HSE_1MHz = (0x0),
CLK_SOURCE_HSE_PLL_100MHz = (0x40 | 6),
CLK_SOURCE_HSE_PLL_75MHz = (0x40 | 8),
CLK_SOURCE_HSE_PLL_60MHz = (0x40 | 10),
CLK_SOURCE_HSE_PLL_50MHz = (0x40 | 12),
CLK_SOURCE_HSE_PLL_40MHz = (0x40 | 15),
CLK_SOURCE_HSE_PLL_30MHz = (0x40 | 20),
CLK_SOURCE_HSE_PLL_25MHz = (0x40 | 24),
CLK_SOURCE_HSE_PLL_24MHz = (0x40 | 25),
CLK_SOURCE_HSE_PLL_20MHz = (0x40 | 30),
} SYS_CLKTypeDef;
/**
* @brief 32M<32><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
*/
typedef enum
{
HSE_RCur_75 = 0,
HSE_RCur_100,
HSE_RCur_125,
HSE_RCur_150
} HSECurrentTypeDef;
/**
* @brief 32M<32><4D><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>ݵ<EFBFBD>λ
*/
typedef enum
{
HSECap_6p = 0,
HSECap_8p,
HSECap_10p,
HSECap_12p,
HSECap_14p,
HSECap_16p,
HSECap_18p,
HSECap_20p
} HSECapTypeDef;
#define RTC_MAX_COUNT 0xA8C00000
#define MAX_DAY 0x00004000
#define MAX_2_SEC 0x0000A8C0
//#define MAX_SEC 0x545FFFFF
#define BEGYEAR 2020
#define IsLeapYear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4)))
#define YearLength(yr) (IsLeapYear(yr) ? 366 : 365)
#define monthLength(lpyr, mon) (((mon) == 1) ? (28 + (lpyr)) : (((mon) > 6) ? (((mon) & 1) ? 31 : 30) : (((mon) & 1) ? 30 : 31)))
/**
* @brief the total number of cycles captured by the oscillator define
*/
typedef enum
{
Count_1 = 0,
Count_2,
Count_4,
Count_32,
Count_64,
Count_128,
Count_1024,
Count_2047,
} RTC_OSCCntTypeDef;
/**
* @brief rtc timer mode period define
*/
typedef enum
{
Period_4096 = 0,
Period_8192,
Period_16384,
Period_32768,
Period_65536,
Period_131072,
Period_262144,
Period_524288,
} RTC_TMRCycTypeDef;
/**
* @brief rtc interrupt event define
*/
typedef enum
{
RTC_TRIG_EVENT = 0, // RTC <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
RTC_TMR_EVENT, // RTC <20><><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
} RTC_EVENTTypeDef;
/**
* @brief rtc interrupt mode define
*/
typedef enum
{
RTC_TRIG_MODE = 0, // RTC <20><><EFBFBD><EFBFBD>ģʽ
RTC_TMR_MODE, // RTC <20><><EFBFBD>ڶ<EFBFBD>ʱģʽ
} RTC_MODETypeDef;
/**
* @brief HSE<53><45><EFBFBD><EFBFBD> ƫ<>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - 75%,100%,125%,150%
*/
void HSECFG_Current(HSECurrentTypeDef c);
/**
* @brief HSE<53><45><EFBFBD><EFBFBD> <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - refer to HSECapTypeDef
*/
void HSECFG_Capacitance(HSECapTypeDef c);
/**
* @brief <20><>ʼ<EFBFBD><CABC> RTCʱ<43><CAB1>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>,<2C><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>Խ<EFBFBD><D4BD><>Ӿ<EFBFBD><D3BE><EFBFBD>Խ<EFBFBD><D4BD>
*
* @param cnt - the total number of cycles captured by the oscillator
*
* @return RTCʱ<43><CAB1>, 24~42KHz
*/
uint32_t RTC_InitClock(RTC_OSCCntTypeDef cnt);
/**
* @brief RTCʱ<43>ӳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ǰʱ<C7B0><CAB1>
*
* @param y - <20><><EFBFBD><EFBFBD><EFBFBD>꣬MAX_Y = BEGYEAR + 44
* @param mon - <20><><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param h - <20><><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>MAX_H = 23
* @param m - <20><><EFBFBD>÷<EFBFBD><C3B7>ӣ<EFBFBD>MAX_M = 59
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>룬MAX_S = 59
*/
void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
*
* @param py - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>꣬MAX_Y = BEGYEAR + 44
* @param pmon - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param pd - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param ph - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>MAX_H = 23
* @param pm - <20><>ȡ<EFBFBD><C8A1><EFBFBD>ķ<EFBFBD><C4B7>ӣ<EFBFBD>MAX_M = 59
* @param ps - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>룬MAX_S = 59
*/
void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps);
/**
* @brief <20><><EFBFBD><EFBFBD>LSIʱ<49>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>õ<EFBFBD>ǰRTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>MAX_CYC = 0xA8BFFFFF = 2831155199
*/
void RTC_SetCycleLSI(uint32_t cyc);
/**
* @brief <20><><EFBFBD><EFBFBD>LSIʱ<49>ӣ<EFBFBD><D3A3><EFBFBD>ȡ<EFBFBD><C8A1>ǰRTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_CYC = 0xA8BFFFFF = 2831155199
*/
uint32_t RTC_GetCycleLSI(void);
/**
* @brief RTC<54><43>ʱģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD>ע<EFBFBD>ⶨʱ<E2B6A8><CAB1>׼<EFBFBD>̶<EFBFBD>Ϊ32768Hz<48><7A>
*
* @param t - refer to RTC_TMRCycTypeDef
*/
void RTC_TRIGFunCfg(uint32_t cyc);
/**
* @brief RTC<54><43>ʱģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD>ע<EFBFBD>ⶨʱ<E2B6A8><CAB1>׼<EFBFBD>̶<EFBFBD>Ϊ32768Hz<48><7A>
*
* @param t - refer to RTC_TMRCycTypeDef
*/
void RTC_TMRFunCfg(RTC_TMRCycTypeDef t);
/**
* @brief RTC ģʽ<C4A3><CABD><EFBFBD>ܹر<DCB9>
*
* @param m - <20><>Ҫ<EFBFBD>رյĵ<D5B5>ǰģʽ
*/
void RTC_ModeFunDisable(RTC_MODETypeDef m);
/**
* @brief <20><>ȡRTC<54>жϱ<D0B6>־
*
* @param f - refer to RTC_EVENTTypeDef
*
* @return <20>жϱ<D0B6>־״̬
*/
uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f);
/**
* @brief <20><><EFBFBD><EFBFBD>RTC<54>жϱ<D0B6>־
*
* @param f - refer to RTC_EVENTTypeDef
*/
void RTC_ClearITFlag(RTC_EVENTTypeDef f);
/**
* @brief <20><>Ƶʱ<C6B5>ӵ<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*/
void LClk_Cfg(FunctionalState s);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_CLK_H__

View File

@@ -0,0 +1,79 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_cmp.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_CMP_H__
#define __CH57x_CMP_H__
#ifdef __cplusplus
extern "C" {
#endif
/* comparator -channel input sel */
typedef enum
{
cmp_sw_0 = 0, // CMP_P0(PA3),CMP_N(PA2)
cmp_sw_1, // CMP_P0(PA3),CMP_N(CMP_VERF)
cmp_sw_2, // CMP_P0(PA7),CMP_N(PA2)
cmp_sw_3 // CMP_P0(PA7),CMP_N(CMP_VERF)
} CMPSwTypeDef;
//GPIOModeTypeDef
/* comparator negative end point Vref sel */
typedef enum
{
cmp_nref_level_50 = 0, // 50mv
cmp_nref_level_100, // 100mv
cmp_nref_level_150, // 150mv
cmp_nref_level_200, // 200mv
cmp_nref_level_250, // 250mv
cmp_nref_level_300, // 300mv
cmp_nref_level_350, // 350mv
cmp_nref_level_400, // 400mv
cmp_nref_level_450, // 450mv
cmp_nref_level_500, // 500mv
cmp_nref_level_550, // 550mv
cmp_nref_level_600, // 600mv
cmp_nref_level_650, // 650mv
cmp_nref_level_700, // 700mv
cmp_nref_level_750, // 750mv
cmp_nref_level_800, // 800mv
} CMPNrefLevelTypeDef;
/* comparator output sel */
typedef enum
{
cmp_out_sel_high = 0, // high
cmp_out_sel_low, // low
cmp_out_sel_fall, // fall edge
cmp_out_sel_rise // rise edge
} CMPOutSelTypeDef;
#define CMP_GetITStatus() (R8_CMP_CTRL_2 & RB_CMP_IF)
#define CMP_ClearITStatus() (R8_CMP_CTRL_2 |= RB_CMP_IF)
#define CMP_ReadAPROut() (R8_CMP_CTRL_3 & RB_APR_OUT_CMP)
#define CMP_Enable() (R8_CMP_CTRL_0 |= RB_CMP_EN)
#define CMP_Disable() (R8_CMP_CTRL_0 &= ~RB_CMP_EN)
void CMP_Init (CMPSwTypeDef s, CMPNrefLevelTypeDef v);
void CMP_OutToTIMCAPCfg(FunctionalState s);
void CMP_INTCfg (CMPOutSelTypeDef sel, FunctionalState s);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_CMP_H__

View File

@@ -0,0 +1,95 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_common.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_COMM_H__
#define __CH57x_COMM_H__
#ifdef __cplusplus
extern "C" {
#endif
#ifndef NULL
#define NULL 0
#endif
#define ALL 0xFFFF
#ifndef __HIGH_CODE
#define __HIGH_CODE __attribute__((section(".highcode")))
#endif
#ifndef __INTERRUPT
#ifdef INT_SOFT
#define __INTERRUPT __attribute__((interrupt()))
#else
#define __INTERRUPT __attribute__((interrupt("WCH-Interrupt-fast")))
#endif
#endif
#ifdef DEBUG
#include <stdio.h>
#endif
#ifdef DEBUG
#define PRINT(X...) printf(X)
#else
#define PRINT(X...)
#endif
/**
* @brief ϵͳ<CFB5><CDB3>Ƶʱ<C6B5>ӣ<EFBFBD>Hz<48><7A>
*/
#ifndef FREQ_SYS
#define FREQ_SYS 100000000
#endif
#ifndef SAFEOPERATE
#define SAFEOPERATE asm volatile("fence.i")
#endif
#include <string.h>
#include <stdint.h>
#include <CH572SFR.h>
#include "core_riscv.h"
#include "CH57x_clk.h"
#include "CH57x_cmp.h"
#include "CH57x_keyscan.h"
#include "CH57x_uart.h"
#include "CH57x_gpio.h"
#include "CH57x_i2c.h"
#include "CH57x_flash.h"
#include "CH57x_pwr.h"
#include "CH57x_pwm.h"
#include "CH57x_sys.h"
#include "CH57x_timer.h"
#include "CH57x_spi.h"
#include "CH57x_usbdev.h"
#include "CH57x_usbhost.h"
#include "ISP572.h"
/**
* @brief LSIʱ<49>ӣ<EFBFBD>Hz<48><7A>
*/
extern uint32_t Freq_LSI;
#define DelayMs(x) mDelaymS(x)
#define DelayUs(x) mDelayuS(x)
#define ROM_CFG_VERISON 0x7F010
#ifdef __cplusplus
}
#endif
#endif // __CH57x_COMM_H__

View File

@@ -0,0 +1,41 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_flash.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_FLASH_H__
#define __CH57x_FLASH_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief <20><>ȡFlash-ROM
*
* @param StartAddr - read address
* @param Buffer - read buffer
* @param len - read len
*/
void FLASH_ROM_READ(uint32_t StartAddr, void *Buffer, uint32_t len);
uint8_t UserOptionByteConfig(FunctionalState RESET_EN, FunctionalState UART_NO_KEY_EN,
uint32_t FLASHProt_Size);
uint8_t UserOptionByteClose_SWD(void);
void UserOptionByte_Active(void);
void GET_UNIQUE_ID(uint8_t *Buffer);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_FLASH_H__

View File

@@ -0,0 +1,202 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_gpio.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_GPIO_H__
#define __CH57x_GPIO_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief GPIO_pins_define
*/
#define GPIO_Pin_0 (0x00000001) /*!< Pin 0 selected */
#define GPIO_Pin_1 (0x00000002) /*!< Pin 1 selected */
#define GPIO_Pin_2 (0x00000004) /*!< Pin 2 selected */
#define GPIO_Pin_3 (0x00000008) /*!< Pin 3 selected */
#define GPIO_Pin_4 (0x00000010) /*!< Pin 4 selected */
#define GPIO_Pin_5 (0x00000020) /*!< Pin 5 selected */
#define GPIO_Pin_6 (0x00000040) /*!< Pin 6 selected */
#define GPIO_Pin_7 (0x00000080) /*!< Pin 7 selected */
#define GPIO_Pin_8 (0x00000100) /*!< Pin 8 selected */
#define GPIO_Pin_9 (0x00000200) /*!< Pin 9 selected */
#define GPIO_Pin_10 (0x00000400) /*!< Pin 10 selected */
#define GPIO_Pin_11 (0x00000800) /*!< Pin 11 selected */
#define GPIO_Pin_12 (0x00001000) /*!< Pin 12 selected */
#define GPIO_Pin_13 (0x00002000) /*!< Pin 13 selected */
#define GPIO_Pin_14 (0x00004000) /*!< Pin 14 selected */
#define GPIO_Pin_15 (0x00008000) /*!< Pin 15 selected */
#define GPIO_Pin_16 (0x00010000) /*!< Pin 16 selected */
#define GPIO_Pin_17 (0x00020000) /*!< Pin 17 selected */
#define GPIO_Pin_18 (0x00040000) /*!< Pin 18 selected */
#define GPIO_Pin_19 (0x00080000) /*!< Pin 19 selected */
#define GPIO_Pin_20 (0x00100000) /*!< Pin 20 selected */
#define GPIO_Pin_21 (0x00200000) /*!< Pin 21 selected */
#define GPIO_Pin_22 (0x00400000) /*!< Pin 22 selected */
#define GPIO_Pin_23 (0x00800000) /*!< Pin 23 selected */
#define GPIO_Pin_All (0xFFFFFFFF) /*!< All pins selected */
/**
* @brief GPIO_pins_remap_define
*/
#define REMAP_RXD_PA2 0x00 /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨RXD/PA2<41><32> */
#define REMAP_RXD_PA3 0x01 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA3<41><33> */
#define REMAP_RXD_PA0 0x02 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA0<41><30> */
#define REMAP_RXD_PA1 0x03 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA1<41><31> */
#define REMAP_RXD_PA4 0x04 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA4<41><34> */
#define REMAP_RXD_PA9 0x05 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA9<41><39> */
#define REMAP_RXD_PA10 0x06 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA10<31><30> */
#define REMAP_RXD_PA11 0x07 /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA11<31><31> */
#define REMAP_TXD_PA3 0x00 /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨TXD/PA3<41><33> */
#define REMAP_TXD_PA2 0x08 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA2<41><32> */
#define REMAP_TXD_PA1 0x10 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA1<41><31> */
#define REMAP_TXD_PA0 0x18 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA0<41><30> */
#define REMAP_TXD_PA7 0x20 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA7<41><37> */
#define REMAP_TXD_PA8 0x28 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA8<41><38> */
#define REMAP_TXD_PA11 0x30 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA11<31><31> */
#define REMAP_TXD_PA10 0x38 /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA10<31><30> */
#define REMAP_TMR_DEFAULT 0x00 /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨PWM0/PA7<41><37>CAP_IN1/PA7<41><37>CAP_IN2/PA2<41><32> */
#define REMAP_TMR_MODE1 0x40 /*!<<3C><>ӳ<EFBFBD><D3B3>1 <20><>PWM0/PA2<41><32>CAP_IN1/PA2<41><32>CAP_IN2/PA7<41><37> */
#define REMAP_TMR_MODE2 0x80 /*!<<3C><>ӳ<EFBFBD><D3B3>2<EFBFBD><32>PWM0/PA4<41><34>CAP_IN1/PA4<41><34>CAP_IN2/PA9<41><39> */
#define REMAP_TMR_MODE3 0xC0 /*!<<3C><>ӳ<EFBFBD><D3B3>3<EFBFBD><33>PWM0/PA9<41><39>CAP_IN1/PA9<41><39>CAP_IN2/PA4<41><34> */
#define REMAP_I2C_DEFAULT 0x00 /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨SCL/PA8<41><38>SDA/PA9<41><39> */
#define REMAP_I2C_MODE1 0x200 /*!<<3C><>ӳ<EFBFBD><D3B3>1 <20><>SCL/PA0<41><30>SDA/PA1<41><31> */
#define REMAP_I2C_MODE2 0x400 /*!<<3C><>ӳ<EFBFBD><D3B3>2 <20><>SCL/PA3<41><33>SDA/PA2<41><32> */
#define REMAP_I2C_MODE3 0x600 /*!<<3C><>ӳ<EFBFBD><D3B3>3 <20><>SCL/PA5<41><35>SDA/PA6<41><36> */
/**
* @brief Configuration GPIO Mode
*/
typedef enum
{
GPIO_ModeIN_Floating, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_ModeIN_PU, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_ModeIN_PD, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_ModeOut_PP_5mA, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5mA
GPIO_ModeOut_PP_20mA, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20mA
} GPIOModeTypeDef;
/**
* @brief Configuration GPIO IT Mode
*/
typedef enum
{
GPIO_ITMode_LowLevel, //<2F>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
GPIO_ITMode_HighLevel, //<2F>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
GPIO_ITMode_FallEdge, //<2F>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD>
GPIO_ITMode_RiseEdge, //<2F><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
} GPIOITModeTpDef;
/**
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param pin - PA0-PA15
* @param mode - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GPIOA_ModeCfg(uint32_t pin, GPIOModeTypeDef mode);
/**
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
*
* @param pin - PA0-PA15
*/
#define GPIOA_ResetBits(pin) (R32_PA_CLR = pin)
/**
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>
*
* @param pin - PA0-PA15
*/
#define GPIOA_SetBits(pin) (R32_PA_SET = pin)
/**
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ת
*
* @param pin - PA0-PA15
*/
#define GPIOA_InverseBits(pin) (R32_PA_OUT ^= pin)
/**
* @brief GPIOA<4F>˿<EFBFBD>32λ<32><CEBB><EFBFBD>ݷ<EFBFBD><DDB7>أ<EFBFBD><D8A3><EFBFBD>16λ<36><CEBB>Ч
*
* @return GPIOA<4F>˿<EFBFBD>32λ<32><CEBB><EFBFBD><EFBFBD>
*/
#define GPIOA_ReadPort() (R32_PA_PIN)
/**
* @brief GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>0-<2D><><EFBFBD>ŵ͵<C5B5>ƽ<EFBFBD><C6BD>(!0)-<2D><><EFBFBD>Ÿߵ<C5B8>ƽ
*
* @param pin - PA0-PA15
*
* @return GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>״̬
*/
#define GPIOA_ReadPortPin(pin) (R32_PA_PIN & (pin))
/**
* @brief GPIOA<4F><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param pin - PA0-PA15
* @param mode - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode);
/**
* @brief <20><>ȡGPIOA<4F>˿<EFBFBD><CBBF>жϱ<D0B6>־״̬
*
* @return GPIOA<4F>˿<EFBFBD><CBBF>жϱ<D0B6>־״̬
*/
#define GPIOA_ReadITFlagPort() (R16_PA_INT_IF)
/**
* @brief <20><>ȡGPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־״̬
*
* @param pin - PA0-PA15
*
* @return GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־״̬
*/
#define GPIOA_ReadITFlagBit(pin) (R16_PA_INT_IF & (pin))
/**
* @brief <20><><EFBFBD><EFBFBD>GPIOA<4F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־״̬
*
* @param pin - PA0-PA15
*/
#define GPIOA_ClearITFlagBit(pin) (R16_PA_INT_IF = pin)
/**
* @brief <20><><EFBFBD><EFBFBD><E8B9A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
*
* @param s - <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ӳ<EFBFBD><D3B3>
* @param perph - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO_pins_remap_define
*/
void GPIOPinRemap(FunctionalState s, uint16_t perph);
/**
* @brief I/O pin<69><6E><EFBFBD>ֹ<EFBFBD><D6B9>ܿ<EFBFBD><DCBF><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪶<EFBFBD>ӦI/O pin<69><6E><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>
* @param pin - PA0-PA15
*/
void GPIOADigitalCfg(FunctionalState s, uint16_t pin);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_GPIO_H__

View File

@@ -0,0 +1,191 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_i2c.h
* Author : WCH
* Version : V1.0
* Date : 2024/8/22
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_I2C_H__
#define __CH57x_I2C_H__
#ifdef __cplusplus
extern "C" {
#endif
/* I2C_transfer_direction */
#define I2C_Direction_Transmitter ((uint8_t)0x00)
#define I2C_Direction_Receiver ((uint8_t)0x01)
/* I2C ADD0 mask */
#define OADDR1_ADD0_Set ((uint16_t)0x0001)
#define OADDR1_ADD0_Reset ((uint16_t)0xFFFE)
/* I2C_NACK_position */
#define I2C_NACKPosition_Next ((uint16_t)RB_I2C_POS)
#define I2C_NACKPosition_Current ((uint16_t)~RB_I2C_POS)
/* I2C_PEC_position */
#define I2C_PECPosition_Next ((uint16_t)RB_I2C_POS)
#define I2C_PECPosition_Current ((uint16_t)~RB_I2C_POS)
/* I2C_SMBus_alert_pin_level */
#define I2C_SMBusAlert_Low ((uint16_t)RB_I2C_ALERT)
#define I2C_SMBusAlert_High ((uint16_t)~RB_I2C_ALERT)
/* I2C FLAG mask */
#define FLAG_Mask ((uint32_t)0x00FFFFFF)
/* I2C Interrupt Enable mask */
#define ITEN_Mask ((uint32_t)0x07000000)
/* I2C_mode */
typedef enum
{
I2C_Mode_I2C = 0x0000,
I2C_Mode_SMBusDevice = 0x0002,
I2C_Mode_SMBusHost = 0x000A,
} I2C_ModeTypeDef;
/* I2C_duty_cycle_in_fast_mode */
typedef enum
{
I2C_DutyCycle_16_9 = RB_I2C_DUTY, /* I2C fast mode Tlow/Thigh = 16/9 */
I2C_DutyCycle_2 = 0x0000, /* I2C fast mode Tlow/Thigh = 2 */
} I2C_DutyTypeDef;
/* I2C_acknowledgement - Enables or disables the acknowledgement.*/
typedef enum
{
I2C_Ack_Enable = RB_I2C_ACK,
I2C_Ack_Disable = 0x0000,
} I2C_AckTypeDef;
/* I2C_acknowledged_address - Specifies if 7-bit or 10-bit address is acknowledged. */
typedef enum
{
I2C_AckAddr_7bit = 0x4000,
I2C_AckAddr_10bit = 0xC000,
} I2C_AckAddrTypeDef;
/* I2C_interrupts_definition */
typedef enum
{
I2C_IT_BUF = 0x0400, /* Buffer interrupt mask. */
I2C_IT_EVT = 0x0200, /* Event interrupt mask. */
I2C_IT_ERR = 0x0100, /* Error interrupt mask. */
} I2C_ITTypeDef;
/* I2C_interrupts_definition */
#define I2C_IT_SMBALERT ((uint32_t)0x01008000)
#define I2C_IT_TIMEOUT ((uint32_t)0x01004000)
#define I2C_IT_PECERR ((uint32_t)0x01001000)
#define I2C_IT_OVR ((uint32_t)0x01000800)
#define I2C_IT_AF ((uint32_t)0x01000400)
#define I2C_IT_ARLO ((uint32_t)0x01000200)
#define I2C_IT_BERR ((uint32_t)0x01000100)
#define I2C_IT_TXE ((uint32_t)0x06000080)
#define I2C_IT_RXNE ((uint32_t)0x06000040)
#define I2C_IT_STOPF ((uint32_t)0x02000010)
#define I2C_IT_ADD10 ((uint32_t)0x02000008)
#define I2C_IT_BTF ((uint32_t)0x02000004)
#define I2C_IT_ADDR ((uint32_t)0x02000002)
#define I2C_IT_SB ((uint32_t)0x02000001)
/* SR2 register flags */
#define I2C_FLAG_DUALF ((uint32_t)0x00800000)
#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000)
#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000)
#define I2C_FLAG_GENCALL ((uint32_t)0x00100000)
#define I2C_FLAG_TRA ((uint32_t)0x00040000)
#define I2C_FLAG_BUSY ((uint32_t)0x00020000)
#define I2C_FLAG_MSL ((uint32_t)0x00010000)
/* SR1 register flags */
#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000)
#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000)
#define I2C_FLAG_PECERR ((uint32_t)0x10001000)
#define I2C_FLAG_OVR ((uint32_t)0x10000800)
#define I2C_FLAG_AF ((uint32_t)0x10000400)
#define I2C_FLAG_ARLO ((uint32_t)0x10000200)
#define I2C_FLAG_BERR ((uint32_t)0x10000100)
#define I2C_FLAG_TXE ((uint32_t)0x10000080)
#define I2C_FLAG_RXNE ((uint32_t)0x10000040)
#define I2C_FLAG_STOPF ((uint32_t)0x10000010)
#define I2C_FLAG_ADD10 ((uint32_t)0x10000008)
#define I2C_FLAG_BTF ((uint32_t)0x10000004)
#define I2C_FLAG_ADDR ((uint32_t)0x10000002)
#define I2C_FLAG_SB ((uint32_t)0x10000001)
/****************I2C Master Events (Events grouped in order of communication)********************/
#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */
#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */
#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */
#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */
#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */
#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */
#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */
/******************I2C Slave Events (Events grouped in order of communication)******************/
#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */
#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */
#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */
#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */
#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */
#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */
#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */
#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */
#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */
#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */
void I2C_Init(I2C_ModeTypeDef I2C_Mode, uint32_t I2C_ClockSpeed, I2C_DutyTypeDef I2C_DutyCycle,
I2C_AckTypeDef I2C_Ack, I2C_AckAddrTypeDef I2C_AckAddr, uint16_t I2C_OwnAddress1);
void I2C_Cmd(FunctionalState NewState);
void I2C_GenerateSTART(FunctionalState NewState);
void I2C_GenerateSTOP(FunctionalState NewState);
void I2C_AcknowledgeConfig(FunctionalState NewState);
void I2C_OwnAddress2Config(uint8_t Address);
void I2C_DualAddressCmd(FunctionalState NewState);
void I2C_GeneralCallCmd(FunctionalState NewState);
void I2C_ITConfig(I2C_ITTypeDef I2C_IT, FunctionalState NewState);
void I2C_SendData(uint8_t Data);
uint8_t I2C_ReceiveData(void);
void I2C_Send7bitAddress(uint8_t Address, uint8_t I2C_Direction);
void I2C_SoftwareResetCmd(FunctionalState NewState);
void I2C_NACKPositionConfig(uint16_t I2C_NACKPosition);
void I2C_SMBusAlertConfig(uint16_t I2C_SMBusAlert);
void I2C_TransmitPEC(FunctionalState NewState);
void I2C_PECPositionConfig(uint16_t I2C_PECPosition);
void I2C_CalculatePEC(FunctionalState NewState);
uint8_t I2C_GetPEC(void);
void I2C_ARPCmd(FunctionalState NewState);
void I2C_StretchClockCmd(FunctionalState NewState);
void I2C_FastModeDutyCycleConfig(uint16_t I2C_DutyCycle);
/****************************************************************************************
* I2C State Monitoring Functions
****************************************************************************************/
uint8_t I2C_CheckEvent(uint32_t I2C_EVENT);
uint32_t I2C_GetLastEvent(void);
FlagStatus I2C_GetFlagStatus(uint32_t I2C_FLAG);
void I2C_ClearFlag(uint32_t I2C_FLAG);
ITStatus I2C_GetITStatus(uint32_t I2C_IT);
void I2C_ClearITPendingBit(uint32_t I2C_IT);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_I2C_H__

View File

@@ -0,0 +1,96 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_keyscan.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_KEYSCAN_H__
#define __CH57x_KEYSCAN_H__
#ifdef __cplusplus
extern "C" {
#endif
/*
* @brief Keyscan Pin Configuration
*/
#define KEYSCAN_PA2 0x100
#define KEYSCAN_PA3 0x200
#define KEYSCAN_PA8 0x400
#define KEYSCAN_PA10 0x800
#define KEYSCAN_PA11 0x1000
#define KEYSCAN_ALL 0x1F00
/*
* @brief Keyscan Clock Division
*/
#define KEYSCAN_DIV1 0x00
#define KEYSCAN_DIV2 0x10
#define KEYSCAN_DIV4 0x30
#define KEYSCAN_DIV8 0x70
#define KEYSCAN_DIV16 0xF0
/*
* @brief Keyscan repetition times
*/
#define KEYSCAN_REP1 0x02
#define KEYSCAN_REP2 0x04
#define KEYSCAN_REP3 0x06
#define KEYSCAN_REP4 0x08
#define KEYSCAN_REP5 0x0A
#define KEYSCAN_REP6 0x0C
#define KEYSCAN_REP7 0x0E
/*
* @brief Keyscan Configuration
*/
void KeyScan_Cfg(uint8_t s, uint16_t keyScanPin, uint16_t ClkDiv, uint16_t Rep);
/*
* @brief Keypress Wakeup Enable
*/
void KeyPress_Wake(uint8_t s);
/*
* @brief Key Values Return
*/
#define KeyValue (R32_KEY_SCAN_NUMB & RB_KEY_SCAN_NUMB)
/*
* @brief Keyscan Count
*/
#define KeyScan_Cnt (R32_KEY_SCAN_NUMB >> 20)
/**
* @brief KeyScan<61>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - ʹ<><CAB9>/<2F>ر<EFBFBD>
* @param f - refer to ENC interrupt bit define
*/
#define KeyScan_ITCfg(s, f) ((s) ? (R8_KEY_SCAN_INT_EN |= f) : (R8_KEY_SCAN_INT_EN &= ~f))
/**
* @brief <20><><EFBFBD><EFBFBD>ENC<4E>жϱ<D0B6>־
*
* @param f - refer to ENC interrupt bit define
*/
#define KeyScan_ClearITFlag(f) (R8_KEY_SCAN_INT_FLAG = f)
/**
* @brief <20><>ѯ<EFBFBD>жϱ<D0B6>־״̬
*
* @param f - refer to ENC interrupt bit define
*/
#define KeyScan_GetITFlag(f) (R8_KEY_SCAN_INT_FLAG & f)
#ifdef __cplusplus
}
#endif
#endif // __CH57x_KEYSCAN_H__

View File

@@ -0,0 +1,223 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_pwm.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_PWM_H__
#define __CH57x_PWM_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief channel of PWM define
*/
#define CH_PWM1 0x01 // PWM1 ͨ<><CDA8>
#define CH_PWM2 0x02 // PWM2 ͨ<><CDA8>
#define CH_PWM3 0x04 // PWM3 ͨ<><CDA8>
#define CH_PWM4 0x08 // PWM4 ͨ<><CDA8>
#define CH_PWM5 0x10 // PWM5 ͨ<><CDA8>
#define CH_PWM_ALL 0x1F // PWM1-5 ͨ<><CDA8>
/**
* @brief DMA channel of PWM
*/
typedef enum
{
Mode_DMACH1_3 = 0, // DMAѡ<41><D1A1>1<EFBFBD><31>2<EFBFBD><32><33><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Mode_DMACH4_5, // DMAѡ<41><D1A1>4<EFBFBD><34><35><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Mode_DMACH1_5, // DMAѡ<41><D1A1>1<EFBFBD><31>2<EFBFBD><32>3<EFBFBD><33>4<EFBFBD><34><35><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} PWM_DMAChannel;
/**
* @brief channel of PWM define
*/
typedef enum
{
High_Level = 0, // Ĭ<>ϵ͵<CFB5>ƽ<EFBFBD><C6BD><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>Ч
Low_Level, // Ĭ<>ϸߵ<CFB8>ƽ<EFBFBD><C6BD><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD>Ч
} PWMX_PolarTypeDef;
/**
* @brief Configuration PWM4_11 Cycle size
*/
typedef enum
{
PWMX_Cycle_256 = 0, // 256 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
PWMX_Cycle_255, // 255 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
PWMX_Cycle_128, // 128 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
PWMX_Cycle_127, // 127 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
PWMX_Cycle_64, // 64 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
PWMX_Cycle_63, // 63 <20><>PWMX<4D><58><EFBFBD><EFBFBD>
} PWMX_CycleTypeDef;
/**
* @brief Configuration DMA mode
*/
typedef enum
{
PWM_ModeSINGLE = 0, // <20><><EFBFBD><EFBFBD>ģʽ
PWM_ModeLOOP, // ѭ<><D1AD>ģʽ
} PWM_DMAModeTypeDef;
/**
* @brief PWM ͨ<><CDA8><EFBFBD><EFBFBD>׼ʱ<D7BC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - ͨ<><CDA8><EFBFBD><EFBFBD>׼ʱ<D7BC><CAB1> = d*Tsys
*/
#define PWMX_CLKCfg(d) (R16_PWM_CLOCK_DIV = d)
/**
* @brief PWM 8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - refer to PWMX_CycleTypeDef
*/
void PWMX_CycleCfg(PWMX_CycleTypeDef cyc);
/**
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param ch - select channel of pwm, refer to channel of PWM define
* cyc - 16λ<36><CEBB><EFBFBD><EFBFBD>
*/
void PWMX_16bit_CycleCfg(uint8_t ch, uint16_t cyc);
/**
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʹ<EFBFBD><CAB9>
*/
#define PWM_16bit_CycleEnable() (R8_PWM_CONFIG |= (3 << 1))
/**
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʧ<EFBFBD><CAA7>
*/
#define PWM_16bit_CycleDisable() (R8_PWM_CONFIG &= ~(3 << 1))
/**
* @brief <20><><EFBFBD><EFBFBD> PWM1 8λ<38><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM1_ActDataWidth(d) (R8_PWM1_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM2 8λ<38><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM2_ActDataWidth(d) (R8_PWM2_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM3 8λ<38><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM3_ActDataWidth(d) (R8_PWM3_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM4 8λ<38><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM4_ActDataWidth(d) (R8_PWM4_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM5 8λ<38><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM5_ActDataWidth(d) (R8_PWM5_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM1 16λ<36><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM1_16bit_ActDataWidth(d) (R16_PWM1_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM2 16λ<36><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM2_16bit_ActDataWidth(d) (R16_PWM2_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM3 16λ<36><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM3_16bit_ActDataWidth(d) (R16_PWM3_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM4 16λ<36><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM4_16bit_ActDataWidth(d) (R16_PWM4_DATA = d)
/**
* @brief <20><><EFBFBD><EFBFBD> PWM5 16λ<36><CEBB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define PWM5_16bit_ActDataWidth(d) (R16_PWM5_DATA = d)
/**
* @brief PWM 8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param s - control pwmx function, ENABLE or DISABLE
*/
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s);
/**
* @brief PWM 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param s - control pwmx function, ENABLE or DISABLE
*/
void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, FunctionalState s);
/**
* @brief PWM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param ch - select group of PWM alternate output
* RB_PWM4_5_STAG_EN - PWM4 <20><> PWM5 ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param s - control pwmx function, ENABLE or DISABLE
*/
void PWMX_AlterOutCfg(uint8_t ch, FunctionalState s);
/**
* @brief PWM ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
*
* @param s - control pwmx function, ENABLE or DISABLE
*/
void PWMX_SyncOutCfg(FunctionalState s);
/**
* @brief <20><><EFBFBD><EFBFBD>PWM DMA<4D><41><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
* @param startAddr - DMA <20><>ʼ<EFBFBD><CABC>ַ
* @param endAddr - DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
* @param m - <20><><EFBFBD><EFBFBD>DMAģʽ
*/
void PWM_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, PWM_DMAModeTypeDef m, PWM_DMAChannel ch);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_PWM_H__

View File

@@ -0,0 +1,118 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_pwr.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_PWR_H__
#define __CH57x_PWR_H__
#ifdef __cplusplus
extern "C" {
#endif
#define ROM_CFG_ADR_HW 0x7F00C // config address for hardware config for LDO&OSC and etc
/**
* @brief wakeup mode define, select wakeup delay
*/
typedef enum
{
Fsys_Delay_3584 = 0,
Fsys_Delay_512,
Fsys_Delay_64,
Fsys_Delay_1,
Fsys_Delay_8191,
Fsys_Delay_7168,
Fsys_Delay_6144,
Fsys_Delay_4096,
} WakeUP_ModeypeDef;
/**
* @brief wakeup mode define
*/
typedef enum
{
/* <20><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>ʹ<EFBFBD>õ͹<C3B5><CDB9>ļ<EFBFBD><C4BC>أ<EFBFBD>1uA<75><41><EFBFBD><EFBFBD> */
LPLevel_1V8 = 0,
LPLevel_2V0,
LPLevel_2V2,
LPLevel_2V4,
} VolM_LevelypeDef;
/**
* @brief <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>λ
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @param perph - please refer to Peripher CLK control bit define
*/
void PWR_PeriphClkCfg(FunctionalState s, uint16_t perph);
/**
* @brief ˯<>߻<EFBFBD><DFBB><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪴<EFBFBD><F2BFAAB4><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD>߻<EFBFBD><DFBB>ѹ<EFBFBD><D1B9><EFBFBD>
* @param perph - <20><>Ҫ<EFBFBD><D2AA><EFBFBD>õĻ<C3B5><C4BB><EFBFBD>Դ
* RB_SLP_USB_WAKE - USB Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_RTC_WAKE - RTC Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_GPIO_WAKE - GPIO Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* RB_SLP_BAT_WAKE - BAT Ϊ<><CEAA><EFBFBD><EFBFBD>Դ
* @param mode - refer to WakeUP_ModeypeDef
*/
void PWR_PeriphWakeUpCfg(FunctionalState s, uint8_t perph, WakeUP_ModeypeDef mode);
/**
* @brief <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7>򿪴˹<F2BFAAB4><CBB9><EFBFBD>
* @param vl - refer to VolM_LevelypeDef
*/
void PowerMonitor(FunctionalState s, VolM_LevelypeDef vl);
/**
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Idleģʽ
*/
void LowPower_Idle(void);
/**
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Haltģʽ<C4A3><CABD><EFBFBD>˵͹<CBB5><CDB9><EFBFBD><EFBFBD>е<EFBFBD>HSI/5ʱ<35><CAB1><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD>Ҫ<EFBFBD>û<EFBFBD><C3BB>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ϵͳʱ<CDB3><CAB1>Դ
*/
void LowPower_Halt(void);
/**
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Sleepģʽ<C4A3><CABD><EFBFBD>˵͹<CBB5><CDB9><EFBFBD><EFBFBD>е<EFBFBD>HSI/5ʱ<35><CAB1><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD>Ҫ<EFBFBD>û<EFBFBD><C3BB>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ϵͳʱ<CDB3><CAB1>Դ
* @note ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>DCDC<44><43><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرգ<D8B1><D5A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>ٴδ<D9B4><CEB4><EFBFBD>
*
* @param rm - <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ѡ<EFBFBD><D1A1>
* RB_PWR_RAM2K - 2K retention SRAM <20><><EFBFBD><EFBFBD>
* RB_PWR_RAM16K - 16K main SRAM <20><><EFBFBD><EFBFBD>
* RB_PWR_EXTEND - USB <20><> BLE <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򹩵<EFBFBD>
* RB_PWR_XROM - FlashROM <20><><EFBFBD><EFBFBD>
* NULL - <20><><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ϵ<EFBFBD>
*/
void LowPower_Sleep(uint16_t rm);
/**
* @brief <20>͹<EFBFBD><CDB9><EFBFBD>-Shutdownģʽ<C4A3><CABD><EFBFBD>˵͹<CBB5><CDB9><EFBFBD><EFBFBD>е<EFBFBD>HSI/5ʱ<35><CAB1><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD>Ҫ<EFBFBD>û<EFBFBD><C3BB>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ϵͳʱ<CDB3><CAB1>Դ
* @note ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>DCDC<44><43><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرգ<D8B1><D5A3><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>ٴδ<D9B4><CEB4><EFBFBD>
*
* @param rm - <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ѡ<EFBFBD><D1A1>
* RB_PWR_RAM2K - 2K retention SRAM <20><><EFBFBD><EFBFBD>
* RB_PWR_RAM16K - 16K main SRAM <20><><EFBFBD><EFBFBD>
* NULL - <20><><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ϵ<EFBFBD>
*/
void LowPower_Shutdown(uint16_t rm);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_PWR_H__

View File

@@ -0,0 +1,229 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_SPI.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_SPI_H__
#define __CH57x_SPI_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief SPI interrupt bit define
*/
#define SPI_IT_FST_BYTE RB_SPI_IE_FST_BYTE // <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ж<EFBFBD>
#define SPI_IT_FIFO_OV RB_SPI_IE_FIFO_OV // FIFO <20><><EFBFBD><EFBFBD>
#define SPI_IT_DMA_END RB_SPI_IE_DMA_END // DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SPI_IT_FIFO_HF RB_SPI_IE_FIFO_HF // FIFO ʹ<>ù<EFBFBD><C3B9><EFBFBD>
#define SPI_IT_BYTE_END RB_SPI_IE_BYTE_END // <20><><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SPI_IT_CNT_END RB_SPI_IE_CNT_END // ȫ<><C8AB><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief Configuration data mode
*/
typedef enum
{
Mode0_LowBitINFront = 0, // ģʽ0<CABD><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ǰ
Mode0_HighBitINFront, // ģʽ0<CABD><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ǰ
Mode3_LowBitINFront, // ģʽ3<CABD><33><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ǰ
Mode3_HighBitINFront, // ģʽ3<CABD><33><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ǰ
} ModeBitOrderTypeDef;
/**
* @brief Configuration SPI slave mode
*/
typedef enum
{
Mode_DataStream = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
Mose_FirstCmd, // <20><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ģʽ
} Slave_ModeTypeDef;
/**
* @brief <20><><EFBFBD><EFBFBD>ģʽĬ<CABD>ϳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ0+3<><33>ȫ˫<C8AB><CBAB>+8MHz
*/
void SPI_MasterDefInit(void);
/**
* @brief <20><><EFBFBD><EFBFBD>2<EFBFBD>߷<EFBFBD><DFB7><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*/
void SPI_2WIRE_MasterOutputInit(void);
/**
* @brief <20><><EFBFBD><EFBFBD>2<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ1+2<>߰<EFBFBD>˫<EFBFBD><CBAB>+8MHz
*/
void SPI_2WIRE_MasterReceiveInit(void);
/**
* @brief <20>ӻ<EFBFBD>2<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC>
*/
void SPI_2WIRE_SlaveInputInit(void);
/**
* @brief <20>ӻ<EFBFBD>2<EFBFBD>߷<EFBFBD><DFB7><EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC>
*/
void SPI_2WIRE_SlaveOutputInit(void);
/**
* @brief SPI <20><>׼ʱ<D7BC><CAB1><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>= d*Tsys
*
* @param c - ʱ<>ӷ<EFBFBD>Ƶϵ<C6B5><CFB5>
*/
void SPI_CLKCfg(uint8_t c);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
*
* @param m - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ refer to ModeBitOrderTypeDef
*/
void SPI_DataMode(ModeBitOrderTypeDef m);
/**
* @brief <20><><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD> (buffer)
*
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
*/
void SPI_MasterSendByte(uint8_t d);
/**
* @brief <20><><EFBFBD>յ<EFBFBD><D5B5>ֽ<EFBFBD> (buffer)
*
* @param none
*/
uint8_t SPI_MasterRecvByte(void);
/**
* @brief ʹ<><CAB9>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ֽ<EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*/
void SPI_MasterTrans(uint8_t *pbuf, uint16_t len);
/**
* @brief ʹ<><CAB9>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6>ֽ<EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*/
void SPI_MasterRecv(uint8_t *pbuf, uint16_t len);
/**
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void SPI_MasterDMATrans(uint8_t *pbuf, uint16_t len);
/**
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void SPI_MasterDMARecv(uint8_t *pbuf, uint16_t len);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define SetFirstData(d) (R8_SPI_SLAVE_PRE = d)
/**
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC>
*/
void SPI_SlaveInit(void);
/**
* @brief <20>ӻ<EFBFBD>2<EFBFBD><32>ģʽ<C4A3><CABD>ʼ<EFBFBD><CABC>
*/
void SPI_2WIRE_SlaveInit(void);
/**
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param d - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void SPI_SlaveSendByte(uint8_t d);
/**
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t SPI_SlaveRecvByte(void);
/**
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>4095
*/
void SPI_SlaveTrans(uint8_t *pbuf, uint16_t len);
/**
* @brief <20>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void SPI_SlaveRecv(uint8_t *pbuf, uint16_t len);
/**
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void SPI_SlaveDMATrans(uint8_t *pbuf, uint16_t len);
/**
* @brief DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pbuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
* @param len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void SPI_SlaveDMARecv(uint8_t *pbuf, uint16_t len);
/**
* @brief <20><><EFBFBD><EFBFBD>SPI<50>ж<EFBFBD>
*
* @param s - ʹ<><CAB9>/<2F>ر<EFBFBD>
* @param f - refer to SPI interrupt bit define
*/
#define SPI_ITCfg(s, f) ((s) ? (R8_SPI_INTER_EN |= f) : (R8_SPI_INTER_EN &= ~f))
/**
* @brief <20><>ȡ<EFBFBD>жϱ<D0B6>־״̬<D7B4><CCAC>0-δ<><CEB4>λ<EFBFBD><CEBB>(!0)-<2D><><EFBFBD><EFBFBD>
*
* @param f - refer to SPI interrupt bit define
*/
#define SPI_GetITFlag(f) (R8_SPI_INT_FLAG & f)
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>жϱ<D0B6>־
*
* @param f - refer to SPI interrupt bit define
*/
#define SPI_ClearITFlag(f) (R8_SPI_INT_FLAG = f)
/**
* @brief <20>ر<EFBFBD>SPI
*/
#define SPI_Disable() (R8_SPI_CTRL_MOD &= ~(RB_SPI_MOSI_OE | RB_SPI_SCK_OE | RB_SPI_MISO_OE))
#ifdef __cplusplus
}
#endif
#endif // __CH57x_SPI_H__

View File

@@ -0,0 +1,188 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_SYS.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_SYS_H__
#define __CH57x_SYS_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief rtc interrupt event define
*/
typedef enum
{
RST_STATUS_SW = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
RST_STATUS_RPOR, // <20>ϵ縴λ
RST_STATUS_WTR, // <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1>λ
RST_STATUS_MR, // <20>ⲿ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ
RST_STATUS_LRM0, // <20><><EFBFBD>Ѹ<EFBFBD>λ-<2D><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
RST_STATUS_GPWSM, // <20>µ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>Ѹ<EFBFBD>λ
RST_STATUS_LRM1, // <09><><EFBFBD>Ѹ<EFBFBD>λ-<2D><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD>
RST_STATUS_LRM2, // <09><><EFBFBD>Ѹ<EFBFBD>λ-<2D>ֶ<EFBFBD><D6B6><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
} SYS_ResetStaTypeDef;
/**
* @brief rtc interrupt event define
*/
typedef enum
{
INFO_RESET_EN = 0x4, // RST#<23>ⲿ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EBB9A6><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
INFO_BOOT_EN = 0x8, // ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BootLoader <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
INFO_RST_PIN = 0x10, // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>1<EFBFBD><31>PA7<41><37>0<EFBFBD><30>PA8
INFO_LOADER = 0x20, // <20><>ǰϵͳ<CFB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Bootloader <20><>
STA_SAFEACC_ACT = 0x30,// <20><>ǰϵͳ<CFB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڰ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RWA<57><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿ɷ<F2B2BBBF><C9B7><EFBFBD>
} SYS_InfoStaTypeDef;
/**
* @brief <20><>ȡоƬID<49>һ<E0A3AC><D2BB>Ϊ<EFBFBD>̶<EFBFBD>ֵ
*/
#define SYS_GetChipID() R8_CHIP_ID
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ID<49><44>һ<EFBFBD><D2BB>Ϊ<EFBFBD>̶<EFBFBD>ֵ
*/
#define SYS_GetAccessID() R8_SAFE_ACCESS_ID
/**
* @brief <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
*
* @param sc - ϵͳʱ<CDB3><CAB1>Դѡ<D4B4><D1A1> refer to SYS_CLKTypeDef
*/
void SetSysClock(SYS_CLKTypeDef sc);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳʱ<CDB3><CAB1>
*
* @return Hz
*/
uint32_t GetSysClock(void);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳ<CFB5><CDB3>Ϣ״̬
*
* @param i - refer to SYS_InfoStaTypeDef
*
* @return <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i);
/**
* @brief <20><>ȡϵͳ<CFB5>ϴθ<CFB4>λ״̬
*
* @return refer to SYS_ResetStaTypeDef
*/
#define SYS_GetLastResetSta() (R8_RESET_STATUS & RB_RESET_FLAG)
/**
* @brief ִ<><D6B4>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
*/
void SYS_ResetExecute(void);
/**
* @brief <20><><EFBFBD>ø<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ<EFBFBD><CEBB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>Ѹ<EFBFBD>λ<EFBFBD><CEBB>Ӱ<EFBFBD><D3B0>
*
* @param i - refer to SYS_InfoStaTypeDef
*/
#define SYS_ResetKeepBuf(d) (R8_GLOB_RESET_KEEP = d)
/**
* @brief <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ж<EFBFBD>ֵ
*
* @param pirqv - <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ֵ
*/
void SYS_DisableAllIrq(uint32_t *pirqv);
/**
* @brief <20>ָ<EFBFBD>֮ǰ<D6AE>رյ<D8B1><D5B5>ж<EFBFBD>ֵ
*
* @param irq_status - <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ֵ
*/
void SYS_RecoverIrq(uint32_t irq_status);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰϵͳ(SYSTICK)<29><><EFBFBD><EFBFBD>ֵ
*
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
*/
uint32_t SYS_GetSysTickCnt(void);
/**
* @brief <20><><EFBFBD>ؿ<EFBFBD><D8BF>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
#define WWDG_SetCounter(c) (R8_WDOG_COUNT = c)
/**
* @brief <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ж<EFBFBD>
*/
void WWDG_ITCfg(FunctionalState s);
/**
* @brief <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
*
* @param s - <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>λ
*/
void WWDG_ResetCfg(FunctionalState s);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
*
* @return <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
*/
#define WWDG_GetFlowFlag() (R8_RST_WDOG_CTRL & RB_WDOG_INT_FLAG)
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ؼ<EFBFBD><D8BC><EFBFBD>ֵҲ<D6B5><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void WWDG_ClearFlag(void);
/**
* @brief uS <20><>ʱ
*
* @param t - ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void mDelayuS(uint16_t t);
/**
* @brief mS <20><>ʱ
*
* @param t - ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void mDelaymS(uint16_t t);
/**
* @brief Enter safe access mode.
*
* @NOTE: After enter safe access mode, about 16 system frequency cycles
* are in safe mode, and one or more secure registers can be rewritten
* within the valid period. The safe mode will be automatically
* terminated after the above validity period is exceeded.
* if sys_safe_access_enable() is called,
* you must call sys_safe_access_disable() before call sys_safe_access_enable() again.
*/
#define sys_safe_access_enable() do{volatile uint32_t mpie_mie;mpie_mie=__risc_v_disable_irq();SAFEOPERATE;\
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;SAFEOPERATE;
#define sys_safe_access_disable() R8_SAFE_ACCESS_SIG = 0;__risc_v_enable_irq(mpie_mie);SAFEOPERATE;}while(0)
#ifdef __cplusplus
}
#endif
#endif // __CH57x_SYS_H__

View File

@@ -0,0 +1,263 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_timer.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_TIMER_H__
#define __CH57x_TIMER_H__
#ifdef __cplusplus
extern "C" {
#endif
#define DataBit_25 (1 << 25)
/**
* @brief TMR interrupt bit define
*/
#define TMR_IT_CYC_END 0x01 // <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>׽-<2D><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ-<2D><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>PWM-<2D><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
#define TMR_IT_DATA_ACT 0x02 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־<EFBFBD><D6BE><EFBFBD><EFBFBD>׽-<2D><><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>PWM-<2D><>Ч<EFBFBD><D0A7>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
#define TMR_IT_FIFO_HF 0x04 // FIFO ʹ<>ù<EFBFBD><C3B9><EFBFBD><EBA3BA>׽- FIFO>=4<><34> PWM- FIFO<4
#define TMR_IT_DMA_END 0x08 // DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>TMR-TMR3
#define TMR_IT_FIFO_OV 0x10 // FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׽- FIFO<46><4F><EFBFBD><EFBFBD> PWM- FIFO<46><4F>
/**
* @brief ENC interrupt bit define
*/
#define RB_IE_DIR_INC 0x01 // ǰ<><C7B0><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>
#define RB_IE_DIR_DEC 0x02 // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>
/**
* @brief Configuration PWM effective level repeat times
*/
typedef enum
{
PWM_Times_1 = 0, // PWM <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
PWM_Times_4, // PWM <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD>
PWM_Times_8, // PWM <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>8<EFBFBD><38><EFBFBD><EFBFBD>
PWM_Times_16, // PWM <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>16<31><36><EFBFBD><EFBFBD>
} PWM_RepeatTsTypeDef;
/**
* @brief Configuration Cap mode
*/
typedef enum
{
CAP_NULL = 0, // <20><><EFBFBD><EFBFBD>׽ & <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Edge_To_Edge, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE> & <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FallEdge_To_FallEdge, // <20>½<EFBFBD><C2BD>ص<EFBFBD><D8B5>½<EFBFBD><C2BD><EFBFBD> & <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
RiseEdge_To_RiseEdge, // <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> & <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} CapModeTypeDef;
/**
* @brief Configuration DMA mode
*/
typedef enum
{
Mode_Single = 0, // <20><><EFBFBD><EFBFBD>ģʽ
Mode_LOOP, // ѭ<><D1AD>ģʽ
} DMAModeTypeDef;
/**
* @brief Configuration ENC mode
*/
typedef enum
{
Mode_IDLE = 0, // IDLEģʽ
Mode_T2 , // T2<54><32><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ģʽ
Mode_T1 , // T1<54><31><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ģʽ
Mode_T1T2 , // T1<54><31>T2<54><32><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ģʽ
} ENCModeTypeDef;
/**
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param t - <20><>ʱʱ<CAB1><EFBFBD><E4A3AC><EFBFBD>ڵ<EFBFBD>ǰϵͳʱ<CDB3><CAB1>Tsys, <20><EFBFBD><EEB3A4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> 67108864
*/
void TMR_TimerInit(uint32_t t);
/**
* @brief <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param cap - <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void TMR_EXTSingleCounterInit(CapModeTypeDef cap);
/**
* @brief <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>67108863
*
* @param cyc - <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*/
#define TMR_CountOverflowCfg(cyc) (R32_TMR_CNT_END = (cyc + 2))
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>67108863
*
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
*/
#define TMR_GetCurrentCount() R32_TMR_COUNT
/**
* @brief PWM0 ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>67108863
*
* @param cyc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define TMR_PWMCycleCfg(cyc) (R32_TMR_CNT_END = cyc)
/**
* @brief PWM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
*
* @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
*/
void TMR_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts);
/**
* @brief PWM0 <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>67108864
*
* @param d - <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define TMR_PWMActDataWidth(d) (R32_TMR_FIFO = d)
/**
* @brief CAP0 <20><>׽<EFBFBD><D7BD>ƽ<EFBFBD><C6BD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>33554432
*
* @param cyc - <20><>׽<EFBFBD><D7BD>ƽ<EFBFBD><C6BD>ʱ
*/
#define TMR_CAPTimeoutCfg(cyc) (R32_TMR_CNT_END = cyc)
/**
* @brief <20>ⲿ<EFBFBD>źŲ<C5BA>׽<EFBFBD><D7BD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*
* @param cap - select capture mode, refer to CapModeTypeDef
*/
void TMR_CapInit(CapModeTypeDef cap);
/**
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define TMR_CAPGetData() R32_TMR_FIFO
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>Ѳ<EFBFBD><D1B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
*
* @return <20><>ǰ<EFBFBD>Ѳ<EFBFBD><D1B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
*/
#define TMR_CAPDataCounter() R8_TMR_FIFO_COUNT
/**
* @brief <20><><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
* @param startAddr - DMA <20><>ʼ<EFBFBD><CABC>ַ
* @param endAddr - DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
* @param m - <20><><EFBFBD><EFBFBD>DMAģʽ
*/
void TMR_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, DMAModeTypeDef m);
/**
* @brief <20><><EFBFBD><EFBFBD>ENC<4E><43><EFBFBD><EFBFBD>
*
* @param s - <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param encReg - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ֵ(<28><><EFBFBD><EFBFBD>ֵ0xFFFF)
* @param m - <20><><EFBFBD><EFBFBD>ENCģʽ
*
* @return none
*/
void ENC_Config(uint8_t s, uint32_t encReg, ENCModeTypeDef m);
/**
* @brief <20>ر<EFBFBD> TMR PWM<57><4D><EFBFBD><EFBFBD>
*/
#define TMR_PWMDisable() (R8_TMR_CTRL_MOD &= ~RB_TMR_OUT_EN)
/**
* @brief <20><><EFBFBD><EFBFBD> TMR PWM<57><4D><EFBFBD><EFBFBD>
*/
#define TMR_PWMEnable() (R8_TMR_CTRL_MOD |= RB_TMR_OUT_EN)
/**
* @brief <20>ر<EFBFBD> TMR
*/
#define TMR_Disable() (R8_TMR_CTRL_MOD &= ~RB_TMR_COUNT_EN)
/**
* @brief <20><><EFBFBD><EFBFBD> TMR
*/
#define TMR_Enable() (R8_TMR_CTRL_MOD |= RB_TMR_COUNT_EN)
/**
* @brief TMR<4D>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - ʹ<><CAB9>/<2F>ر<EFBFBD>
* @param f - refer to TMR interrupt bit define
*/
#define TMR_ITCfg(s, f) ((s) ? (R8_TMR_INTER_EN |= f) : (R8_TMR_INTER_EN &= ~f))
/**
* @brief <20><><EFBFBD><EFBFBD>TMR<4D>жϱ<D0B6>־
*
* @param f - refer to TMR interrupt bit define
*/
#define TMR_ClearITFlag(f) (R8_TMR_INT_FLAG = f)
/**
* @brief <20><>ѯ<EFBFBD>жϱ<D0B6>־״̬
*
* @param f - refer to TMR interrupt bit define
*/
#define TMR_GetITFlag(f) (R8_TMR_INT_FLAG & f)
/**
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD>ֵ 0:ǰ<><C7B0> 1:<3A><><EFBFBD><EFBFBD>
*/
#define ENC_GetCurrentDir (R8_ENC_REG_CTRL>>5 & 0x01)
/**
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
*/
#define ENC_GetCurrentCount R32_ENC_REG_CCNT
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
*/
#define ENC_GetCountandReset() R8_ENC_REG_CTRL |= RB_RD_CLR_EN
/**
* @brief ENC<4E>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - ʹ<><CAB9>/<2F>ر<EFBFBD>
* @param f - refer to ENC interrupt bit define
*/
#define ENC_ITCfg(s, f) ((s) ? (R8_ENC_INTER_EN |= f) : (R8_ENC_INTER_EN &= ~f))
/**
* @brief <20><><EFBFBD><EFBFBD>ENC<4E>жϱ<D0B6>־
*
* @param f - refer to ENC interrupt bit define
*/
#define ENC_ClearITFlag(f) (R8_ENC_INT_FLAG = f)
/**
* @brief <20><>ѯ<EFBFBD>жϱ<D0B6>־״̬
*
* @param f - refer to ENC interrupt bit define
*/
#define ENC_GetITFlag(f) (R8_ENC_INT_FLAG & f)
#ifdef __cplusplus
}
#endif
#endif // __CH57x_TIMER_H__

View File

@@ -0,0 +1,172 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_uart.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_UART_H__
#define __CH57x_UART_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief LINE error and status define
*/
#define STA_ERR_BREAK RB_LSR_BREAK_ERR // <20><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define STA_ERR_FRAME RB_LSR_FRAME_ERR // <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
#define STA_ERR_PAR RB_LSR_PAR_ERR // <20><>żУ<C5BC><D0A3>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
#define STA_ERR_FIFOOV RB_LSR_OVER_ERR // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define STA_TXFIFO_EMP RB_LSR_TX_FIFO_EMP // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>FIFO<46>գ<EFBFBD><D5A3><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define STA_TXALL_EMP RB_LSR_TX_ALL_EMP // <20><>ǰ<EFBFBD><C7B0><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define STA_RECV_DATA RB_LSR_DATA_RDY // <20><>ǰ<EFBFBD>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief Configuration UART TrigByte num
*/
typedef enum
{
UART_1BYTE_TRIG = 0, // 1<>ֽڴ<D6BD><DAB4><EFBFBD>
UART_2BYTE_TRIG, // 2<>ֽڴ<D6BD><DAB4><EFBFBD>
UART_4BYTE_TRIG, // 4<>ֽڴ<D6BD><DAB4><EFBFBD>
UART_7BYTE_TRIG, // 7<>ֽڴ<D6BD><DAB4><EFBFBD>
} UARTByteTRIGTypeDef;
/**
* @brief UART Tx Pin Remap Def
*/
typedef enum
{
UART_TX_REMAP_PA3 = 0, /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨TXD/PA3<41><33> */
UART_TX_REMAP_PA2, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA2<41><32> */
UART_TX_REMAP_PA1, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA1<41><31> */
UART_TX_REMAP_PA0, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA0<41><30> */
UART_TX_REMAP_PA7, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA7<41><37> */
UART_TX_REMAP_PA8, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA8<41><38> */
UART_TX_REMAP_PA11, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA11<31><31> */
UART_TX_REMAP_PA10, /*!<<3C><>ӳ<EFBFBD>䣨TXD/PA10<31><30> */
} UARTTxPinRemapDef;
/**
* @brief UART Rx Pin Remap Def
*/
typedef enum
{
UART_RX_REMAP_PA2 = 0, /*!<Ĭ<><C4AC>ӳ<EFBFBD>䣨RXD/PA2<41><32> */
UART_RX_REMAP_PA3, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA3<41><33> */
UART_RX_REMAP_PA0, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA0<41><30> */
UART_RX_REMAP_PA1, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA1<41><31> */
UART_RX_REMAP_PA6, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA6<41><36> */
UART_RX_REMAP_PA9, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA9<41><39> */
UART_RX_REMAP_PA10, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA10<31><30> */
UART_RX_REMAP_PA11, /*!<<3C><>ӳ<EFBFBD>䣨RXD/PA11<31><31> */
} UARTRxPinRemapDef;
/**
* @brief <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void UART_DefInit(void);
/**
* @brief <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param baudrate - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void UART_BaudRateCfg(uint32_t baudrate);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ֽڴ<D6BD><DAB4><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param b - <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> refer to UARTByteTRIGTypeDef
*/
void UART_ByteTrigCfg(UARTByteTRIGTypeDef b);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
*
* @param s - <20>жϿ<D0B6><CFBF><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>Ӧ<EFBFBD>ж<EFBFBD>
* @param i - <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
* RB_IER_MODEM_CHG - <20><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> UART0 ֧<>֣<EFBFBD>
* RB_IER_LINE_STAT - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·״̬<D7B4>ж<EFBFBD>
* RB_IER_THR_EMPTY - <20><><EFBFBD>ͱ<EFBFBD><CDB1>ּĴ<D6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* RB_IER_RECV_RDY - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*/
void UART_INTCfg(FunctionalState s, uint8_t i);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>FIFO
*/
#define UART_CLR_RXFIFO() (R8_UART_FCR |= RB_FCR_RX_FIFO_CLR)
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>FIFO
*/
#define UART_CLR_TXFIFO() (R8_UART_FCR |= RB_FCR_TX_FIFO_CLR)
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>жϱ<D0B6>־
*
* @return <20><>ǰ<EFBFBD>жϱ<D0B6>־
*/
#define UART_GetITFlag() (R8_UART_IIR & RB_IIR_INT_MASK)
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰͨѶ״̬
*
* @return refer to LINE error and status define
*/
#define UART_GetLinSTA() (R8_UART_LSR)
/**
* @brief <20><><EFBFBD>ڵ<EFBFBD><DAB5>ֽڷ<D6BD><DAB7><EFBFBD>
*
* @param b <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD>
*/
#define UART_SendByte(b) (R8_UART_THR = b)
/**
* @brief <20><><EFBFBD>ڶ<EFBFBD><DAB6>ֽڷ<D6BD><DAB7><EFBFBD>
*
* @param buf - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
void UART_SendString(uint8_t *buf, uint16_t l);
/**
* @brief <20><><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD>
*
* @return <20><>ȡ<EFBFBD><C8A1><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD>
*/
#define UART_RecvByte() (R8_UART_RBR)
/**
* @brief <20><><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD>
*
* @param buf - <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
*
* @return <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*/
uint16_t UART_RecvString(uint8_t *buf);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
*
* @param s - <20>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ӳ<EFBFBD><D3B3>
* @param perph - дTx<54><78>Rx<52><78>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ϵ
*/
void UART_Remap(FunctionalState s, UARTTxPinRemapDef u_tx, UARTRxPinRemapDef u_rx);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_UART_H__

View File

@@ -0,0 +1,152 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbdev.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_USBDEV_H__
#define __CH57x_USBDEV_H__
#ifdef __cplusplus
extern "C" {
#endif
/* HID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define DEF_USB_GET_IDLE 0x02 /* get idle for key or mouse */
#define DEF_USB_GET_PROTOCOL 0x03 /* get protocol for bios type */
#define DEF_USB_SET_REPORT 0x09 /* set report for key */
#define DEF_USB_SET_IDLE 0x0A /* set idle for key or mouse */
#define DEF_USB_SET_PROTOCOL 0x0B /* set protocol for bios type */
/* <20><><EFBFBD>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USBģ<42><C4A3><EFBFBD>շ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD>9<EFBFBD><39>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>9<EFBFBD><EFBFBD><EFBFBD><E6A3A9><EFBFBD>û<EFBFBD><C3BB>ɸ<EFBFBD><C9B8><EFBFBD>ʵ<EFBFBD><CAB5>ʹ<EFBFBD>õ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
extern uint8_t *pEP0_RAM_Addr; //ep0(64)+ep4_out(64)+ep4_in(64)
extern uint8_t *pEP1_RAM_Addr; //ep1_out(64)+ep1_in(64)
extern uint8_t *pEP2_RAM_Addr; //ep2_out(64)+ep2_in(64)
extern uint8_t *pEP3_RAM_Addr; //ep3_out(64)+ep3_in(64)
#define pSetupReqPak ((PUSB_SETUP_REQ)pEP0_RAM_Addr)
#define pEP0_DataBuf (pEP0_RAM_Addr)
#define pEP1_OUT_DataBuf (pEP1_RAM_Addr)
#define pEP1_IN_DataBuf (pEP1_RAM_Addr + 64)
#define pEP2_OUT_DataBuf (pEP2_RAM_Addr)
#define pEP2_IN_DataBuf (pEP2_RAM_Addr + 64)
#define pEP3_OUT_DataBuf (pEP3_RAM_Addr)
#define pEP3_IN_DataBuf (pEP3_RAM_Addr + 64)
#define pEP4_OUT_DataBuf (pEP0_RAM_Addr + 64)
#define pEP4_IN_DataBuf (pEP0_RAM_Addr + 128)
/**
* @brief USB<53><EFBFBD><E8B1B8><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>˵㣬8<E3A3AC><38>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
*/
void USB_DeviceInit(void);
/**
* @brief USB<53>豸Ӧ<E8B1B8><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B4A6>
*/
void USB_DevTransProcess(void);
/**
* @brief <20>˵<EFBFBD>1<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
*
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP1_OUT_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>2<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
*
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP2_OUT_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>3<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
*
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP3_OUT_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>4<EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
*
* @param l - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP4_OUT_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP1_IN_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP2_IN_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP3_IN_Deal(uint8_t l);
/**
* @brief <20>˵<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
*
* @param l - <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>(<64B)
*/
void DevEP4_IN_Deal(uint8_t l);
/**
* @brief <20><>ѯ<EFBFBD>˵<EFBFBD>1<EFBFBD>Ƿ<EFBFBD><C7B7>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
*
* @return 0-δ<><CEB4><EFBFBD><EFBFBD> (!0)-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define EP1_GetINSta() (R8_UEP1_CTRL & UEP_T_RES_NAK)
/**
* @brief <20><>ѯ<EFBFBD>˵<EFBFBD>2<EFBFBD>Ƿ<EFBFBD><C7B7>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
*
* @return 0-δ<><CEB4><EFBFBD><EFBFBD> (!0)-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define EP2_GetINSta() (R8_UEP2_CTRL & UEP_T_RES_NAK)
/**
* @brief <20><>ѯ<EFBFBD>˵<EFBFBD>3<EFBFBD>Ƿ<EFBFBD><C7B7>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
*
* @return 0-δ<><CEB4><EFBFBD><EFBFBD> (!0)-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define EP3_GetINSta() (R8_UEP3_CTRL & UEP_T_RES_NAK)
/**
* @brief <20><>ѯ<EFBFBD>˵<EFBFBD>4<EFBFBD>Ƿ<EFBFBD><C7B7>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
*
* @return 0-δ<><CEB4><EFBFBD><EFBFBD> (!0)-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define EP4_GetINSta() (R8_UEP4_CTRL & UEP_T_RES_NAK)
/**
* @brief <20>ر<EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#define USB_DisablePin() (R16_PIN_ANALOG_IE &= ~(RB_PIN_USB_IE | RB_PIN_USB_DP_PU))
/**
* @brief <20>ر<EFBFBD>USB
*/
#define USB_Disable() (R32_USB_CONTROL = 0)
#ifdef __cplusplus
}
#endif
#endif // __CH57x_USBDEV_H__

View File

@@ -0,0 +1,314 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbhost.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description : head file(ch572/ch570)
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH57x_USBHOST_H__
#define __CH57x_USBHOST_H__
#ifdef __cplusplus
extern "C" {
#endif
#if DISK_LIB_ENABLE
#if DISK_WITHOUT_USB_HUB
/* <20><>ʹ<EFBFBD><CAB9>U<EFBFBD><55><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD>̹<EFBFBD><CCB9><EFBFBD>USBhub<75><62><EFBFBD><EFBFBD><E6A3AC>Ҫ<EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><E6B6A8> */
#define FOR_ROOT_UDISK_ONLY
#endif
/* ʹ<><CAB9>U<EFBFBD><55><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><EFBFBD><E2A3AC>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B6A8>, <20><>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD> */
#define DISK_BASE_BUF_LEN 512 /* Ĭ<>ϵĴ<CFB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪ512<31>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>Ϊ2048<34><38><EFBFBD><EFBFBD>4096<39><36>֧<EFBFBD><D6A7>ijЩ<C4B3><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD><55>,Ϊ0<CEAA><30><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>.H<>ļ<EFBFBD><C4BC>ж<EFBFBD><D0B6><EFBFBD><E5BBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>pDISK_BASE_BUF<55><46>ָ<EFBFBD><D6B8> */
#endif
// <20><><EFBFBD>ӳ<EFBFBD><D3B3>򷵻<EFBFBD>״̬<D7B4><CCAC>
#define ERR_SUCCESS 0x00 // <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
#define ERR_USB_CONNECT 0x15 /* <20><><EFBFBD>⵽USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>,<2C>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD> */
#define ERR_USB_DISCON 0x16 /* <20><><EFBFBD>⵽USB<53><EFBFBD>Ͽ<EFBFBD><CFBF>¼<EFBFBD>,<2C>Ѿ<EFBFBD><D1BE>Ͽ<EFBFBD> */
#define ERR_USB_BUF_OVER 0x17 /* USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̫<EFBFBD><EFBFBD><E0BBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define ERR_USB_DISK_ERR 0x1F /* USB<53><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>,<2C>ڳ<EFBFBD>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E6B4A2><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>,<2C>ڶ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD>𻵻<EFBFBD><F0BBB5BB><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>Ͽ<EFBFBD> */
#define ERR_USB_TRANSFER 0x20 /* NAK/STALL<4C>ȸ<EFBFBD><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x20~0x2F */
#define ERR_USB_UNSUPPORT 0xFB /* <20><>֧<EFBFBD>ֵ<EFBFBD>USB<53>豸*/
#define ERR_USB_UNKNOWN 0xFE /* <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define ERR_AOA_PROTOCOL 0x41 /* Э<><D0AD><EFBFBD><EFBFBD><E6B1BE><EFBFBD><EFBFBD> */
/*USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>,<2C><><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>1<EFBFBD><31><EFBFBD>豸*/
#define ROOT_DEV_DISCONNECT 0
#define ROOT_DEV_CONNECTED 1
#define ROOT_DEV_FAILED 2
#define ROOT_DEV_SUCCESS 3
#define DEV_TYPE_KEYBOARD (USB_DEV_CLASS_HID | 0x20)
#define DEV_TYPE_MOUSE (USB_DEV_CLASS_HID | 0x30)
#define DEF_AOA_DEVICE 0xF0
#define DEV_TYPE_UNKNOW 0xFF
/*
Լ<EFBFBD><EFBFBD>: USB<53><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ο<EFBFBD>USB_DEVICE_ADDR)
<EFBFBD><EFBFBD>ֵַ <20>豸λ<E8B1B8><CEBB>
0x02 <20><><EFBFBD><EFBFBD>Root-HUB<55>µ<EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD>ⲿHUB
0x1x <20><><EFBFBD><EFBFBD>Root-HUB<55>µ<EFBFBD><C2B5>ⲿHUB<55>Ķ˿<C4B6>x<EFBFBD>µ<EFBFBD>USB<53>豸,xΪ1~n
*/
#define HUB_MAX_PORTS 4
#define WAIT_USB_TOUT_200US 800 // <20>ȴ<EFBFBD>USB<53>жϳ<D0B6>ʱʱ<CAB1><CAB1>
typedef struct
{
uint8_t DeviceStatus; // <20>豸״̬,0-<2D><><EFBFBD>豸,1-<2D><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>,2-<2D><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ö<EFBFBD><C3B6>ʧ<EFBFBD><CAA7>,3-<2D><><EFBFBD><EFBFBD>ҳ<EFBFBD>ʼ<EFBFBD><CABC>ö<EFBFBD>ٳɹ<D9B3>
uint8_t DeviceAddress; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42>ַ
uint8_t DeviceSpeed; // 0Ϊ<30><CEAA><EFBFBD><EFBFBD>,<2C><>0Ϊȫ<CEAA><C8AB>
uint8_t DeviceType; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
uint16_t DeviceVID;
uint16_t DevicePID;
uint8_t GpVar[4]; // ͨ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ˵<C5B6>
uint8_t GpHUBPortNum; // ͨ<>ñ<EFBFBD><C3B1><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB<55><42><EFBFBD><EFBFBD>ʾHUB<55>˿<EFBFBD><CBBF><EFBFBD>
} _RootHubDev;
typedef struct
{
uint8_t DeviceStatus; // <20>豸״̬,0-<2D><><EFBFBD>豸,1-<2D><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>,2-<2D><><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ö<EFBFBD><C3B6>ʧ<EFBFBD><CAA7>,3-<2D><><EFBFBD><EFBFBD>ҳ<EFBFBD>ʼ<EFBFBD><CABC>ö<EFBFBD>ٳɹ<D9B3>
uint8_t DeviceAddress; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42>ַ
uint8_t DeviceSpeed; // 0Ϊ<30><CEAA><EFBFBD><EFBFBD>,<2C><>0Ϊȫ<CEAA><C8AB>
uint8_t DeviceType; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
uint16_t DeviceVID;
uint16_t DevicePID;
uint8_t GpVar[4]; // ͨ<>ñ<EFBFBD><C3B1><EFBFBD>
} _DevOnHubPort; // <20>ٶ<EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ⲿHUB,ÿ<><C3BF><EFBFBD>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB_MAX_PORTS<54><53><EFBFBD>˿<EFBFBD>(<28><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>)
extern _RootHubDev ThisUsbDev;
extern _DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // <20>ٶ<EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ⲿHUB,ÿ<><C3BF><EFBFBD>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB_MAX_PORTS<54><53><EFBFBD>˿<EFBFBD>(<28><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>)
extern uint8_t UsbDevEndp0Size; // USB<53><EFBFBD>Ķ˵<C4B6>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> */
extern uint8_t FoundNewDev;
extern uint8_t *pHOST_RX_RAM_Addr;
extern uint8_t *pHOST_TX_RAM_Addr;
extern _RootHubDev ThisUsb2Dev;
extern _DevOnHubPort DevOnU2HubPort[HUB_MAX_PORTS]; // <20>ٶ<EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ⲿHUB,ÿ<><C3BF><EFBFBD>ⲿHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HUB_MAX_PORTS<54><53><EFBFBD>˿<EFBFBD>(<28><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>)
extern uint8_t Usb2DevEndp0Size; // USB<53><EFBFBD>Ķ˵<C4B6>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> */
extern uint8_t FoundNewU2Dev;
extern uint8_t *pU2HOST_RX_RAM_Addr;
extern uint8_t *pU2HOST_TX_RAM_Addr;
#define pSetupReq ((PUSB_SETUP_REQ)pHOST_TX_RAM_Addr)
#define pU2SetupReq ((PUSB_SETUP_REQ)pU2HOST_TX_RAM_Addr)
extern uint8_t Com_Buffer[];
extern uint8_t U2Com_Buffer[];
/* <20><><EFBFBD><EFBFBD>ΪUSB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
extern const uint8_t SetupGetDevDescr[]; // <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupGetCfgDescr[]; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupSetUsbAddr[]; // <20><><EFBFBD><EFBFBD>USB<53><42>ַ*/
extern const uint8_t SetupSetUsbConfig[]; // <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>*/
extern const uint8_t SetupSetUsbInterface[]; // <20><><EFBFBD><EFBFBD>USB<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupClrEndpStall[]; // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>STALL*/
extern const uint8_t SetupGetU2DevDescr[]; // <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupGetU2CfgDescr[]; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupSetUsb2Addr[]; // <20><><EFBFBD><EFBFBD>USB<53><42>ַ*/
extern const uint8_t SetupSetUsb2Config[]; // <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>*/
extern const uint8_t SetupSetUsb2Interface[]; // <20><><EFBFBD><EFBFBD>USB<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>*/
extern const uint8_t SetupClrU2EndpStall[]; // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>STALL*/
/**
* @brief <20>ر<EFBFBD>ROOT-HUB<55>˿<EFBFBD><><CAB5><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Ѿ<EFBFBD><D1BE>Զ<EFBFBD><D4B6>ر<EFBFBD>,<2C>˴<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB>ṹ״̬
*/
void DisableRootHubPort(void);
/**
* @brief <20><><EFBFBD><EFBFBD>ROOT-HUB״̬,<2C><><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>DisableRootHubPort()<29><><EFBFBD><EFBFBD>,<2C><><EFBFBD>˿ڹر<DAB9>,<2C><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD>˿ڵ<CBBF>״̬λ
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESSΪû<CEAA><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_CONNECTΪ<54><CEAA><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_DISCONΪ<4E><CEAA><EFBFBD><EFBFBD>Ͽ<EFBFBD>
*/
uint8_t AnalyzeRootHub(void);
/**
* @brief <20><><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
*
* @param addr - USB<53><EFBFBD><E8B1B8>ַ
*/
void SetHostUsbAddr(uint8_t addr);
/**
* @brief <20><><EFBFBD>õ<EFBFBD>ǰUSB<53>ٶ<EFBFBD>
*
* @param FullSpeed - USB<53>ٶ<EFBFBD>
*/
void SetUsbSpeed(uint8_t FullSpeed);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><E8B1B8>,<2C><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>,Ϊö<CEAA><C3B6><EFBFBD>豸׼<E8B1B8><D7BC>,<2C><><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>Ϊȫ<CEAA><C8AB>
*/
void ResetRootHubPort(void);
/**
* @brief ʹ<><CAB9>ROOT-HUB<55>˿<EFBFBD>,<2C><>Ӧ<EFBFBD><D3A6>bUH_PORT_EN<45><4E>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>,<2C><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>·<EFBFBD><C2B7><EFBFBD>ʧ<EFBFBD><CAA7>
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESSΪ<53><CEAA><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ERR_USB_DISCONΪ<4E><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t EnableRootHubPort(void);
/**
* @brief <20>ȴ<EFBFBD>USB<53>ж<EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD>ERR_SUCCESS <20><><EFBFBD>ݽ<EFBFBD><DDBD>ջ<EFBFBD><D5BB>߷<EFBFBD><DFB7>ͳɹ<CDB3>,<2C><><EFBFBD><EFBFBD>ERR_USB_UNKNOWN <20><><EFBFBD>ݽ<EFBFBD><DDBD>ջ<EFBFBD><D5BB>߷<EFBFBD><DFB7><EFBFBD>ʧ<EFBFBD><CAA7>
*/
uint8_t WaitUSB_Interrupt(void);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ŀ<EFBFBD>Ķ˵<C4B6><CBB5><EFBFBD>ַ/PID<49><44><EFBFBD><EFBFBD><><CDAC><EFBFBD><EFBFBD>־,<2C><>20uSΪ<53><CEAA>λ<EFBFBD><CEBB>NAK<41><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,0xFFFF<46><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>,<2C><>ʱ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><><CEAA><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><>öԱ<C3B6><D4B1>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>
*
* @param endp_pid - <20><><EFBFBD>ƺ͵<C6BA>ַ, <20><><34><CEBB>token_pid<69><64><EFBFBD><EFBFBD>, <20><><34>Ƕ˵<C7B6><CBB5><EFBFBD>ַ
* @param tog - ͬ<><CDAC><EFBFBD><EFBFBD>־
* @param timeout - <20><>ʱʱ<CAB1><CAB1>
*
* @return ERR_USB_UNKNOWN <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
* ERR_USB_DISCON <20><EFBFBD>Ͽ<EFBFBD>
* ERR_USB_CONNECT <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
* ERR_SUCCESS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout);
/**
* @brief ִ<>п<EFBFBD><D0BF>ƴ<EFBFBD><C6B4><EFBFBD>,8<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pSetupReq<65><71>,DataBufΪ<66><CEAA>ѡ<EFBFBD><D1A1><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param DataBuf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>պͷ<D5BA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ôDataBuf<75><66>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param RetLen - ʵ<>ʳɹ<CAB3><C9B9>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>RetLenָ<6E><D6B8><EFBFBD><EFBFBD><EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD>
*
* @return ERR_USB_BUF_OVER IN״̬<D7B4>׶γ<D7B6><CEB3><EFBFBD>
* ERR_SUCCESS <20><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
*/
uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen);
/**
* @brief <20><><EFBFBD>ƿ<EFBFBD><C6BF>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param pReqPkt - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
*/
void CopySetupReqPkg(const uint8_t *pReqPkt);
/**
* @brief <20><>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pHOST_TX_RAM_Addr <20><>
*
* @return ERR_USB_BUF_OVER <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
* ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlGetDeviceDescr(void);
/**
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pHOST_TX_RAM_Addr <20><>
*
* @return ERR_USB_BUF_OVER <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>
* ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlGetConfigDescr(void);
/**
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8>ַ
*
* @param addr - <20><EFBFBD><E8B1B8>ַ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbAddress(uint8_t addr);
/**
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
*
* @param cfg - <20><><EFBFBD><EFBFBD>ֵ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbConfig(uint8_t cfg);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>STALL
*
* @param endp - <20>˵<EFBFBD><CBB5><EFBFBD>ַ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlClearEndpStall(uint8_t endp);
/**
* @brief <20><><EFBFBD><EFBFBD>USB<53><EFBFBD>ӿ<EFBFBD>
*
* @param cfg - <20><><EFBFBD><EFBFBD>ֵ
*
* @return ERR_SUCCESS <20>ɹ<EFBFBD>
*/
uint8_t CtrlSetUsbIntercace(uint8_t cfg);
/**
* @brief USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>ʼ<EFBFBD><CABC>
*/
void USB_HostInit(void);
uint8_t EnumAllHubPort(void);// ö<><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ⲿHUB<55><42><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>USB<53>
void SelectHubPort(uint8_t HubPortIndex); // HubPortIndex=0ѡ<30><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿<EFBFBD>,<2C><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ROOT-HUB<55>˿ڵ<CBBF><DAB5>ⲿHUB<55><42>ָ<EFBFBD><D6B8><EFBFBD>˿<EFBFBD>
uint16_t SearchTypeDevice(uint8_t type); // <20><>ROOT-HUB<55>Լ<EFBFBD><D4BC>ⲿHUB<55><42><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><E8B1B8><EFBFBD>ڵĶ˿ں<CBBF>,<2C><><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF>Ϊ0xFFFF<46><46>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
uint8_t SETorOFFNumLock(uint8_t *buf); // NumLock<63>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ж<EFBFBD>
/*************************************************************/
/**
* @brief <20><>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8>ROOT-HUB<55>˿ڵ<CBBF>USB<53>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t InitRootDevice(void);
/**
* @brief <20><>ȡHID<49><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TxBuffer<65><72>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t CtrlGetHIDDeviceReport(uint8_t infc);
/**
* @brief <20><>ȡHUB<55><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com_Buffer<65><72>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t CtrlGetHubDescr(void);
/**
* @brief <20><>ѯHUB<55>˿<EFBFBD>״̬,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com_Buffer<65><72>
*
* @param HubPortIndex - <20>˿ں<CBBF>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubGetPortStatus(uint8_t HubPortIndex);
/**
* @brief <20><><EFBFBD><EFBFBD>HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @param HubPortIndex - <20>˿ں<CBBF>
* @param FeatureSelt - <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
/**
* @brief <20><><EFBFBD><EFBFBD>HUB<55>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @param HubPortIndex - <20>˿ں<CBBF>
* @param FeatureSelt - <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
*
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
#ifdef __cplusplus
}
#endif
#endif // __CH57x_USBHOST_H__

View File

@@ -0,0 +1,130 @@
/* CH572 Flash-ROM & Data-Flash */
/* Website: http://wch.cn */
/* Email: tech@wch.cn */
/* Author: W.ch 2024.12 */
/* V1.0 FlashROM library for USER/BOOT */
/* for the target in USER code area on the chip divided into USER code area and BOOT area */
/* <20><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ϊ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ã<EFBFBD>IAP<41><50><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룩 */
/* Flash-ROM feature:
for store program code, support block erasing, dword and page writing, dword verifying, unit for Length is byte,
minimal quantity for write or verify is one dword (4-bytes),
256 bytes/page for writing, FLASH_ROM_WRITE support one dword or more dword writing, but multiple of 256 is the best,
4KB (4096 bytes) bytes/block for erasing, so multiple of 4096 is the best */
#ifndef FLASH_MIN_WR_SIZE
#define FLASH_MIN_WR_SIZE 4 // Flash-ROM minimal size for writing
#endif
#ifndef FLASH_ROM_MAX_SIZE
#define FLASH_ROM_MAX_SIZE 0x03C000 // Flash-ROM maximum program size, 240KB
#endif
#ifndef FLASH_BLOCK_SIZE
#define FLASH_BLOCK_SIZE 4096
#endif
// CMD_* for caller from FlashROM or RAM, auto execute CMD_FLASH_ROM_SW_RESET before command
#ifndef CMD_FLASH_ROM_SW_RESET
#define CMD_FLASH_ROM_START_IO 0x00 // start FlashROM I/O, without parameter
#define CMD_FLASH_ROM_SW_RESET 0x04 // software reset FlashROM, without parameter
#define CMD_GET_ROM_INFO 0x06 // get information from FlashROM, parameter @Address,Buffer
#define CMD_GET_UNIQUE_ID 0x07 // get 64 bit unique ID, parameter @Buffer
#define CMD_FLASH_ROM_PWR_DOWN 0x0D // power-down FlashROM, without parameter
#define CMD_FLASH_ROM_PWR_UP 0x0C // power-up FlashROM, without parameter
#define CMD_FLASH_ROM_ERASE 0x01 // erase FlashROM block, return 0 if success, parameter @StartAddr,Length
#define CMD_FLASH_ROM_WRITE 0x02 // write FlashROM data block, minimal block is dword, return 0 if success, parameter @StartAddr,Buffer,Length
#define CMD_FLASH_ROM_VERIFY 0x03 // read FlashROM data block, minimal block is dword, return 0 if success, parameter @StartAddr,Buffer,Length
#endif
#define ROM_CFG_MAC_ADDR 0x3F018 // address for MAC address information
#define ROM_CFG_BOOT_INFO 0x3DFF8 // address for BOOT information
/**
* @brief execute Flash/EEPROM command, caller from FlashROM or RAM
*
* @param cmd - CMD_* for caller from FlashROM or RAM.
* @param StartAddr - Address of the data to be process.
* @param Buffer - Pointer to the buffer where data should be process, Must in RAM and be aligned to 4 bytes.
* @param Length - Size of data to be process, in bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
extern uint32_t FLASH_EEPROM_CMD( uint8_t cmd, uint32_t StartAddr, void *Buffer, uint32_t Length );
/**
* @brief start FlashROM I/O
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_START_IO( ) FLASH_EEPROM_CMD( CMD_FLASH_ROM_START_IO, 0, NULL, 0 )
/**
* @brief software reset FlashROM
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_SW_RESET( ) FLASH_EEPROM_CMD( CMD_FLASH_ROM_SW_RESET, 0, NULL, 0 )
/**
* @brief get 6 bytes MAC address
*
* @param Buffer - Pointer to the buffer where data should be stored, Must in RAM and be aligned to 4 bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define GetMACAddress(Buffer) FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_MAC_ADDR, Buffer, 0 )
/**
* @brief get 8 bytes BOOT information
*
* @param Buffer - Pointer to the buffer where data should be stored, Must in RAM and be aligned to 4 bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define GET_BOOT_INFO(Buffer) FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_BOOT_INFO, Buffer, 0 )
/**
* @brief power-down FlashROM
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_PWR_DOWN( ) FLASH_EEPROM_CMD( CMD_FLASH_ROM_PWR_DOWN, 0, NULL, 0 )
/**
* @brief power-up FlashROM
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_PWR_UP( ) FLASH_EEPROM_CMD( CMD_FLASH_ROM_PWR_UP, 0, NULL, 0 )
/**
* @brief erase FlashROM block
*
* @param StartAddr - Address of the data to be erased.
* @param Length - Size of data to be erased, in bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_ERASE(StartAddr,Length) FLASH_EEPROM_CMD( CMD_FLASH_ROM_ERASE, StartAddr, NULL, Length )
/**
* @brief write FlashROM data block, minimal block is dword.
*
* @param StartAddr - Address of the data to be written.
* @param Buffer - Pointer to the source buffer, Must in RAM and be aligned to 4 bytes.
* @param Length - Size of data to be written, in bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_WRITE(StartAddr,Buffer,Length) FLASH_EEPROM_CMD( CMD_FLASH_ROM_WRITE, StartAddr, Buffer, Length )
/**
* @brief verify FlashROM data block, minimal block is dword.
*
* @param StartAddr - Address of the data to verify.
* @param Buffer - Pointer to the source buffer, Must in RAM and be aligned to 4 bytes.
* @param Length - Size of data to verify, in bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/
#define FLASH_ROM_VERIFY(StartAddr,Buffer,Length) FLASH_EEPROM_CMD( CMD_FLASH_ROM_VERIFY, StartAddr, Buffer, Length )

Binary file not shown.