Added support for reading the battery state.

This commit is contained in:
Dual Tachyon 2023-08-10 14:08:55 +01:00
parent aad89ee266
commit 7f9c9a15bd
6 changed files with 77 additions and 0 deletions

View File

@ -310,6 +310,15 @@ void BOARD_ADC_Init(void)
ADC_SoftReset();
}
void BOARD_ADC_GetBatteryInfo(uint16_t *pCh4, uint16_t *pCh9)
{
ADC_Start();
while (!ADC_CheckEndOfConversion(ADC_CH9));
*pCh4 = ADC_GetValue(ADC_CH4);
*pCh9 = ADC_GetValue(ADC_CH9);
}
void BOARD_Init(void)
{
BOARD_PORTCON_Init();

View File

@ -17,9 +17,13 @@
#ifndef BOARD_H
#define BOARD_H
#include <stdint.h>
void BOARD_FLASH_Init(void);
void BOARD_GPIO_Init(void);
void BOARD_PORTCON_Init(void);
void BOARD_ADC_Init(void);
void BOARD_ADC_GetBatteryInfo(uint16_t *pCh4, uint16_t *pCh9);
void BOARD_Init(void);
#endif

View File

@ -195,6 +195,8 @@
#define SARADC_IF_FIFO_HFULL_VALUE_SET 1U
#define SARADC_IF_FIFO_HFULL_BITS_SET (SARADC_IF_FIFO_HFULL_VALUE_SET << SARADC_IF_FIFO_HFULL_SHIFT)
#define SARADC_CH0_ADDR (SARADC_BASE_ADDR + 0x0010U)
#define SARADC_CH0 (*(volatile uint32_t *)SARADC_CH0_ADDR)
#define SARADC_EXTTRIG_SEL_ADDR (SARADC_BASE_ADDR + 0x00B0U)
#define SARADC_EXTTRIG_SEL (*(volatile uint32_t *)SARADC_EXTTRIG_SEL_ADDR)
@ -224,6 +226,28 @@
#define SARADC_CALIB_KD_VALID_VALUE_YES 1U
#define SARADC_CALIB_KD_VALID_BITS_YES (SARADC_CALIB_KD_VALID_VALUE_YES << SARADC_CALIB_KD_VALID_SHIFT)
/* -------- ADC_CHx -------- */
typedef struct {
uint32_t STAT;
uint32_t DATA;
} ADC_Channel_t;
#define ADC_CHx_STAT_EOC_SHIFT 0
#define ADC_CHx_STAT_EOC_WIDTH 1
#define ADC_CHx_STAT_EOC_MASK (((1U << ADC_CHx_STAT_EOC_WIDTH) - 1U) << ADC_CHx_STAT_EOC_SHIFT)
#define ADC_CHx_STAT_EOC_VALUE_NOT_COMPLETE 0U
#define ADC_CHx_STAT_EOC_BITS_NOT_COMPLETE (ADC_CHx_STAT_EOC_VALUE_NOT_COMPLETE << ADC_CHx_STAT_EOC_SHIFT)
#define ADC_CHx_STAT_EOC_VALUE_COMPLETE 1U
#define ADC_CHx_STAT_EOC_BITS_COMPLETE (ADC_CHx_STAT_EOC_VALUE_COMPLETE << ADC_CHx_STAT_EOC_SHIFT)
#define ADC_CHx_DATA_DATA_SHIFT 0
#define ADC_CHx_DATA_DATA_WIDTH 12
#define ADC_CHx_DATA_DATA_MASK (((1U << ADC_CHx_DATA_DATA_WIDTH) - 1U) << ADC_CHx_DATA_DATA_SHIFT)
#define ADC_CHx_DATA_NUM_SHIFT 12
#define ADC_CHx_DATA_NUM_WIDTH 4
#define ADC_CHx_DATA_NUM_MASK (((1U << ADC_CHx_DATA_NUM_WIDTH) - 1U) << ADC_CHx_DATA_NUM_SHIFT)
#endif

View File

@ -125,3 +125,26 @@ void ADC_Configure(ADC_Config_t *pAdc)
}
}
void ADC_Start(void)
{
SARADC_START = (SARADC_START & ~SARADC_START_START_MASK) | SARADC_START_START_BITS_ENABLE;
}
bool ADC_CheckEndOfConversion(ADC_CH_MASK Mask)
{
volatile ADC_Channel_t *pChannels = (volatile ADC_Channel_t *)&SARADC_CH0;
uint8_t Channel = ADC_GetChannelNumber(Mask);
return (pChannels[Channel].STAT & ADC_CHx_STAT_EOC_MASK) >> ADC_CHx_STAT_EOC_SHIFT;
}
uint16_t ADC_GetValue(ADC_CH_MASK Mask)
{
volatile ADC_Channel_t *pChannels = (volatile ADC_Channel_t *)&SARADC_CH0;
uint8_t Channel = ADC_GetChannelNumber(Mask);
SARADC_IF = 1 << Channel; // TODO: Or just use 'Mask'
return (pChannels[Channel].DATA & ADC_CHx_DATA_DATA_MASK) >> ADC_CHx_DATA_DATA_SHIFT;
}

View File

@ -50,6 +50,9 @@ void ADC_Enable(void);
void ADC_SoftReset(void);
uint32_t ADC_GetClockConfig(void);
void ADC_Configure(ADC_Config_t *pAdc);
void ADC_Start(void);
bool ADC_CheckEndOfConversion(ADC_CH_MASK Mask);
uint16_t ADC_GetValue(ADC_CH_MASK Mask);
#endif

View File

@ -102,6 +102,8 @@ IF = 0x000C
= NOT_SET, 0
= SET, 1
CH0 = 0x0010
EXTTRIG_SEL = 0x00B0
CALIB_OFFSET = 0x00F0
@ -116,3 +118,15 @@ CALIB_KD = 0x00F4
= NO, 0
= YES, 1
[ADC_CHx]
$ = ADC_Channel_t
STAT = 0x0000
> EOC, 0, 1
= NOT_COMPLETE, 0
= COMPLETE, 1
DATA = 0x0004
> DATA, 0, 12
> NUM, 12, 4