RF_W13无卡设备
上传云端
This commit is contained in:
473
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_clk.c
Normal file
473
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_clk.c
Normal 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;
|
||||
}
|
||||
}
|
||||
44
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_cmp.c
Normal file
44
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_cmp.c
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
157
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_flash.c
Normal file
157
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_flash.c
Normal 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><>8λ <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;
|
||||
}
|
||||
145
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_gpio.c
Normal file
145
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_gpio.c
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
672
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_i2c.c
Normal file
672
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_i2c.c
Normal 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;
|
||||
}
|
||||
63
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_keyscan.c
Normal file
63
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_keyscan.c
Normal 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();
|
||||
}
|
||||
}
|
||||
246
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_pwm.c
Normal file
246
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_pwm.c
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
300
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_pwr.c
Normal file
300
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_pwr.c
Normal 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();
|
||||
}
|
||||
454
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_spi.c
Normal file
454
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_spi.c
Normal 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;
|
||||
}
|
||||
421
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_sys.c
Normal file
421
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_sys.c
Normal 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;
|
||||
}
|
||||
132
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_timer.c
Normal file
132
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_timer.c
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
160
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_uart.c
Normal file
160
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_uart.c
Normal 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);
|
||||
}
|
||||
}
|
||||
113
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbdev.c
Normal file
113
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbdev.c
Normal 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;
|
||||
}
|
||||
695
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbhostBase.c
Normal file
695
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbhostBase.c
Normal 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><>4λ<34><CEBB>token_pid<69><64><EFBFBD><EFBFBD>, <20><>4λ<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;
|
||||
}
|
||||
840
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbhostClass.c
Normal file
840
BLV_RF_W13_V04_20260114/StdPeriphDriver/CH57x_usbhostClass.c
Normal 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>
|
||||
}
|
||||
1600
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH572SFR.h
Normal file
1600
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH572SFR.h
Normal file
File diff suppressed because it is too large
Load Diff
243
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_clk.h
Normal file
243
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_clk.h
Normal 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__
|
||||
79
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_cmp.h
Normal file
79
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_cmp.h
Normal 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__
|
||||
95
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_common.h
Normal file
95
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_common.h
Normal 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__
|
||||
|
||||
41
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_flash.h
Normal file
41
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_flash.h
Normal 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__
|
||||
202
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_gpio.h
Normal file
202
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_gpio.h
Normal 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__
|
||||
191
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_i2c.h
Normal file
191
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_i2c.h
Normal 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__
|
||||
96
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_keyscan.h
Normal file
96
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_keyscan.h
Normal 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__
|
||||
223
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_pwm.h
Normal file
223
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_pwm.h
Normal 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>3ͨ<33><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Mode_DMACH4_5, // DMAѡ<41><D1A1>4<EFBFBD><34>5ͨ<35><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Mode_DMACH1_5, // DMAѡ<41><D1A1>1<EFBFBD><31>2<EFBFBD><32>3<EFBFBD><33>4<EFBFBD><34>5ͨ<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__
|
||||
118
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_pwr.h
Normal file
118
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_pwr.h
Normal 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__
|
||||
229
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_spi.h
Normal file
229
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_spi.h
Normal 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__
|
||||
188
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_sys.h
Normal file
188
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_sys.h
Normal 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__
|
||||
263
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_timer.h
Normal file
263
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_timer.h
Normal 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__
|
||||
172
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_uart.h
Normal file
172
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_uart.h
Normal 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__
|
||||
152
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_usbdev.h
Normal file
152
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_usbdev.h
Normal 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__
|
||||
314
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_usbhost.h
Normal file
314
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/CH57x_usbhost.h
Normal 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><>4λ<34><CEBB>token_pid<69><64><EFBFBD><EFBFBD>, <20><>4λ<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__
|
||||
130
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/ISP572.h
Normal file
130
BLV_RF_W13_V04_20260114/StdPeriphDriver/inc/ISP572.h
Normal 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 )
|
||||
|
||||
BIN
BLV_RF_W13_V04_20260114/StdPeriphDriver/libISP572.a
Normal file
BIN
BLV_RF_W13_V04_20260114/StdPeriphDriver/libISP572.a
Normal file
Binary file not shown.
Reference in New Issue
Block a user