[DemoCode下载] M031 操作24位模数转换器 NAU7802

[复制链接]
1527|8
 楼主| zhuotuzi 发表于 2023-2-10 09:45 | 显示全部楼层 |阅读模式
en-us--EC_M031_Read_NAU7802_V1.01.zip (1.41 MB, 下载次数: 15)
示例代码用于配置Nuvoton的NAU7802,然后从中读取ADC数据。NAU7802是一款双通道、24位模数转换器(ADC),可用于音频应用、电子平衡或工业控制。本文档介绍了引脚配置、输入通道配置、PGA增益配置、ADC校准、转换启动、读取数据等示例代码。
为了测试这个示例代码,可以使用一个可调电源作为NAU7802的输入源,其电压范围在-1.55到1.55伏之间。执行程序后,输出结果如下所示。
7944663e5a16da3e2d.png

操作过程如下所示
7773063e5a1860fc21.png

26863e5a18ff10c1.png

管脚配置
7165463e5a1aaed175.png

 楼主| zhuotuzi 发表于 2023-2-10 09:45 | 显示全部楼层
完整代码如下
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 5 $
  5. * $Date: 18/07/09 7:01p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Show how to use I2C interface to control NAU7802.
  7. * @note
  8. * SPDX-License-Identifier: Apache-2.0
  9. * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "NuMicro.h"

  13. /*------------------------------------------------------------------------------------------------*/
  14. /* Define                                                                                         */
  15. /*------------------------------------------------------------------------------------------------*/
  16. #define ADC_SLAVE_ADDR        0x2A

  17. /* Register address */
  18. #define PU_CTRL_ADDR          0x00
  19. #define CTRL1_ADDR            0x01
  20. #define CTRL2_ADDR            0x02
  21. #define OCAL1_B2_ADDR         0x03
  22. #define OCAL1_B1_ADDR         0x04
  23. #define OCAL1_B0_ADDR         0x05
  24. #define GCAL1_B3_ADDR         0x06
  25. #define GCAL1_B2_ADDR         0x07
  26. #define GCAL1_B1_ADDR         0x08
  27. #define GCAL1_B0_ADDR         0x09
  28. #define OCAL2_B2_ADDR         0x0A
  29. #define OCAL2_B1_ADDR         0x0B
  30. #define OCAL2_B0_ADDR         0x0C
  31. #define GCAL2_B3_ADDR         0x0D
  32. #define GCAL2_B2_ADDR         0x0E
  33. #define GCAL2_B1_ADDR         0x0F
  34. #define GCAL2_B0_ADDR         0x10
  35. #define I2C_CONTROL_ADDR      0x11
  36. #define ADCO_B2_ADDR          0x12
  37. #define ADCO_B1_ADDR          0x13
  38. #define ADCO_B0_ADDR          0x14
  39. #define OTP_B1_ADDR           0x15
  40. #define OTP_B0_ADDR           0x16
  41. #define PGA_PWR_ADDR          0x1B
  42. #define DEVICE_REVISION_ADDR  0x1F


  43. /* AVDD source select */
  44. #define AVDDS_Pos  (7)
  45. #define AVDDS_Msk  (1<<AVDDS_Pos)
  46. #define AVDDS_LDO  (1<<AVDDS_Pos)  /* Internal LDO */
  47. #define AVDDS_PIN  (0<<AVDDS_Pos)  /* AVDD pin input (default) */


  48. /* System clock source select */
  49. #define OSCS_Pos  (6)
  50. #define OSCS_Msk  (1<<OSCS_Pos)
  51. #define OSCS_EXT  (1<<OSCS_Pos)  /* External Crystal */
  52. #define OSCS_IRC  (0<<OSCS_Pos)  /* Internal RC oscillator (default) */

  53. /* Cycle ready (Read only Status) */
  54. #define CR_Pos       (5)
  55. #define CR_Msk       (1<<CR_Pos)
  56. #define CR_DATA_RDY  (1<<CR_Pos)  /* ADC DATA is ready */

  57. /* Cycle start */
  58. #define CS_Pos               (4)
  59. #define CS_Msk               (1<<CS_Pos)
  60. #define CS_START_CONVERSION  (1<<CS_Pos)  /* Synchronize conversion to the rising edge of this register */

  61. /* Power up ready (Read Only Status) */
  62. #define PUR_Pos         (3)
  63. #define PUR_Msk         (1<<PUR_Pos)
  64. #define PUR_POWER_UP    (1<<PUR_Pos)    /* Power Up ready */
  65. #define PUR_POWER_DOWN  (0<<PUR_Pos)    /* Power down, not ready */

  66. /* Power up analog circuit */
  67. #define PUA_Pos               (2)
  68. #define PUA_Msk               (1<<PUA_Pos)
  69. #define PUA_POWER_UP   (1<<PUA_Pos)    /* Power up the chip analog circuits (PUD must be 1) */
  70. #define PUA_POWER_DOWN (0<<PUA_Pos)    /* Power down (default) */

  71. /* Power up digital circuit */
  72. #define PUD_Pos                 (1)
  73. #define PUD_Msk                 (1<<PUD_Pos)
  74. #define PUD_POWER_UP     (1<<PUD_Pos)    /* Power up the chip digital logic */
  75. #define PUD_POWER_DOWN   (0<<PUD_Pos)    /* power down (default) */

  76. /* Register reset */
  77. #define RR_Pos    (0)
  78. #define RR_Msk    (1<<RR_Pos)
  79. #define RR_RESET  (1<<RR_Pos)  /* Register Reset, reset all register except RR */
  80. #define RR_NORMAL (0<<RR_Pos)  /* Normal Operation (default) */


  81. /* Conversion Ready Pin Polarity (16 Pin Package Only) */
  82. #define CRP_Pos         (7)
  83. #define CRP_Msk         (1<<CRP_Pos)
  84. #define CRP_ACTIVE_LOW  (1<<CRP_Pos)   /* CRDY pin is LOW Active (Ready when 0) */
  85. #define CRP_ACTIVE_HIGH (0<<CRP_Pos)   /* CRDY pin is High Active(Ready when 1) (default) */

  86. /* Select the function of DRDY pin */
  87. #define DRDY_SEL_Pos           (6)
  88. #define DRDY_SEL_Msk           (1<<DRDY_SEL_Pos)
  89. #define DRDY_SEL_OUTPUT_CLOCK  (1<<DRDY_SEL_Pos)       /* DRDY output the Buffered Crystal Clock if OSCS=1 */
  90. #define DRDY_SEL_OUTPUT_CONVERSION  (0<<DRDY_SEL_Pos)  /* DRDY output the conversion ready (default) */

  91. /* LDO Voltage */
  92. #define VLDO_Pos  (3)
  93. #define VLDO_Msk  (7<<VLDO_Pos)
  94. #define VLDO_2V4  (7<<VLDO_Pos)  /* 2.4v */
  95. #define VLDO_2V7  (6<<VLDO_Pos)  /* 2.7v */
  96. #define VLDO_3V0  (5<<VLDO_Pos)  /* 3.0v */
  97. #define VLDO_3V3  (4<<VLDO_Pos)  /* 3.3v */
  98. #define VLDO_3V6  (3<<VLDO_Pos)  /* 3.6v */
  99. #define VLDO_3V9  (2<<VLDO_Pos)  /* 3.9v */
  100. #define VLDO_4V2  (1<<VLDO_Pos)  /* 4.2v */
  101. #define VLDO_4V5  (0<<VLDO_Pos)  /* 4.5v (default) */

  102. /* Gain select */
  103. #define GAINS_Pos  (0)
  104. #define GAINS_Msk  (7<<GAINS_Pos)
  105. #define GAINS_128  (7<<GAINS_Pos)  /* x128 */
  106. #define GAINS_64   (6<<GAINS_Pos)  /* x64 */
  107. #define GAINS_32   (5<<GAINS_Pos)  /* x32 */
  108. #define GAINS_16   (4<<GAINS_Pos)  /* x16 */
  109. #define GAINS_8    (3<<GAINS_Pos)  /* x8 */
  110. #define GAINS_4    (2<<GAINS_Pos)  /* x4 */
  111. #define GAINS_2    (1<<GAINS_Pos)  /* x2 */
  112. #define GAINS_1    (0<<GAINS_Pos)  /* x1 (default) */

  113. /* Analog input channel select */
  114. #define CHS_Pos  (7)
  115. #define CHS_Msk  (1<<CHS_Pos)
  116. #define CHS_CH2  (1<<CHS_Pos)  /* 1 = Ch2 */
  117. #define CHS_CH1  (0<<CHS_Pos)  /* 0 = Ch1 (default) */

  118. /* Conversion rate select */
  119. #define CRS_Pos  (4)
  120. #define CRS_Msk  (7<<CRS_Pos)
  121. #define CRS_320  (7<<CRS_Pos)  /* 111 = 320SPS */
  122. #define CRS_80   (3<<CRS_Pos)  /* 011 = 80SPS */
  123. #define CRS_40   (2<<CRS_Pos)  /* 010 = 40SPS */
  124. #define CRS_20   (1<<CRS_Pos)  /* 001 = 20SPS */
  125. #define CRS_10   (0<<CRS_Pos)  /* 000 = 10SPS (default) */

  126. /* Read Only calibration result */
  127. #define CAL_ERR_Pos      (3)
  128. #define CAL_ERR_Msk      (1<<CAL_ERR_Pos)
  129. #define CAL_ERR_ERROR    (1<<CAL_ERR_Pos)  /* 1: there is error in this calibration */
  130. #define CAL_ERR_NO_ERROR (0<<CAL_ERR_Pos)  /* 0: there is no error */

  131. /* Write 1 to this bit will trigger calibration based on the selection in CALMOD[1:0] */
  132. /* This is an "Action" register bit. When calibration is finished, it will reset to 0 */
  133. #define CALS_Pos      (2)
  134. #define CALS_Msk      (1<<CALS_Pos)
  135. #define CALS_ACTION   (1<<CALS_Pos)
  136. #define CALS_FINISHED (0<<CALS_Pos)

  137. /* Calibration mode */
  138. #define CALMOD_Pos              (0)
  139. #define CALMOD_Msk              (3<<CALMOD_Pos)
  140. #define CALMOD_GAIN             (3<<CALMOD_Pos)  /* 11 = Gain Calibration System */
  141. #define CALMOD_OFFSET           (2<<CALMOD_Pos)  /* 10 = Offset Calibration System */
  142. #define CALMOD_ RESERVED        (1<<CALMOD_Pos)  /* 01 = Reserved */
  143. #define CALMOD_OFFSET_INTERNAL  (0<<CALMOD_Pos)  /* 00 = Offset Calibration Internal (default) */

  144. /* Enable bit for Pull SDA low when conversion complete and I2C IDLE(special non-standard I2C) 1 = enable 0 = disable (default) */
  145. #define CRSD_Pos            (7)
  146. #define CRSD_Msk            (1<<CRSD_Pos)
  147. #define CRSD_PULL_SDA_LOW   (1<<CRSD_Pos)
  148. #define CRSD_PULL_SDA_HIGH  (0<<CRSD_Pos)

  149. /* Enable bit for Fast Read ADC DATA (special non-standard I2C) 1 = enable fast read ADC Data special non-standard I2C */
  150. #define FRD_Pos                  (6)
  151. #define FRD_Msk                  (1<<FRD_Pos)
  152. #define FRD_FAST_READ_ENABLE     (1<<FRD_Pos)
  153. #define FRD_FAST_READ_DISENABLE  (0<<FRD_Pos) /* Disable fast read ADC Data feature(default) */

  154. /* Enable bit for Strong Pull Up for I2C SCLK and SDA */
  155. #define SPE_Pos                  (5)
  156. #define SPE_Msk                  (1<<SPE_Pos)
  157. #define SPE_STRONG_PULL_ENABLE   (1<<SPE_Pos)  /* enable strong pull up (nominal 1.6 k ohm) */
  158. #define SPE_STRONG_PULL_DISABLE  (0<<SPE_Pos)  /* disable strong pull up (default) */

  159. /* Disable bit for Weak Pull Up for I2C SCLK and SDA */
  160. #define WPD_Pos                (4)
  161. #define WPD_Msk                (1<<WPD_Pos)
  162. #define WPD_WEAK_PULL_DISABLE  (1<<WPD_Pos)  /* disable weak pull up */
  163. #define WPD_WEAK_PULL_ENABLE  (0<<WPD_Pos)   /* enable weak pull up (default nominal 50 k ohm) */

  164. /* Short the input together, measure offset */
  165. #define SI_Pos          (3)
  166. #define SI_Msk          (1<<SI_Pos)
  167. #define SI_SHORT_INPUT  (1<<SI_Pos)
  168. #define SI_OPEN_INPUT   (0<<SI_Pos)

  169. /* Enables the 2.5uA burnout current source to the PGA positive input when set to 1. */
  170. #define BOPGA_Pos          (2)
  171. #define BOPGA_Msk          (1<<BOPGA_Pos)
  172. #define BOPGA_CURRENT_EN   (1<<BOPGA_Pos)
  173. #define BOPGA_CURRENT_DIS  (0<<BOPGA_Pos)   /* 0: Disables the current source.(default) */

  174. /* Switches PGA input to temperature sensor when set to 1. */
  175. #define TS_Pos             (1)
  176. #define TS_Msk             (1<<TS_Pos)
  177. #define TS_TEMP_TO_PGA     (1<<TS_Pos)
  178. #define TS_TEMP_NO_TO_PGA  (0<<TS_Pos)   /* 0: Uses VINx as PGA input (default)*/

  179. /* Disables bandgap chopper when set to 1. */
  180. #define BGPCP_Pos                      (0)
  181. #define BGPCP_Msk                      (1<<BGPCP_Pos)
  182. #define BGPCP_BANDGAP_CHOPPER_DISABLE  (1<<BGPCP_Pos)  /* Disables bandgap chopper */
  183. #define BGPCP_BANDGAP_CHOPPER_ENABLE   (0<<BGPCP_Pos)  /* Enables the bandgap chopper.(default) */

  184. /* Read REG0x15 output select */
  185. #define RD_OTP_SEL_Pos  (7)
  186. #define RD_OTP_SEL_Msk  (1<<RD_OTP_SEL_Pos)
  187. #define RD_OTP_SEL_OTP  (1<<RD_OTP_SEL_Pos)  /* Read REG0x15 will read OTP[31:24] */
  188. #define RD_OTP_SEL_ADC  (0<<RD_OTP_SEL_Pos)  /* Read REG0x15 will read ADC Registers */

  189. /* LDOMODE */
  190. #define LDOMODE_Pos  (6)
  191. #define LDOMODE_Msk  (1<<LDOMODE_Pos)
  192. #define LDOMODE_LOW_DC  (1<<LDOMODE_Pos)   /* Improved stability and lower DC gain */
  193. #define LDOMODE_HIGH_DC  (0<<LDOMODE_Pos)  /* Improved accuracy and higher DC gain */

  194. /* PGA output buffer enable */
  195. #define PGA_OUTPUT_BUFFER_Pos  (5)
  196. #define PGA_OUTPUT_BUFFER_Msk  (1<<PGA_OUTPUT_BUFFER_Pos)
  197. #define PGA_OUTPUT_BUFFER_ENABLE  (1<<PGA_OUTPUT_BUFFER_Pos)   /* 1: PGA output buffer enable */
  198. #define PGA_OUTPUT_BUFFER_DISABLE  (0<<PGA_OUTPUT_BUFFER_Pos)  /* 0: PGA output buffer disable */

  199. /* PGA bypass enable */
  200. #define PGA_BYPASS_Pos  (4)
  201. #define PGA_BYPASS_Msk  (1<<PGA_BYPASS_Pos)
  202. #define PGA_BYPASS_ENABLE  (1<<PGA_BYPASS_Pos)   /* 1: PGA bypass enable */
  203. #define PGA_BYPASS_DISABLE  (0<<PGA_BYPASS_Pos)  /* 0: PGA bypass disable */
  204. /* 3 */
  205. /* PGAINV */
  206. #define PGAINV_Pos  (3)
  207. #define PGAINV_Msk  (1<<PGAINV_Pos)
  208. #define PGAINV_INVERT  (1<<PGAINV_Pos)  /* 1: invert PGA input phase */
  209. #define PGAINV_NORMAL  (0<<PGAINV_Pos)  /* 0: default */

  210. /* PGACHPDIS */
  211. #define PGACHPDIS_Pos  (0)
  212. #define PGACHPDIS_Msk  (1<<PGACHPDIS_Pos)
  213. #define PGACHPDIS_DISABLE  (1<<PGACHPDIS_Pos)  /* 1: Chopper disabled */
  214. #define PGACHPDIS_ENABLE  (0<<PGACHPDIS_Pos)   /* 0: default */

  215. /* Enables PGA output bypass capacitor connected across pins Vin2P Vin2N */
  216. #define PGA_CAP_EN_Pos (7)
  217. #define PGA_CAP_EN_Msk (1<<PGA_CAP_EN_Pos)
  218. #define PGA_CAP_EN_SET (1<<PGA_CAP_EN_Pos)
  219. #define PGA_CAP_EN_CLR  (0<<PGA_CAP_EN_Pos)

  220. /* Master bias Current */
  221. #define MASTER_BIAS_CURR_Pos  (4)
  222. #define MASTER_BIAS_CURR_Msk  (7<<MASTER_BIAS_CURR_Pos)
  223. #define MASTER_BIAS_CURR_100 (0<<MASTER_BIAS_CURR_Pos)  /* 100% (default) */
  224. #define MASTER_BIAS_CURR_90  (1<<MASTER_BIAS_CURR_Pos)  /* 90% (lower power & accuracy) */
  225. #define MASTER_BIAS_CURR_80  (2<<MASTER_BIAS_CURR_Pos)  /* 0 1 0 80% */
  226. #define MASTER_BIAS_CURR_73  (3<<MASTER_BIAS_CURR_Pos)  /* 0 1 1 73% */
  227. #define MASTER_BIAS_CURR_67  (4<<MASTER_BIAS_CURR_Pos)  /* 1 0 0 67% */
  228. #define MASTER_BIAS_CURR_62  (5<<MASTER_BIAS_CURR_Pos)  /* 1 0 1 62% */
  229. #define MASTER_BIAS_CURR_58  (6<<MASTER_BIAS_CURR_Pos)  /* 1 1 0 58% */
  230. #define MASTER_BIAS_CURR_54  (7<<MASTER_BIAS_CURR_Pos)  /* 1 1 1 54% */

  231. /* ADC Current */
  232. #define ADC_CURR_Pos  (2)
  233. #define ADC_CURR_Msk  (3<<ADC_CURR_Pos)
  234. #define ADC_CURR_100  (0<<ADC_CURR_Pos)     /* 0 0 100% of master bias */
  235. #define ADC_CURR_75  (1<<ADC_CURR_Pos)      /* 0 1 75%  of master bias */
  236. #define ADC_CURR_50  (2<<ADC_CURR_Pos)      /* 1 0 50%  of master bias */
  237. #define ADC_CURR_25  (3<<ADC_CURR_Pos)      /* 1 1 25%  of master bias */

  238. /* PGA Current */
  239. #define PGA_CURR_Pos  (0)
  240. #define PGA_CURR_Msk  (3<<PGA_CURR_Pos)
  241. #define PGA_CURR_100  (0<<PGA_CURR_Pos)  /* 0 0 100% of master bias (default) */
  242. #define PGA_CURR_95  (1<<PGA_CURR_Pos)   /* 0 1 95% of master bias (lower power & accuracy) */
  243. #define PGA_CURR_86  (2<<PGA_CURR_Pos)   /* 1 0 86% of master bias */
  244. #define PGA_CURR_70  (3<<PGA_CURR_Pos)   /* 1 1 70% of master bias */
  245. /*------------------------------------------------------------------------------------------------*/
  246. /* Global variables                                                                               */
  247. /*------------------------------------------------------------------------------------------------*/
  248. volatile uint8_t g_au8TxData[2];
  249. volatile uint8_t g_u8RxData;
  250. volatile uint8_t g_u8DataLen;
  251. volatile uint8_t g_u8EndFlag = 0;

  252. typedef void (*I2C_FUNC)(uint32_t u32Status);

  253. volatile static I2C_FUNC s_I2C0HandlerFn = NULL;

  254. /* ADC chip register read and write */
  255. uint8_t ADC_ReadReg(uint8_t u8RegAddr)
  256. {

  257.     uint8_t rdata = 0U;
  258.     rdata = I2C_ReadByteOneReg(I2C1, ADC_SLAVE_ADDR, u8RegAddr);
  259.     return rdata;
  260. }

  261. uint8_t ADC_WriteReg(uint8_t u8RegAddr, uint8_t data)
  262. {
  263.     uint8_t u8Err;
  264.     u8Err = I2C_WriteByteOneReg(I2C1, ADC_SLAVE_ADDR, u8RegAddr, data);
  265.     return u8Err;
  266. }

  267. /**
  268.   * @brief      ADC_Config
  269.   *
  270.   * @param[in]  ch      CHS_CH1 ch1
  271.   *                     CHS_CH2 ch2
  272.   * @param[in]  rate    Conversion rate select
  273.   *                                  CRS_320 = 320SPS
  274.   *                                  CRS_80 = 80SPS
  275.   *                                  CRS_40 = 40SPS
  276.   *                                  CRS_20 = 20SPS
  277.   *                                  CRS_10 = 10SPS (default)
  278.   * @param[in]  gain    Gain select
  279.   *                                  GAINS_128 = x128
  280.   *                                  GAINS_64 = x64
  281.   *                                  GAINS_32 = x32
  282.   *                                  GAINS_16 = x16
  283.   *                                  GAINS_8 = x8
  284.   *                                  GAINS_4 = x4
  285.   *                                  GAINS_2 = x2
  286.   *                                  GAINS_1 = x1 (default)
  287.   *
  288.   *
  289.   * @details
  290.   *
  291.   */
  292. void ADC_Config(uint8_t ch, uint8_t rate, uint8_t gain)
  293. {
  294.     uint8_t reg = 0;
  295.     /* Set channel and Conversion rate */
  296.     reg = ADC_ReadReg(CTRL2_ADDR);
  297.     reg &= ~(CHS_Msk | CRS_Msk);
  298.     reg |= (ch |   /* CHS: 0 = ch1,1 = ch2 */
  299.             rate); /* CRS: Sample rate can be set to 10, 20, 40, 80, or 320Hz */
  300.     ADC_WriteReg(CTRL2_ADDR, reg);

  301.     /* Set gain */
  302.     reg = ADC_ReadReg(CTRL1_ADDR);
  303.     reg &= ~(GAINS_Msk);
  304.     reg |= gain;  /* Gain can be set to 1, 2, 4, 8, 16, 32, 64, or 128. */

  305.     ADC_WriteReg(CTRL1_ADDR, reg);
  306. }

  307. void ADC_Calibration(void)
  308. {
  309.     uint8_t reg = 0;

  310.     while (1)
  311.     {

  312.         reg = ADC_ReadReg(CTRL2_ADDR);
  313.         reg &= ~(CALMOD_Msk | CALS_Msk);

  314.         /* Set Calibration mode */
  315.         reg |= CALMOD_OFFSET_INTERNAL;   /* Calibration mode = Internal Offset Calibration */
  316.         ADC_WriteReg(CTRL2_ADDR, reg);

  317.         /* Start calibration */
  318.         reg |= CALS_ACTION;              /* Start calibration */
  319.         ADC_WriteReg(CTRL2_ADDR, reg);

  320.         while (1)
  321.         {
  322.             /* Wait for calibration finish */
  323.             TIMER_Delay(TIMER0, 50000); /* Wait 50ms */

  324.             /* Read calibration result */
  325.             reg = ADC_ReadReg(CTRL2_ADDR);

  326.             if ((reg & CALS_Msk) == CALS_FINISHED)
  327.                 break;
  328.         }

  329.         reg &= CAL_ERR_Msk;

  330.         if ((reg & CAL_ERR_Msk) == 0) /* There is no error */
  331.             break;
  332.     }

  333.     TIMER_Delay(TIMER0, 1000);    /* Wait 1 ms */
  334. }

  335. void  ADCchip_Init(void)
  336. {
  337.     uint8_t reg = 0;

  338.     /* Reset */
  339.     reg =  RR_RESET;                   /* Enter reset mode */
  340.     ADC_WriteReg(PU_CTRL_ADDR, reg);

  341.     TIMER_Delay(TIMER0, 1000);         /* Wait 1 ms */
  342.     reg =  RR_NORMAL;                  /* Enter Noraml mode */
  343.     ADC_WriteReg(PU_CTRL_ADDR, reg);
  344.     TIMER_Delay(TIMER0, 1000);         /* Wait 1 ms */

  345.     /* Setting */
  346.     reg = (AVDDS_PIN | /* AVDD = external pin input */
  347.            OSCS_IRC);  /* Clock = Internal RC oscillator */
  348.     ADC_WriteReg(PU_CTRL_ADDR, reg);

  349.     reg = (CRP_ACTIVE_LOW |             /* DRDY = LOW Active */
  350.            DRDY_SEL_OUTPUT_CONVERSION | /* DRDY output = conversion ready */
  351.            VLDO_3V3 |                   /* LDO = 3.3V  (no use) */
  352.            GAINS_1);                    /* PGA = x1 */
  353.     ADC_WriteReg(CTRL1_ADDR, reg);

  354.     reg = (CHS_CH1 |   /* Input channel = CH1 */
  355.            CRS_10); /* Sample rate = 10SPS */
  356.     ADC_WriteReg(CTRL2_ADDR, reg);

  357.     reg = 0x30;
  358.     ADC_WriteReg(OTP_B1_ADDR, reg);


  359.     /* Power on */
  360.     reg = PUA_POWER_UP;  /* Power on analog circuits */
  361.     ADC_WriteReg(PU_CTRL_ADDR, reg);
  362.     TIMER_Delay(TIMER0, 1000);  /* Wait 1 ms */

  363.     reg |= PUD_POWER_UP; /* Power on digital circuits */
  364.     ADC_WriteReg(PU_CTRL_ADDR, reg);
  365.     TIMER_Delay(TIMER0, 500000);  /* Wait 500ms */

  366.     /* Calibration */
  367.     ADC_Calibration();
  368. }
  369. /**
  370.   * @brief      ADC_StartConversion
  371.   *
  372.   * @param[in]  none
  373.   * @details
  374.   *
  375.   */
  376. void ADC_StartConversion(void)
  377. {
  378.     uint8_t reg = 0;
  379.     /* Start conversion */
  380.     reg = ADC_ReadReg(PU_CTRL_ADDR);
  381.     reg |= CS_START_CONVERSION; /* CS=1 */
  382.     ADC_WriteReg(PU_CTRL_ADDR, reg);
  383. }

  384. uint32_t ADC_Read_Conversion_Data(void)
  385. {
  386.     uint8_t rdata[3];
  387.     uint32_t result;

  388.     I2C_ReadMultiBytesOneReg(I2C1, ADC_SLAVE_ADDR, ADCO_B2_ADDR, &rdata[0], 3);
  389.     result = ((rdata[0] << 16) | (rdata[1] << 8) | rdata[2]);
  390.     return result;
  391. }

  392. void SYS_Init(void)
  393. {
  394.     /*---------------------------------------------------------------------------------------------------------*/
  395.     /* Init System Clock                                                                                       */
  396.     /*---------------------------------------------------------------------------------------------------------*/

  397.     /* Unlock protected registers */
  398.     SYS_UnlockReg();

  399.     /* Enable HIRC clock (Internal RC 48MHz) */
  400.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  401.     /* Wait for HIRC clock ready */
  402.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  403.     /* Select HCLK clock source as HIRC and HCLK source divider as 1 */
  404.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  405.     /* Enable UART0 clock */
  406.     CLK_EnableModuleClock(UART0_MODULE);

  407.     /* Switch UART0 clock source to HIRC */
  408.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

  409.     /* Enable I2C1 clock */
  410.     CLK_EnableModuleClock(I2C1_MODULE);

  411.     /* Enable IP clock */
  412.     CLK_EnableModuleClock(TMR0_MODULE);

  413.     /* Select IP clock source */
  414.     CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HIRC, 0);

  415.     /* Update System Core Clock */
  416.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and cyclesPerUs automatically. */
  417.     SystemCoreClockUpdate();

  418.     /*---------------------------------------------------------------------------------------------------------*/
  419.     /* Init I/O Multi-function                                                                                 */
  420.     /*---------------------------------------------------------------------------------------------------------*/
  421.     /* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
  422.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
  423.                     (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

  424.     /* Set I2C1 multi-function pins */
  425.     SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB0MFP_Msk)) |
  426.                     (SYS_GPB_MFPL_PB0MFP_I2C1_SDA | SYS_GPB_MFPL_PB1MFP_I2C1_SCL);

  427.     /* Lock protected registers */
  428.     SYS_LockReg();
  429. }

  430. void I2C1_Close(void)
  431. {
  432.     /* Disable I2C1 interrupt and clear corresponding NVIC bit */
  433.     I2C_DisableInt(I2C1);
  434.     NVIC_DisableIRQ(I2C1_IRQn);

  435.     /* Disable I2C1 and close I2C1 clock */
  436.     I2C_Close(I2C1);
  437.     CLK_DisableModuleClock(I2C1_MODULE);
  438. }

  439. void I2C1_Init(void)
  440. {
  441.     /* Open I2C module and set bus clock */
  442.     I2C_Open(I2C1, 100000);

  443.     /* Get I2C1 Bus Clock */
  444.     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C1));
  445. }

  446. int main()
  447. {
  448.     uint32_t i;
  449.     uint32_t u32i32ConversionData;
  450.     int i32ConversionData;
  451.     SYS_Init();

  452.     /* Init UART0 to 115200-8n1 for print message */
  453.     UART_Open(UART0, 115200);

  454.     /*
  455.         This sample code sets I2C bus clock to 100kHz. Then, Set NAU7802, control NAU7802 to
  456.         complete ADC conversion, and read ADC conversion value.
  457.     */
  458.     printf("+-------------------------------------------------+\n");
  459.     printf("|    I2C Driver Sample Code with ADC NAU7802      |\n");
  460.     printf("+-------------------------------------------------+\n");
  461.     printf("I/O connection:\n");
  462.     printf("M031           NAU7802\n");
  463.     printf("PB.0 <--------> SDIO\n");
  464.     printf("PB.1 <--------> SCLK\n");
  465.     printf("ADC chip configuration:\n");
  466.     printf("Clock source    = IRC\n");
  467.     printf("AVDD source     = AVDD pin\n");
  468.     printf("Input channel   = CH1\n");
  469.     printf("VIN1P-VIN1N     = +/-0.5*(REFP-REFN)/PGA_Gain\n");
  470.     printf("PGA Gain        = 1\n");
  471.     printf("Conversion Rate = 10 SPS\n");
  472.     printf("+-------------------------------------------------+\n");

  473.     /* Init I2C1 to access ADC chip(NAU7802) */
  474.     I2C1_Init();

  475.     /* Init NAU7802 chip */
  476.     ADCchip_Init();

  477.     /* Start adc Conversion */
  478.     ADC_StartConversion();

  479.     while (1)
  480.     {
  481.         /* Wait ADC conversion done */
  482.         while ((ADC_ReadReg(PU_CTRL_ADDR)&CR_Msk) != CR_DATA_RDY);

  483.         /* Read Conversion data */
  484.         u32i32ConversionData = ADC_Read_Conversion_Data();

  485.         i32ConversionData = (int)(u32i32ConversionData << 8);
  486.         /* Shift the number back right to recover its intended magnitude */
  487.         i32ConversionData = (i32ConversionData >> 8);

  488.         /* REFP - REFN measured value = 3.14 v */
  489.         printf("input vol = VIN1P - VIN1N = %.2f\n", ((float)i32ConversionData / 16777216) * (float)(3.14));

  490.         for (i = 0; i < 0x5fffff; i++);
  491.     }
  492. }

  493. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/
tpgf 发表于 2023-3-1 15:46 | 显示全部楼层
这颗芯片是不是专门用于ad采集的芯片呢  24位够高的啊
nawu 发表于 2023-3-1 16:06 | 显示全部楼层
我觉得在使用这个芯片的时候还得注意外部电路的走线
aoyi 发表于 2023-3-1 16:16 | 显示全部楼层
随着采集位数的提高 相应的转换速度会降低吗
zljiu 发表于 2023-3-1 16:33 | 显示全部楼层
楼主有没有自己实测数据  采集精度能达到多少啊
gwsan 发表于 2023-3-1 16:45 | 显示全部楼层
看楼主代码 毛事使用的是循环等待方式 而不是中断方式是吗
tfqi 发表于 2023-3-1 16:57 | 显示全部楼层
转换数据上传使用的是iic的通讯方式吗?
AloneKaven 发表于 2023-3-1 19:27 | 显示全部楼层
位数增加了速度应该会降低吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

3375

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部