1 
2 
3 
4 #ifndef __CH57x_ADC_H__
5 #define __CH57x_ADC_H__
6 
7 #ifdef __cplusplus
8  extern "C" {
9 #endif
10 
11 #include "CH579SFR.h"
12 #include "core_cm0.h"
13 
14 
15 #define ROM_TMP_85C_ADDR    0x40634
16 #define ROM_TMP_25C_ADDR    0x40638
17 
18 
19 /**
20   * @brief  adc single channel define
21   */
22 typedef enum
23 {
24     CH_EXTIN_0 = 0,         // ADC 外部模拟通道 0
25     CH_EXTIN_1,             // ADC 外部模拟通道 1
26     CH_EXTIN_2,             // ADC 外部模拟通道 2
27     CH_EXTIN_3,             // ADC 外部模拟通道 3
28     CH_EXTIN_4,             // ADC 外部模拟通道 4
29     CH_EXTIN_5,             // ADC 外部模拟通道 5
30     CH_EXTIN_6,             // ADC 外部模拟通道 6
31     CH_EXTIN_7,             // ADC 外部模拟通道 7
32     CH_EXTIN_8,             // ADC 外部模拟通道 8
33     CH_EXTIN_9,             // ADC 外部模拟通道 9
34     CH_EXTIN_10,            // ADC 外部模拟通道 10
35     CH_EXTIN_11,            // ADC 外部模拟通道 11
36     CH_EXTIN_12,            // ADC 外部模拟通道 12
37     CH_EXTIN_13,            // ADC 外部模拟通道 13
38 
39     CH_INTE_VBAT,           // ADC 内部电池检测通道
40     CH_INTE_VTEMP,          // ADC 内部温度传感器检测通道
41 
42 }ADC_SingleChannelTypeDef;
43 
44 /**
45   * @brief  adc differential channel define
46   */
47 typedef enum
48 {
49     CH_DIFF_0_2 = 0,            // ADC 差分通道 #0-#2
50     CH_DIFF_1_3,                // ADC 差分通道 #1-#3
51 
52 }ADC_DiffChannelTypeDef;
53 
54 /**
55   * @brief  adc sampling clock
56   */
57 typedef enum
58 {
59     SampleFreq_3_2 = 0,         // 3.2M 采样频率
60     SampleFreq_2_67,            // 2.67M 采样频率
61     SampleFreq_5_33,            // 5.33M 采样频率
62     SampleFreq_4,               // 4M 采样频率
63 }ADC_SampClkTypeDef;
64 
65 
66 /**
67   * @brief  adc signal PGA
68   */
69 typedef enum
70 {
71     ADC_PGA_1_4 = 0,            // -12dB, 1/4倍
72     ADC_PGA_1_2,                // -6dB, 1/2倍
73     ADC_PGA_0,                  // 0dB, 1倍,无增益
74     ADC_PGA_2,                  // 6dB, 2倍
75 }ADC_SignalPGATypeDef;
76 
77 
78 // refer to ADC_SingleChannelTypeDef
79 #define     ADC_ChannelCfg( d )     (R8_ADC_CHANNEL = d)                                                /* 设置 ADC 采样通道 */
80 // refer to ADC_SampClkTypeDef
81 #define     ADC_SampClkCfg( d )     (R8_ADC_CFG=R8_ADC_CFG&(~RB_ADC_CLK_DIV)|(d<<6))                    /* 设置 ADC 采样时钟 */
82 // refer to ADC_SignalPGATypeDef
83 #define     ADC_PGACfg( d )         (R8_ADC_CFG=R8_ADC_CFG&(~RB_ADC_PGA_GAIN)|(d<<4))               /* 设置 ADC 信号增益 */
84 #define     ADC_TempCalibCfg( d )   (R8_TEM_SENSOR=R8_TEM_SENSOR&(~RB_TEM_SEN_CALIB)|d)             /* 设置内部温度传感器校准值 */
85 
86 void ADC_ExtSingleChSampInit( ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga );                     /* 外部信号单通道采样初始化 */
87 void ADC_ExtDiffChSampInit( ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga );                       /* 外部信号差分通道采样初始化 */
88 void TouchKey_ChSampInit( void );                                                                   /* 触摸按键通道采样初始化 */
89 void ADC_InterTSSampInit( void );                                                                   /* 内置温度传感器采样初始化 */
90 void ADC_InterBATSampInit( void );                                                                  /* 内置电池电压采样初始化 */
91 
92 UINT16 ADC_ExcutSingleConver( void );                                                               /* ADC执行单次转换 */
93 signed short ADC_DataCalib_Rough( void );
94 void ADC_DataCalib_Fine( PUINT16 dat, ADC_SignalPGATypeDef ga );
95 UINT16 TouchKey_ExcutSingleConver( UINT8 d );                                                       /* TouchKey转换后数据 */
96 int ADC_GetCurrentTS( UINT16 ts_v );                                                              /* 获取当前采样的温度值(℃) */
97 
98 #define ADC_ReadConverValue()       (R16_ADC_DATA)                                                  /* 读取转换后的数值 */
99 #define ADC_StartUp()               (R8_ADC_CONVERT = RB_ADC_START)                                 /* ADC启动转换 */
100 #define ADC_GetITStatus()           ( R8_ADC_INT_FLAG & RB_ADC_IF_EOC )                             /* 获取ADC转换完成标志 */
101 #define ADC_ClearITFlag()           (R8_ADC_CONVERT = 0)                                            /* 清除ADC转换完成标志 */
102 
103 #define TouchKey_GetITStatus()      ( R8_ADC_INT_FLAG & RB_ADC_IF_EOC )                             /* 获取TouchKey转换完成标志 */
104 #define TouchKey_ClearITFlag()      (R8_TKEY_CTRL |= RB_TKEY_PWR_ON)                                /* 清除TouchKey转换完成标志 */
105 
106 
107 #ifdef __cplusplus
108 }
109 #endif
110 
111 #endif  // __CH57x_ADC_H__
112 
113