Drv_adc.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "Drv_adc.h"
  2. #include "system.h"
  3. //#define DEBUG_ADC
  4. /**
  5. * @brief calculate voltage ,acording reference value and reference voltage
  6. * @param result : adc result
  7. * vol_high_ref : high voltage reference value
  8. * vol_low_ref : low voltage reference value
  9. * vol_high : high reference voltage (mV)
  10. * vol_low : low reference voltage
  11. * @retval voltage (mV)
  12. */
  13. static int calculate_voltage(int result, int vol_high_ref,int vol_low_ref , int vol_high, int vol_low)
  14. {
  15. int64_t rega = result*1000 - vol_low_ref;
  16. int regb = vol_high_ref - vol_low_ref;
  17. int regc = vol_high - vol_low;
  18. int temp = (rega *regc)/regb +vol_low;
  19. #ifdef DEBUG_ADC
  20. MyPrintf("rega*regc=%d\r\n",(rega*regc));
  21. MyPrintf("rega=%x\r\n",rega);
  22. MyPrintf("regb=%d\r\n",regb);
  23. MyPrintf("regc=%d\r\n",regc);
  24. MyPrintf("temp=%d\r\n",temp);
  25. #endif
  26. return temp;
  27. }
  28. void ADC_Init(ADC_InitTypeDef *ADC_InitStruct)
  29. {
  30. _ASSERT(IS_ADC_CHANNEL(ADC_InitStruct->ADC_Channel));
  31. _ASSERT(IS_ADC_MODE(ADC_InitStruct->ADC_Mode));
  32. HWRITE(RF_ADC_MODE , 0x8f|(ADC_InitStruct->ADC_Mode)<<4);
  33. HWRITE(RFEN_ADC,0x7c);// adc_enable
  34. HWRITE(RF_ADC_GC, 0xaa);
  35. HWRITE(RF_ADC_CH, 0x30|ADC_InitStruct->ADC_Channel);
  36. HWRITE(CORE_SUM_EN,0x80);// ADC_SUM_EN
  37. }
  38. uint16_t ADC_GetResult(ADC_ChxTypeDef ADC_Channel)
  39. {
  40. int nop=WAIT_TIME;
  41. HWRITE(RFEN_ADC,0x7c);// adc_enable
  42. HWRITE(RF_ADC_GC, 0xaa);
  43. HWRITE(RF_ADC_CH, 0x30|ADC_Channel);
  44. HWRITE(CORE_SUM_EN,0x80);// ADC_SUM_EN
  45. while(nop--);
  46. return HREADW(CORE_SUMDATA);
  47. }
  48. int ADC_GetVoltage(ADC_ChxTypeDef ADC_Channel)
  49. {
  50. int result = 0;
  51. int i = 0,j = 0;
  52. int voltage_low = 500;
  53. int voltage_high = 1000;
  54. int reg_voltage_low = 0;
  55. int ref_voltage_high = 0;
  56. uint8_t getmode = ( HREAD(RF_ADC_MODE) & 0x70) >> 4;
  57. uint8_t data[14]={0};
  58. read_otp_data(OTP_ADC_IO_0_5V_ADDR,data,14);
  59. // if((HREADW(OTP_ADC_FLAG_REG))!=OTP_ADC_FLAG) return -1;
  60. if (((data[13]<<8) |data[12])!= OTP_ADC_FLAG) return -1;
  61. switch(getmode)
  62. {
  63. case ADC_GPIO:
  64. // reg_voltage_low=(HREADW(GPIO_LOW_REF_REG))*1000;
  65. // ref_voltage_high=(HREADW(GPIO_HIGH_REF_REG))*1000;
  66. reg_voltage_low=((data[1]<<8) | data[0])*1000;
  67. ref_voltage_high=((data[7]<<8) | data[6])*1000;
  68. voltage_low = GPIO_LOW_VOLTAGE_REF;
  69. voltage_high = GPIO_HIGH_VOLTAGE_REF;
  70. break;
  71. case ADC_HVIN:
  72. // reg_voltage_low=(HREADW(HVIN_LOW_REF_REG))*1000;
  73. // ref_voltage_high=(HREADW(HVIN_HIGH_REF_REG))*1000;
  74. reg_voltage_low=((data[3]<<8) | data[2])*1000;
  75. ref_voltage_high=((data[9]<<8) | data[8])*1000;
  76. voltage_low = HVIN_LOW_VOLTAGE_REF;
  77. voltage_high = HVIN_HIGH_VOLTAGE_REF;
  78. break;
  79. case ADC_VINLPM:
  80. // reg_voltage_low=(HREADW(VINLPM_LOW_REF_REG))*1000;
  81. // ref_voltage_high=(HREADW(VINLPM_HIGH_REF_REG))*1000;
  82. reg_voltage_low=((data[5]<<8) | data[4])*1000;
  83. ref_voltage_high=((data[11]<<8) | data[10])*1000;
  84. voltage_low = VINLPM_LOW_VOLTAGE_REF;
  85. voltage_high = VINLPM_HIGH_VOLTAGE_REF;
  86. break;
  87. default:
  88. return -1;
  89. }
  90. if (reg_voltage_low == 0 || ref_voltage_high == 0)
  91. return -1;
  92. result = ADC_GetResult(ADC_Channel);
  93. #ifdef DEBUG_ADC
  94. MyPrintf("result=%x\r\n",result);
  95. #endif
  96. return calculate_voltage(result, ref_voltage_high, reg_voltage_low, voltage_high, voltage_low);
  97. }