打印
[DemoCode下载]

M031 操作24位模数转换器 NAU7802

[复制链接]
406|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
en-us--EC_M031_Read_NAU7802_V1.01.zip (1.41 MB)
示例代码用于配置Nuvoton的NAU7802,然后从中读取ADC数据。NAU7802是一款双通道、24位模数转换器(ADC),可用于音频应用、电子平衡或工业控制。本文档介绍了引脚配置、输入通道配置、PGA增益配置、ADC校准、转换启动、读取数据等示例代码。
为了测试这个示例代码,可以使用一个可调电源作为NAU7802的输入源,其电压范围在-1.55到1.55伏之间。执行程序后,输出结果如下所示。


操作过程如下所示




管脚配置


使用特权

评论回复
沙发
zhuotuzi|  楼主 | 2023-2-10 09:45 | 只看该作者
完整代码如下
/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 5 $
* $Date: 18/07/09 7:01p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Show how to use I2C interface to control NAU7802.
* @note
* SPDX-License-Identifier: Apache-2.0
* Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "NuMicro.h"

/*------------------------------------------------------------------------------------------------*/
/* Define                                                                                         */
/*------------------------------------------------------------------------------------------------*/
#define ADC_SLAVE_ADDR        0x2A

/* Register address */
#define PU_CTRL_ADDR          0x00
#define CTRL1_ADDR            0x01
#define CTRL2_ADDR            0x02
#define OCAL1_B2_ADDR         0x03
#define OCAL1_B1_ADDR         0x04
#define OCAL1_B0_ADDR         0x05
#define GCAL1_B3_ADDR         0x06
#define GCAL1_B2_ADDR         0x07
#define GCAL1_B1_ADDR         0x08
#define GCAL1_B0_ADDR         0x09
#define OCAL2_B2_ADDR         0x0A
#define OCAL2_B1_ADDR         0x0B
#define OCAL2_B0_ADDR         0x0C
#define GCAL2_B3_ADDR         0x0D
#define GCAL2_B2_ADDR         0x0E
#define GCAL2_B1_ADDR         0x0F
#define GCAL2_B0_ADDR         0x10
#define I2C_CONTROL_ADDR      0x11
#define ADCO_B2_ADDR          0x12
#define ADCO_B1_ADDR          0x13
#define ADCO_B0_ADDR          0x14
#define OTP_B1_ADDR           0x15
#define OTP_B0_ADDR           0x16
#define PGA_PWR_ADDR          0x1B
#define DEVICE_REVISION_ADDR  0x1F


/* AVDD source select */
#define AVDDS_Pos  (7)
#define AVDDS_Msk  (1<<AVDDS_Pos)
#define AVDDS_LDO  (1<<AVDDS_Pos)  /* Internal LDO */
#define AVDDS_PIN  (0<<AVDDS_Pos)  /* AVDD pin input (default) */


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

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

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

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

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

/* Power up digital circuit */
#define PUD_Pos                 (1)
#define PUD_Msk                 (1<<PUD_Pos)
#define PUD_POWER_UP     (1<<PUD_Pos)    /* Power up the chip digital logic */
#define PUD_POWER_DOWN   (0<<PUD_Pos)    /* power down (default) */

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


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

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

/* LDO Voltage */
#define VLDO_Pos  (3)
#define VLDO_Msk  (7<<VLDO_Pos)
#define VLDO_2V4  (7<<VLDO_Pos)  /* 2.4v */
#define VLDO_2V7  (6<<VLDO_Pos)  /* 2.7v */
#define VLDO_3V0  (5<<VLDO_Pos)  /* 3.0v */
#define VLDO_3V3  (4<<VLDO_Pos)  /* 3.3v */
#define VLDO_3V6  (3<<VLDO_Pos)  /* 3.6v */
#define VLDO_3V9  (2<<VLDO_Pos)  /* 3.9v */
#define VLDO_4V2  (1<<VLDO_Pos)  /* 4.2v */
#define VLDO_4V5  (0<<VLDO_Pos)  /* 4.5v (default) */

/* Gain select */
#define GAINS_Pos  (0)
#define GAINS_Msk  (7<<GAINS_Pos)
#define GAINS_128  (7<<GAINS_Pos)  /* x128 */
#define GAINS_64   (6<<GAINS_Pos)  /* x64 */
#define GAINS_32   (5<<GAINS_Pos)  /* x32 */
#define GAINS_16   (4<<GAINS_Pos)  /* x16 */
#define GAINS_8    (3<<GAINS_Pos)  /* x8 */
#define GAINS_4    (2<<GAINS_Pos)  /* x4 */
#define GAINS_2    (1<<GAINS_Pos)  /* x2 */
#define GAINS_1    (0<<GAINS_Pos)  /* x1 (default) */

