adc.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /**
  2. * @file adc.c
  3. * @author chipsea
  4. * @brief Contains all functions support for adc driver
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. #include <string.h>
  11. #include "error.h"
  12. #include "gpio.h"
  13. #include "pwrmgr.h"
  14. #include "clock.h"
  15. #include "adc.h"
  16. #include "log.h"
  17. #include "jump_function.h"
  18. #include "halPeripheral.h"
  19. typedef struct _adc_Contex_t
  20. {
  21. bool enable;
  22. uint8_t all_channel;
  23. uint8_t chs_en_shadow;
  24. bool continue_mode;
  25. //sysclk_t clk_src;
  26. uint16_t adc_cal_postive;
  27. uint16_t adc_cal_negtive;
  28. adc_Hdl_t evt_handler;
  29. } adc_Ctx_t;
  30. static adc_Ctx_t mAdc_Ctx =
  31. {
  32. .enable = FALSE,
  33. .all_channel = 0x00,
  34. .chs_en_shadow = 0x00,
  35. .continue_mode = FALSE,
  36. .adc_cal_postive = 0xFFF,
  37. .adc_cal_negtive = 0xFFF,
  38. .evt_handler = NULL
  39. };
  40. #define ADC_SAMPING_NUM 32
  41. #define ADC_MAX_OFFSET 64
  42. #define FILTER_SIZE 4
  43. uint16_t filter(uint32_t base,int ch,int n)
  44. {
  45. char count,j;
  46. int offset;
  47. uint16_t max ,min ;
  48. uint16_t value_buf[FILTER_SIZE];
  49. int sum=0;
  50. offset = n;
  51. for (count=0;count<FILTER_SIZE;count++)
  52. {
  53. value_buf[count ++]= (uint16_t)(read_reg(ADC_CH_BASE + (ch * 0x80) + ((base + offset)<<2))&0xfff);
  54. value_buf[count] = (uint16_t)((read_reg(ADC_CH_BASE + (ch * 0x80) + ((base + offset)<<2))>>16)&0xfff);
  55. offset ++;
  56. }
  57. max = value_buf[0];
  58. min = value_buf[0];
  59. sum = value_buf[0];
  60. for(j=1;j<FILTER_SIZE;j++)
  61. {
  62. max = (max > value_buf[j])? max : value_buf[j];
  63. min = (min > value_buf[j])? value_buf[j] : min ;
  64. sum += value_buf[j];
  65. }
  66. sum -= (max + min);
  67. return (uint16_t)(sum>>1);
  68. }
  69. /**
  70. * @fn HalAdcLoadCalibrationValue
  71. * @brief Read calibration values from Flash
  72. * @param none
  73. * @return none
  74. */
  75. static void HalAdcLoadCalibrationValue(void)
  76. {
  77. uint32_t adc_cal = read_reg(SPIF_RSVD1_ADC_CALIBRATE);
  78. mAdc_Ctx.adc_cal_negtive = (uint16_t)(adc_cal&0x0fff);
  79. mAdc_Ctx.adc_cal_postive = (uint16_t)((adc_cal>>16)&0x0fff);
  80. LOG("AD_CAL[%x %x]\n",mAdc_Ctx.adc_cal_negtive,mAdc_Ctx.adc_cal_postive);
  81. if((mAdc_Ctx.adc_cal_negtive < 0x733) || (mAdc_Ctx.adc_cal_negtive > 0x8cc) ||
  82. (mAdc_Ctx.adc_cal_postive < 0x733) || (mAdc_Ctx.adc_cal_postive > 0x8cc))
  83. {
  84. mAdc_Ctx.adc_cal_negtive = 0xfff;
  85. mAdc_Ctx.adc_cal_postive = 0xfff;
  86. LOG("->AD_CAL[%x %x]\n",mAdc_Ctx.adc_cal_negtive, mAdc_Ctx.adc_cal_postive);
  87. }
  88. }
  89. GpioPin_t s_pinmap[ADC_CH_NUM] = {
  90. GPIO_DUMMY, //ADC_CH0 =0,
  91. GPIO_DUMMY, //ADC_CH1 =1,
  92. P11, //ADC_CH1N =2,
  93. P23, //ADC_CH1P =3,
  94. P24, //ADC_CH2N =4,
  95. P14, //ADC_CH2P =5,
  96. P15, //ADC_CH3N =6,
  97. P20, //ADC_CH3P =7,
  98. GPIO_DUMMY, //ADC_CH_VOICE =8,
  99. };
  100. /**
  101. * @fn SetSamplingResolution
  102. * @brief Set the sampling resolution
  103. * @param channel
  104. * @param is_high_resolution
  105. * @param is_differential_mode
  106. * @return none
  107. */
  108. static void SetSamplingResolution(AdcChannel_t channel, bool is_high_resolution)
  109. {
  110. uint8_t aio = 0;
  111. switch(channel)
  112. {
  113. case ADC_CH1N_P11:
  114. aio = 0;
  115. break;
  116. case ADC_CH1P_P23:
  117. aio = 1;
  118. break;
  119. case ADC_CH2N_P24:
  120. aio = 2;
  121. break;
  122. case ADC_CH2P_P14:
  123. aio = 3;
  124. break;
  125. case ADC_CH3N_P15:
  126. aio = 4;
  127. break;
  128. case ADC_CH3P_P20:
  129. aio = 7;
  130. break;
  131. default:
  132. return;
  133. }
  134. if(is_high_resolution)
  135. {
  136. subWriteReg(&(AP_AON->PMCTL2_1),(aio+8),(aio+8),0);
  137. subWriteReg(&(AP_AON->PMCTL2_1),aio,aio,1);
  138. }
  139. else
  140. {
  141. subWriteReg(&(AP_AON->PMCTL2_1),(aio+8),(aio+8),1);
  142. subWriteReg(&(AP_AON->PMCTL2_1),aio,aio,0);
  143. }
  144. }
  145. /**
  146. * @fn SetSamplingResolutionAuto
  147. * @brief Set the automatic sampling resolution
  148. * @param channel
  149. * @param is_high_resolution
  150. * @param is_differential_mode
  151. * @return none
  152. */
  153. static void SetSamplingResolutionAuto(uint8_t channel, uint8_t is_high_resolution)
  154. {
  155. uint8_t i_channel;
  156. AdcChannel_t a_channel;
  157. AP_AON->PMCTL2_1 = 0x00;
  158. for(i_channel =MIN_ADC_CH;i_channel<=MAX_ADC_CH;i_channel++)
  159. {
  160. if(channel & BIT(i_channel))
  161. {
  162. a_channel = (AdcChannel_t)i_channel;
  163. SetSamplingResolution(a_channel,
  164. (is_high_resolution & BIT(i_channel)));
  165. }
  166. }
  167. }
  168. /**
  169. * @fn DisableAnalogPin
  170. * @brief disable analog pin
  171. * @param channel
  172. * @return none
  173. */
  174. static void DisableAnalogPin(AdcChannel_t channel)
  175. {
  176. int index = (int)channel;
  177. GpioPin_t pin = s_pinmap[index];
  178. if(pin == GPIO_DUMMY)
  179. return;
  180. HalGpioAnalogConfig(pin,Bit_DISABLE);
  181. HalGpioPinInit(pin,GPIO_INPUT); //ie=0,oen=1 set to imput
  182. HalGpioPupdConfig(pin,GPIO_FLOATING); //
  183. }
  184. /**
  185. * @fn ClearAdcConfig
  186. * @brief Clear configuration
  187. * @param none
  188. * @return none
  189. */
  190. static void ClearAdcConfig(void)
  191. {
  192. mAdc_Ctx.all_channel = 0x00;
  193. mAdc_Ctx.chs_en_shadow = 0x00;
  194. mAdc_Ctx.continue_mode = FALSE;
  195. mAdc_Ctx.evt_handler = NULL;
  196. }
  197. /**
  198. * @fn HalAdcIRQHandler
  199. * @brief This function process for adc interrupt
  200. * @param none
  201. * @return none
  202. */
  203. volatile int flag = 0;
  204. void __attribute__((used)) HalAdcIRQHandler(void)
  205. {
  206. int ch,status,ch2,n;
  207. uint16_t adc_data[MAX_ADC_SAMPLE_SIZE];
  208. status = GET_IRQ_STATUS;
  209. uint32_t adc_pointer;
  210. uint8_t filter_count =0;
  211. for (ch = MIN_ADC_CH; ch <= MAX_ADC_CH; ch++)
  212. {
  213. if((mAdc_Ctx.all_channel & BIT(ch)) &&(status & BIT(ch)))
  214. {
  215. ch2=(ch%2)?(ch-1):(ch+1);
  216. if(mAdc_Ctx.continue_mode == FALSE)
  217. {
  218. AP_ADCC->intr_mask &= ~ BIT(ch); //MASK coresponding channel
  219. mAdc_Ctx.all_channel &= ~BIT(ch);//disable channel
  220. }
  221. if (status & BIT(ch))
  222. {
  223. AP_ADCC->intr_mask &= ~BIT(ch);
  224. switch(ch)
  225. {
  226. case ADC_CH0:
  227. adc_pointer = ADC_CH1_POINTER;
  228. break;
  229. case ADC_CH1:
  230. adc_pointer = ADC_CH2_POINTER;
  231. break;
  232. case ADC_CH2:
  233. adc_pointer = ADC_CH3_POINTER;
  234. break;
  235. case ADC_CH3:
  236. adc_pointer = ADC_CH4_POINTER;
  237. break;
  238. case ADC_CH4:
  239. adc_pointer = ADC_CH5_POINTER;
  240. break;
  241. case ADC_CH9:
  242. adc_pointer = ADC_CH6_POINTER;
  243. break;
  244. default:
  245. break;
  246. }
  247. if(adc_pointer <= 0 || adc_pointer > ADC_MAX_OFFSET)
  248. {
  249. adc_pointer = ADC_SAMPING_NUM ;
  250. }
  251. else if(adc_pointer < ADC_SAMPING_NUM)
  252. {
  253. adc_pointer += ADC_MAX_OFFSET;
  254. adc_pointer -= ADC_SAMPING_NUM;
  255. }else{
  256. adc_pointer -= ADC_SAMPING_NUM;
  257. }
  258. adc_pointer = adc_pointer >>1;
  259. filter_count =0;
  260. for (n = 0; n < (MAX_ADC_SAMPLE_SIZE>>2); n++)
  261. {
  262. adc_data[n] = filter(adc_pointer,ch,filter_count);
  263. filter_count +=2;
  264. if((adc_pointer + filter_count) > ADC_MAX_OFFSET )
  265. {
  266. adc_pointer =0;
  267. filter_count =0;
  268. }
  269. }
  270. AP_ADCC->intr_clear = BIT(ch);
  271. if(mAdc_Ctx.enable == FALSE)
  272. continue;
  273. if (mAdc_Ctx.evt_handler){
  274. AdcEvt_t evt;
  275. evt.type = HAL_ADC_EVT_DATA;
  276. evt.ch = (AdcChannel_t)ch2;
  277. evt.data = adc_data;
  278. evt.size = (MAX_ADC_SAMPLE_SIZE) >> 2;
  279. mAdc_Ctx.evt_handler(&evt);
  280. }
  281. AP_ADCC->intr_mask |= BIT(ch);
  282. }
  283. }
  284. }
  285. if((mAdc_Ctx.all_channel == 0) && (mAdc_Ctx.continue_mode == FALSE))//
  286. {
  287. HalAdcStop();
  288. }
  289. }
  290. /**
  291. * @fn AdcWakeupHdl
  292. * @brief Set the ADC interrupt priority
  293. * @param none
  294. * @return none
  295. */
  296. static void AdcWakeupHdl(void)
  297. {
  298. NVIC_SetPriority((IRQn_Type)ADCC_IRQn, IRQ_PRIO_HAL);
  299. }
  300. /**
  301. * @fn HalAdcInit
  302. * @brief This function process for adc initial
  303. * @param none
  304. * @return none
  305. * @note mode: adc sample mode select;1:SAM_MANNUAL(mannual mode),0:SAM_AUTO(auto mode)
  306. * ADC_CH_e adc_pin: adc pin select;ADC_CH0~ADC_CH7 and ADC_CH_VOICE
  307. * ADC_SEMODE_e semode: signle-ended mode negative side enable; 1:SINGLE_END(single-ended mode) 0:DIFF(Differentail mode)
  308. * IO_CONTROL_e amplitude: input signal amplitude, 0:BELOW_1V,1:UP_1V
  309. */
  310. void HalAdcInit(void) {
  311. hal_pwrmgr_register(MOD_ADCC,NULL,AdcWakeupHdl);
  312. ClearAdcConfig();
  313. HalAdcLoadCalibrationValue();
  314. mAdc_Ctx.enable = TRUE;
  315. }
  316. /**
  317. * @fn HalAdcClockConfig
  318. * @brief This function process for adc clock
  319. * @param clk - clock
  320. * @return none
  321. */
  322. int HalAdcClockConfig(AdcClockSel_t clk){
  323. if(mAdc_Ctx.enable == FALSE){
  324. return ERR_NOT_REGISTED;
  325. }
  326. if(clk > HAL_ADC_CLOCK_320K)
  327. {
  328. return ERR_INVALID_PARAM;
  329. }
  330. subWriteReg(0x4000F000 + 0x7c,2,1,clk);
  331. return SUCCESS;
  332. }
  333. /**
  334. * @fn HalAdcStart
  335. * @brief start
  336. * @param none
  337. * @return none
  338. */
  339. int HalAdcStart(void)
  340. {
  341. uint8_t all_channel2 = (((mAdc_Ctx.chs_en_shadow&0x80)>>1)|\
  342. ((mAdc_Ctx.chs_en_shadow&0x40)<<1)|\
  343. ((mAdc_Ctx.chs_en_shadow&0x20)>>1)|\
  344. ((mAdc_Ctx.chs_en_shadow&0x10)<<1)|\
  345. ((mAdc_Ctx.chs_en_shadow&0x08)>>1)|\
  346. ((mAdc_Ctx.chs_en_shadow&0x04)<<1));
  347. if(mAdc_Ctx.enable == FALSE){
  348. return ERR_NOT_REGISTED;
  349. }
  350. hal_pwrmgr_lock(MOD_ADCC);
  351. JUMP_FUNCTION(ADCC_IRQ_HANDLER) = (uint32_t)&HalAdcIRQHandler;
  352. //ENABLE_ADC;
  353. for(int i=MIN_ADC_CH; i<=MAX_ADC_CH; i++)
  354. {
  355. if(all_channel2 & (BIT(i)))
  356. {
  357. switch (i)
  358. {
  359. case ADC_CH1N_P11:
  360. AP_PCRM->ADC_CTL1 |= BIT(20);
  361. break;
  362. case ADC_CH1P_P23:
  363. AP_PCRM->ADC_CTL1 |= BIT(4);
  364. break;
  365. case ADC_CH2N_P24:
  366. AP_PCRM->ADC_CTL2 |= BIT(20);
  367. break;
  368. case ADC_CH2P_P14:
  369. AP_PCRM->ADC_CTL2 |= BIT(4);
  370. break;
  371. case ADC_CH3N_P15:
  372. AP_PCRM->ADC_CTL3 |= BIT(20);
  373. break;
  374. case ADC_CH3P_P20:
  375. AP_PCRM->ADC_CTL3 |= BIT(4);
  376. break;
  377. }
  378. }
  379. }
  380. AP_PCRM->ANA_CTL |= BIT(3);
  381. AP_PCRM->ANA_CTL |= BIT(0);//new
  382. //ADC_IRQ_ENABLE;
  383. NVIC_EnableIRQ((IRQn_Type)ADCC_IRQn);
  384. //ENABLE_ADC_INT;
  385. AP_ADCC->intr_mask = mAdc_Ctx.all_channel;
  386. //disableSleep();
  387. return SUCCESS;
  388. }
  389. /**
  390. * @fn HalAdcChannelConfig
  391. * @brief adc channel config
  392. * @param clk - clock
  393. * @return none
  394. */
  395. int HalAdcChannelConfig(AdcCfg_t cfg, adc_Hdl_t evt_handler)
  396. {
  397. uint8_t i;
  398. if(mAdc_Ctx.enable == FALSE)
  399. {
  400. return ERR_NOT_REGISTED;
  401. }
  402. if(evt_handler == NULL)
  403. {
  404. return ERR_INVALID_PARAM;
  405. }
  406. if((cfg.channel_flag & BIT(0)) || (cfg.channel_flag & BIT(1)))
  407. {
  408. return ERR_NOT_SUPPORTED;
  409. }
  410. ClearAdcConfig();
  411. AP_AON->PMCTL2_1 = 0x00;
  412. AP_PCRM->ANA_CTL &= ~BIT(0);
  413. AP_PCRM->ANA_CTL &= ~BIT(3);
  414. hal_clk_gate_disable(MOD_ADCC);
  415. hal_clk_reset(MOD_ADCC);
  416. mAdc_Ctx.continue_mode = cfg.is_continue_mode;
  417. mAdc_Ctx.all_channel = cfg.channel_flag & 0x03;
  418. for(i=2;i<8;i++){
  419. if(cfg.channel_flag & BIT(i)){
  420. if(i%2){
  421. mAdc_Ctx.all_channel |= BIT(i-1);
  422. }
  423. else{
  424. mAdc_Ctx.all_channel |= BIT(i+1);
  425. }
  426. }
  427. }
  428. mAdc_Ctx.chs_en_shadow = mAdc_Ctx.all_channel;
  429. if((AP_PCR->SW_CLK & BIT(MOD_ADCC)) == 0)
  430. {
  431. hal_clk_gate_enable(MOD_ADCC);
  432. }
  433. //CLK_1P28M_ENABLE;
  434. AP_PCRM->CLKSEL |= BIT(6);
  435. //ENABLE_XTAL_OUTPUT; //enable xtal 16M output,generate the 32M dll clock
  436. AP_PCRM->CLKHF_CTL0 |= BIT(18);
  437. //ENABLE_DLL; //enable DLL
  438. AP_PCRM->CLKHF_CTL1 |= BIT(7);
  439. //ADC_DBLE_CLOCK_DISABLE; //disable double 32M clock,we are now use 32M clock,should enable bit<13>, diable bit<21>
  440. AP_PCRM->CLKHF_CTL1 &= ~BIT(21);//check
  441. //subWriteReg(0x4000F044,21,20,3);
  442. //ADC_CLOCK_ENABLE; //adc clock enbale,always use clk_32M
  443. AP_PCRM->CLKHF_CTL1 |= BIT(13);
  444. //subWriteReg(0x4000f07c,4,4,1); //set adc mode,1:mannual,0:auto mode
  445. AP_PCRM->ADC_CTL4 |= BIT(4);
  446. // AP_PCRM->ADC_CTL4 |= BIT(3);
  447. AP_PCRM->ADC_CTL4 |= BIT(0);
  448. // AP_PCRM->ADC_CTL4 &= ~BIT(3);
  449. SetSamplingResolutionAuto(cfg.channel_flag, cfg.is_high_resolution);
  450. AP_PCRM->ADC_CTL0 &= ~BIT(20);
  451. AP_PCRM->ADC_CTL0 &= ~BIT(4);
  452. AP_PCRM->ADC_CTL1 &= ~BIT(20);
  453. AP_PCRM->ADC_CTL1 &= ~BIT(4);
  454. AP_PCRM->ADC_CTL2 &= ~BIT(20);
  455. AP_PCRM->ADC_CTL2 &= ~BIT(4);
  456. AP_PCRM->ADC_CTL3 &= ~BIT(20);
  457. AP_PCRM->ADC_CTL3 &= ~BIT(4);
  458. AP_PCRM->ANA_CTL &= ~BIT(23);//disable micbias
  459. AP_PCRM->ADC_CTL4 &= ~BIT(4); //enable auto mode
  460. mAdc_Ctx.evt_handler = evt_handler;
  461. for(i=MIN_ADC_CH;i<=MAX_ADC_CH;i++){
  462. if(cfg.channel_flag & BIT(i)){
  463. GpioPin_t pin = s_pinmap[i];
  464. HalGpioPupdConfig(pin,GPIO_FLOATING);
  465. HalGpioDsControl(pin, Bit_ENABLE);
  466. HalGpioAnalogConfig(pin, Bit_ENABLE);
  467. switch (i)
  468. {
  469. case 0:
  470. // AP_PCRM->ADC_CTL0 |= BIT(20);
  471. break;
  472. case 1:
  473. // AP_PCRM->ADC_CTL0 |= BIT(4);
  474. AP_ADCC->compare_cfg[0] = (ADC_SAMPING_NUM<<24);
  475. break;
  476. case 2:
  477. // AP_PCRM->ADC_CTL1 |= BIT(20);
  478. AP_ADCC->compare_cfg[1] = (ADC_SAMPING_NUM<<24);
  479. break;
  480. case 3:
  481. // AP_PCRM->ADC_CTL1 |= BIT(4);
  482. AP_ADCC->compare_cfg[2] = (ADC_SAMPING_NUM<<24);
  483. break;
  484. case 4:
  485. // AP_PCRM->ADC_CTL2 |= BIT(20);
  486. AP_ADCC->compare_cfg[3] = (ADC_SAMPING_NUM<<24);
  487. break;
  488. case 5:
  489. // AP_PCRM->ADC_CTL2 |= BIT(4);
  490. AP_ADCC->compare_cfg[4] = (ADC_SAMPING_NUM<<24);
  491. break;
  492. case 6:
  493. // AP_PCRM->ADC_CTL3 |= BIT(20);
  494. AP_ADCC->compare_cfg[5] = (ADC_SAMPING_NUM<<24);
  495. break;
  496. case 7:
  497. // AP_PCRM->ADC_CTL3 |= BIT(4);
  498. AP_ADCC->compare_cfg[6] = (ADC_SAMPING_NUM<<24);
  499. break;
  500. default:
  501. break;
  502. }
  503. }
  504. }
  505. return SUCCESS;
  506. }
  507. /**
  508. * @fn HalAdcStop
  509. * @brief stop
  510. * @param none
  511. * @return none
  512. */
  513. int HalAdcStop(void)
  514. {
  515. int i;
  516. uint8_t all_channel2 = (((mAdc_Ctx.chs_en_shadow&0x80)>>1)|\
  517. ((mAdc_Ctx.chs_en_shadow&0x40)<<1)|\
  518. ((mAdc_Ctx.chs_en_shadow&0x20)>>1)|\
  519. ((mAdc_Ctx.chs_en_shadow&0x10)<<1)|\
  520. ((mAdc_Ctx.chs_en_shadow&0x08)>>1)|\
  521. ((mAdc_Ctx.chs_en_shadow&0x04)<<1));
  522. if(mAdc_Ctx.enable == FALSE)
  523. {
  524. return ERR_NOT_REGISTED;
  525. }
  526. //MASK_ADC_INT;
  527. AP_ADCC->intr_mask = 0x1ff;
  528. NVIC_DisableIRQ((IRQn_Type)ADCC_IRQn);
  529. JUMP_FUNCTION(ADCC_IRQ_HANDLER) = 0;
  530. AP_ADCC->intr_clear = 0x1FF;
  531. //DISABLE_ADC;
  532. AP_PCRM->ANA_CTL &= ~BIT(3);
  533. //ADC_CLOCK_DISABLE;
  534. // if(g_system_clk != SYS_CLK_DBL_32M)
  535. // {
  536. AP_PCRM->CLKHF_CTL1 &= ~BIT(13);
  537. // }
  538. for(i =MIN_ADC_CH; i<= MAX_ADC_CH; i++){
  539. if(all_channel2 & BIT(i)){
  540. DisableAnalogPin((AdcChannel_t)i);
  541. }
  542. }
  543. AP_PCRM->ANA_CTL &= ~BIT(0);//Power down analog LDO
  544. hal_clk_reset(MOD_ADCC);
  545. hal_clk_gate_disable(MOD_ADCC);
  546. ClearAdcConfig();
  547. //enableSleep();
  548. hal_pwrmgr_unlock(MOD_ADCC);
  549. return SUCCESS;
  550. }
  551. const unsigned int adc_Lambda[MAX_ADC_CH - MIN_ADC_CH + 1] =
  552. {
  553. 4519,//P11
  554. 4308,//P23
  555. 4263,//P24
  556. 4482,//P14
  557. 4180,//P15
  558. 4072,//P20
  559. };
  560. /**
  561. * @fn HalAdcValueCal
  562. * @brief This function calibration ADC results
  563. * @param
  564. * @return none
  565. */
  566. int32_t HalAdcValueCal(AdcChannel_t ch,uint16_t* buf, uint32_t size, uint8_t high_resol)
  567. {
  568. uint32_t i;
  569. int adc_sum = 0;
  570. volatile int32_t result = 0;
  571. uint16_t adc_cal_postive = mAdc_Ctx.adc_cal_postive;
  572. uint16_t adc_cal_negtive = mAdc_Ctx.adc_cal_negtive;
  573. if(ch< MIN_ADC_CH || ch > MAX_ADC_CH)
  574. {
  575. return ERR_INVALID_PARAM;
  576. }
  577. for (i = 0; i < size; i++) {
  578. adc_sum += (buf[i]&0xfff);
  579. }
  580. HalAdcLoadCalibrationValue();
  581. result = adc_sum/size;
  582. if((adc_cal_postive!=0xfff)&&(adc_cal_negtive!=0xfff)){
  583. int delta = ((int)(adc_cal_postive-adc_cal_negtive))>>1;
  584. if(ch&0x01)
  585. {
  586. result = ((result-delta)*1000 /(adc_cal_postive+adc_cal_negtive));
  587. }
  588. else
  589. {
  590. result = ((result+delta)*1000 /(adc_cal_postive+adc_cal_negtive));
  591. }
  592. }
  593. else
  594. {
  595. result = ((result*1000) >>12);
  596. }
  597. if(high_resol == TRUE)
  598. {
  599. result = result*8/10;
  600. }
  601. else
  602. {
  603. result = result*adc_Lambda[ch-2]*8/10000;
  604. }
  605. return result;
  606. }