Drv_adc.c 3.2 KB

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