/* Analog input channel select */
#define CHS_Pos  (7)
#define CHS_Msk  (1<<CHS_Pos)
#define CHS_CH2  (1<<CHS_Pos)  /* 1 = Ch2 */
#define CHS_CH1  (0<<CHS_Pos)  /* 0 = Ch1 (default) */

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

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

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

/* Calibration mode */
#define CALMOD_Pos              (0)
#define CALMOD_Msk              (3<<CALMOD_Pos)
#define CALMOD_GAIN             (3<<CALMOD_Pos)  /* 11 = Gain Calibration System */
#define CALMOD_OFFSET           (2<<CALMOD_Pos)  /* 10 = Offset Calibration System */
#define CALMOD_ RESERVED        (1<<CALMOD_Pos)  /* 01 = Reserved */
#define CALMOD_OFFSET_INTERNAL  (0<<CALMOD_Pos)  /* 00 = Offset Calibration Internal (default) */

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

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

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

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

/* Short the input together, measure offset */
#define SI_Pos          (3)
#define SI_Msk          (1<<SI_Pos)
#define SI_SHORT_INPUT  (1<<SI_Pos)
#define SI_OPEN_INPUT   (0<<SI_Pos)

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

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

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

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

/* LDOMODE */
#define LDOMODE_Pos  (6)
#define LDOMODE_Msk  (1<<LDOMODE_Pos)
#define LDOMODE_LOW_DC  (1<<LDOMODE_Pos)   /* Improved stability and lower DC gain */
#define LDOMODE_HIGH_DC  (0<<LDOMODE_Pos)  /* Improved accuracy and higher DC gain */

/* PGA output buffer enable */
#define PGA_OUTPUT_BUFFER_Pos  (5)
#define PGA_OUTPUT_BUFFER_Msk  (1<<PGA_OUTPUT_BUFFER_Pos)
#define PGA_OUTPUT_BUFFER_ENABLE  (1<<PGA_OUTPUT_BUFFER_Pos)   /* 1: PGA output buffer enable */
#define PGA_OUTPUT_BUFFER_DISABLE  (0<<PGA_OUTPUT_BUFFER_Pos)  /* 0: PGA output buffer disable */

/* PGA bypass enable */
#define PGA_BYPASS_Pos  (4)
#define PGA_BYPASS_Msk  (1<<PGA_BYPASS_Pos)
#define PGA_BYPASS_ENABLE  (1<<PGA_BYPASS_Pos)   /* 1: PGA bypass enable */
#define PGA_BYPASS_DISABLE  (0<<PGA_BYPASS_Pos)  /* 0: PGA bypass disable */
/* 3 */
/* PGAINV */
#define PGAINV_Pos  (3)
#define PGAINV_Msk  (1<<PGAINV_Pos)
#define PGAINV_INVERT  (1<<PGAINV_Pos)  /* 1: invert PGA input phase */
#define PGAINV_NORMAL  (0<<PGAINV_Pos)  /* 0: default */

/* PGACHPDIS */
#define PGACHPDIS_Pos  (0)
#define PGACHPDIS_Msk  (1<<PGACHPDIS_Pos)
#define PGACHPDIS_DISABLE  (1<<PGACHPDIS_Pos)  /* 1: Chopper disabled */
#define PGACHPDIS_ENABLE  (0<<PGACHPDIS_Pos)   /* 0: default */

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

/* Master bias Current */
#define MASTER_BIAS_CURR_Pos  (4)
#define MASTER_BIAS_CURR_Msk  (7<<MASTER_BIAS_CURR_Pos)
#define MASTER_BIAS_CURR_100 (0<<MASTER_BIAS_CURR_Pos)  /* 100% (default) */
#define MASTER_BIAS_CURR_90  (1<<MASTER_BIAS_CURR_Pos)  /* 90% (lower power & accuracy) */
#define MASTER_BIAS_CURR_80  (2<<MASTER_BIAS_CURR_Pos)  /* 0 1 0 80% */
#define MASTER_BIAS_CURR_73  (3<<MASTER_BIAS_CURR_Pos)  /* 0 1 1 73% */
#define MASTER_BIAS_CURR_67  (4<<MASTER_BIAS_CURR_Pos)  /* 1 0 0 67% */
#define MASTER_BIAS_CURR_62  (5<<MASTER_BIAS_CURR_Pos)  /* 1 0 1 62% */
#define MASTER_BIAS_CURR_58  (6<<MASTER_BIAS_CURR_Pos)  /* 1 1 0 58% */
#define MASTER_BIAS_CURR_54  (7<<MASTER_BIAS_CURR_Pos)  /* 1 1 1 54% */

