/******************************************************************************
* [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. ***/