/* ADC Current */
#define ADC_CURR_Pos  (2)
#define ADC_CURR_Msk  (3<<ADC_CURR_Pos)
#define ADC_CURR_100  (0<<ADC_CURR_Pos)     /* 0 0 100% of master bias */
#define ADC_CURR_75  (1<<ADC_CURR_Pos)      /* 0 1 75%  of master bias */
#define ADC_CURR_50  (2<<ADC_CURR_Pos)      /* 1 0 50%  of master bias */
#define ADC_CURR_25  (3<<ADC_CURR_Pos)      /* 1 1 25%  of master bias */

/* PGA Current */
#define PGA_CURR_Pos  (0)
#define PGA_CURR_Msk  (3<<PGA_CURR_Pos)
#define PGA_CURR_100  (0<<PGA_CURR_Pos)  /* 0 0 100% of master bias (default) */
#define PGA_CURR_95  (1<<PGA_CURR_Pos)   /* 0 1 95% of master bias (lower power & accuracy) */
#define PGA_CURR_86  (2<<PGA_CURR_Pos)   /* 1 0 86% of master bias */
#define PGA_CURR_70  (3<<PGA_CURR_Pos)   /* 1 1 70% of master bias */
/*------------------------------------------------------------------------------------------------*/
/* Global variables                                                                               */
/*------------------------------------------------------------------------------------------------*/
volatile uint8_t g_au8TxData[2];
volatile uint8_t g_u8RxData;
volatile uint8_t g_u8DataLen;
volatile uint8_t g_u8EndFlag = 0;

typedef void (*I2C_FUNC)(uint32_t u32Status);

volatile static I2C_FUNC s_I2C0HandlerFn = NULL;

/* ADC chip register read and write */
uint8_t ADC_ReadReg(uint8_t u8RegAddr)
{

    uint8_t rdata = 0U;
    rdata = I2C_ReadByteOneReg(I2C1, ADC_SLAVE_ADDR, u8RegAddr);
    return rdata;
}

uint8_t ADC_WriteReg(uint8_t u8RegAddr, uint8_t data)
{
    uint8_t u8Err;
    u8Err = I2C_WriteByteOneReg(I2C1, ADC_SLAVE_ADDR, u8RegAddr, data);
    return u8Err;
}

/**
  * @brief      ADC_Config
  *
  * @param[in]  ch      CHS_CH1 ch1
  *                     CHS_CH2 ch2
  * @param[in]  rate    Conversion rate select
  *                                  CRS_320 = 320SPS
  *                                  CRS_80 = 80SPS
  *                                  CRS_40 = 40SPS
  *                                  CRS_20 = 20SPS
  *                                  CRS_10 = 10SPS (default)
  * @param[in]  gain    Gain select
  *                                  GAINS_128 = x128
  *                                  GAINS_64 = x64
  *                                  GAINS_32 = x32
  *                                  GAINS_16 = x16
  *                                  GAINS_8 = x8
  *                                  GAINS_4 = x4
  *                                  GAINS_2 = x2
  *                                  GAINS_1 = x1 (default)
  *
  *
  * @details
  *
  */
void ADC_Config(uint8_t ch, uint8_t rate, uint8_t gain)
{
    uint8_t reg = 0;
    /* Set channel and Conversion rate */
    reg = ADC_ReadReg(CTRL2_ADDR);
    reg &= ~(CHS_Msk | CRS_Msk);
    reg |= (ch |   /* CHS: 0 = ch1,1 = ch2 */
            rate); /* CRS: Sample rate can be set to 10, 20, 40, 80, or 320Hz */
    ADC_WriteReg(CTRL2_ADDR, reg);

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

    ADC_WriteReg(CTRL1_ADDR, reg);
}

void ADC_Calibration(void)
{
    uint8_t reg = 0;

    while (1)
    {

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

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

        /* Start calibration */
        reg |= CALS_ACTION;              /* Start calibration */
        ADC_WriteReg(CTRL2_ADDR, reg);

        while (1)
        {
            /* Wait for calibration finish */
            TIMER_Delay(TIMER0, 50000); /* Wait 50ms */

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

            if ((reg & CALS_Msk) == CALS_FINISHED)
                break;
        }

        reg &= CAL_ERR_Msk;

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

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

void  ADCchip_Init(void)
{
    uint8_t reg = 0;

    /* Reset */
    reg =  RR_RESET;                   /* Enter reset mode */
    ADC_WriteReg(PU_CTRL_ADDR, reg);

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

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

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

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

    reg = 0x30;
    ADC_WriteReg(OTP_B1_ADDR, reg);


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

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

    /* Calibration */
    ADC_Calibration();
}
/**
  * @brief      ADC_StartConversion
  *
  * @param[in]  none
  * @details
  *
  */
void ADC_StartConversion(void)
{
    uint8_t reg = 0;
    /* Start conversion */
    reg = ADC_ReadReg(PU_CTRL_ADDR);
    reg |= CS_START_CONVERSION; /* CS=1 */
    ADC_WriteReg(PU_CTRL_ADDR, reg);
}

uint32_t ADC_Read_Conversion_Data(void)
{
    uint8_t rdata[3];
    uint32_t result;

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

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Unlock protected registers */
    SYS_UnlockReg();

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

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

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

    /* Enable UART0 clock */
    CLK_EnableModuleClock(UART0_MODULE);

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

    /* Enable I2C1 clock */
    CLK_EnableModuleClock(I2C1_MODULE);

    /* Enable IP clock */
    CLK_EnableModuleClock(TMR0_MODULE);

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

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

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

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

    /* Lock protected registers */
    SYS_LockReg();
}

void I2C1_Close(void)
{
    /* Disable I2C1 interrupt and clear corresponding NVIC bit */
    I2C_DisableInt(I2C1);
    NVIC_DisableIRQ(I2C1_IRQn);

    /* Disable I2C1 and close I2C1 clock */
    I2C_Close(I2C1);
    CLK_DisableModuleClock(I2C1_MODULE);
}

void I2C1_Init(void)
{
    /* Open I2C module and set bus clock */
    I2C_Open(I2C1, 100000);

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

int main()
{
    uint32_t i;
    uint32_t u32i32ConversionData;
    int i32ConversionData;
    SYS_Init();

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

    /*
        This sample code sets I2C bus clock to 100kHz. Then, Set NAU7802, control NAU7802 to
        complete ADC conversion, and read ADC conversion value.
    */
    printf("+-------------------------------------------------+\n");
    printf("|    I2C Driver Sample Code with ADC NAU7802      |\n");
    printf("+-------------------------------------------------+\n");
    printf("I/O connection:\n");
    printf("M031           NAU7802\n");
    printf("PB.0 <--------> SDIO\n");
    printf("PB.1 <--------> SCLK\n");
    printf("ADC chip configuration:\n");
    printf("Clock source    = IRC\n");
    printf("AVDD source     = AVDD pin\n");
    printf("Input channel   = CH1\n");
    printf("VIN1P-VIN1N     = +/-0.5*(REFP-REFN)/PGA_Gain\n");
    printf("PGA Gain        = 1\n");
    printf("Conversion Rate = 10 SPS\n");
    printf("+-------------------------------------------------+\n");

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

    /* Init NAU7802 chip */
    ADCchip_Init();

    /* Start adc Conversion */
    ADC_StartConversion();

    while (1)
    {
        /* Wait ADC conversion done */
        while ((ADC_ReadReg(PU_CTRL_ADDR)&CR_Msk) != CR_DATA_RDY);

        /* Read Conversion data */
        u32i32ConversionData = ADC_Read_Conversion_Data();

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

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

        for (i = 0; i < 0x5fffff; i++);
    }
}

/*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/

使用特权

评论回复
板凳
tpgf| | 2023-3-1 15:46 | 只看该作者
这颗芯片是不是专门用于ad采集的芯片呢  24位够高的啊

使用特权

评论回复
地板
nawu| | 2023-3-1 16:06 | 只看该作者
我觉得在使用这个芯片的时候还得注意外部电路的走线

使用特权

评论回复
5
aoyi| | 2023-3-1 16:16 | 只看该作者
随着采集位数的提高 相应的转换速度会降低吗

使用特权

评论回复
6
zljiu| | 2023-3-1 16:33 | 只看该作者
楼主有没有自己实测数据  采集精度能达到多少啊

使用特权

评论回复
7
gwsan| | 2023-3-1 16:45 | 只看该作者
看楼主代码 毛事使用的是循环等待方式 而不是中断方式是吗

使用特权

评论回复
8
tfqi| | 2023-3-1 16:57 | 只看该作者
转换数据上传使用的是iic的通讯方式吗?

使用特权

评论回复
9
AloneKaven| | 2023-3-1 19:27 | 只看该作者
位数增加了速度应该会降低吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

3198

帖子

7

粉丝