274 lines
9.6 KiB
C
274 lines
9.6 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||
|
*
|
||
|
* This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||
|
* be copied by any method or incorporated into another program without
|
||
|
* the express written consent of Aerospace C.Power. This Information or any portion
|
||
|
* thereof remains the property of Aerospace C.Power. The Information contained herein
|
||
|
* is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||
|
* liability for its use in any way and conveys no license or title under
|
||
|
* any patent or copyright and makes no representation or warranty that this
|
||
|
* Information is free from patent or copyright infringement.
|
||
|
*
|
||
|
* ****************************************************************************/
|
||
|
|
||
|
#include "os_types.h"
|
||
|
#include "os_task.h"
|
||
|
#include "os_utils.h"
|
||
|
|
||
|
#include "hw_reg_api.h"
|
||
|
#include "apb_hw.h"
|
||
|
#include "apb.h"
|
||
|
|
||
|
/* common includes */
|
||
|
#include "iot_io.h"
|
||
|
#include "iot_bitops.h"
|
||
|
#include "iot_pkt_api.h"
|
||
|
|
||
|
/* debug includes*/
|
||
|
#include "dbg_io.h"
|
||
|
#include "iot_errno_api.h"
|
||
|
|
||
|
#include "uart.h"
|
||
|
#include "iot_clock.h"
|
||
|
#include "iot_config.h"
|
||
|
#include "iot_uart_api.h"
|
||
|
#include "iot_errno_api.h"
|
||
|
#include "iot_adc_api.h"
|
||
|
#include "ahb.h"
|
||
|
#include "rtc.h"
|
||
|
|
||
|
#include "chip_reg_base.h"
|
||
|
#include "hw_reg_api.h"
|
||
|
#include "iot_irq.h"
|
||
|
#include "iot_wdg.h"
|
||
|
|
||
|
#include "sar_adc_reg.h"
|
||
|
#include "sar_adc_reg_s.h"
|
||
|
#include "sadc.h"
|
||
|
#include "sadc_hw.h"
|
||
|
|
||
|
#pragma GCC push_options
|
||
|
#pragma GCC optimize("O0")
|
||
|
|
||
|
#define TEST_SADC_INT_LEN 100
|
||
|
static uint32_t test_int_sadc_data[TEST_SADC_INT_LEN];
|
||
|
static uint32_t test_int_sadc_cnt;
|
||
|
static uint32_t test_sadc_port;
|
||
|
|
||
|
static volatile sar_adc_reg_t *sadc_bases[SADC_HW_DEV_NUM] = {
|
||
|
(volatile sar_adc_reg_t *)SADC_BASEADDR,
|
||
|
(volatile sar_adc_reg_t *)TPID_BASEADDR,
|
||
|
};
|
||
|
|
||
|
void sadc_set_adc_full_int_eb(uint8_t port, bool_t eb)
|
||
|
{
|
||
|
WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc_full_int_ena, eb);
|
||
|
}
|
||
|
|
||
|
void sadc_set_adc_valid_int_eb(uint8_t port, uint8_t ch, bool_t eb)
|
||
|
{
|
||
|
switch (ch) {
|
||
|
case 0: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc0_valid_int_ena, eb);break;
|
||
|
case 1: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc1_valid_int_ena, eb);break;
|
||
|
case 2: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc2_valid_int_ena, eb);break;
|
||
|
case 3: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc3_valid_int_ena, eb);break;
|
||
|
case 4: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc4_valid_int_ena, eb);break;
|
||
|
case 5: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc5_valid_int_ena, eb);break;
|
||
|
case 6: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc6_valid_int_ena, eb);break;
|
||
|
case 7: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc7_valid_int_ena, eb);break;
|
||
|
case 8: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc8_valid_int_ena, eb);break;
|
||
|
case 9: WR_REG_FIELD(sadc_bases[port]->adc_int_ena, adc9_valid_int_ena, eb);break;
|
||
|
default:break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool_t sadc_get_adc_valid_int_st(uint8_t port, uint8_t ch)
|
||
|
{
|
||
|
bool_t res = false;
|
||
|
switch (ch) {
|
||
|
case 0: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc0_valid_int_st) ? true : false;break;
|
||
|
case 1: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc1_valid_int_st) ? true : false;break;
|
||
|
case 2: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc2_valid_int_st) ? true : false;break;
|
||
|
case 3: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc3_valid_int_st) ? true : false;break;
|
||
|
case 4: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc4_valid_int_st) ? true : false;break;
|
||
|
case 5: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc5_valid_int_st) ? true : false;break;
|
||
|
case 6: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc6_valid_int_st) ? true : false;break;
|
||
|
case 7: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc7_valid_int_st) ? true : false;break;
|
||
|
case 8: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc8_valid_int_st) ? true : false;break;
|
||
|
case 9: res = RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc9_valid_int_st) ? true : false;break;
|
||
|
default:break;
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
void sadc_clr_adc_int(uint8_t port)
|
||
|
{
|
||
|
WR_REG_FIELD(sadc_bases[port]->adc_int_clr, adc_full_int_clr, 1);
|
||
|
// for (volatile uint32_t i = 0; i < 1000; i++);
|
||
|
WR_REG_FIELD(sadc_bases[port]->adc_int_clr, adc_full_int_clr, 0);
|
||
|
}
|
||
|
|
||
|
uint32_t sadc_get_adc_int_st(uint8_t port)
|
||
|
{
|
||
|
return RE_REG_FIELD(sadc_bases[port]->adc_int_st, adc_full_int_st);
|
||
|
}
|
||
|
|
||
|
uint32_t sadc_get_adc_int_raw(uint8_t port)
|
||
|
{
|
||
|
return RE_REG_FIELD(sadc_bases[port]->adc_int_raw, adc_full_int_raw);
|
||
|
}
|
||
|
|
||
|
int32_t test_sadc_get_rdata(uint32_t port, uint32_t phs)
|
||
|
{
|
||
|
uint32_t res;
|
||
|
uint32_t ch = 0;
|
||
|
|
||
|
switch (ch) {
|
||
|
case 0:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc0_rdata, adc0_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc0_rdata, adc0_phase_clr, 1);
|
||
|
break;
|
||
|
case 1:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc1_rdata, adc1_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc1_rdata, adc1_phase_clr, 1);
|
||
|
break;
|
||
|
case 2:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc2_rdata, adc2_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc2_rdata, adc2_phase_clr, 1);
|
||
|
break;
|
||
|
case 3:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc3_rdata, adc3_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc3_rdata, adc3_phase_clr, 1);
|
||
|
break;
|
||
|
case 4:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc4_rdata, adc4_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc4_rdata, adc4_phase_clr, 1);
|
||
|
break;
|
||
|
case 5:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc5_rdata, adc5_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc5_rdata, adc5_phase_clr, 1);
|
||
|
break;
|
||
|
case 6:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc6_rdata, adc6_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc6_rdata, adc6_phase_clr, 1);
|
||
|
break;
|
||
|
case 7:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc7_rdata, adc7_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc7_rdata, adc7_phase_clr, 1);
|
||
|
break;
|
||
|
case 8:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc8_rdata, adc8_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc8_rdata, adc8_phase_clr, 1);
|
||
|
break;
|
||
|
case 9:
|
||
|
res = RE_REG_FIELD(sadc_bases[port]->sar_adc9_rdata, adc9_data);
|
||
|
WR_REG_FIELD(sadc_bases[port]->sar_adc9_rdata, adc9_phase_clr, 1);
|
||
|
break;
|
||
|
default:break;
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
static uint32_t test_sadc_irq_handler(uint32_t vector, iot_addrword_t data)
|
||
|
{
|
||
|
uint32_t ch = data;
|
||
|
|
||
|
if (sadc_get_adc_valid_int_st(test_sadc_port, ch)) {
|
||
|
|
||
|
if (test_int_sadc_cnt < TEST_SADC_INT_LEN - 1) {
|
||
|
test_int_sadc_data[test_int_sadc_cnt] = (uint32_t)test_sadc_get_rdata(test_sadc_port, ch);;
|
||
|
} else if (test_int_sadc_cnt == TEST_SADC_INT_LEN - 1) {
|
||
|
test_int_sadc_data[test_int_sadc_cnt] = (uint32_t)test_sadc_get_rdata(test_sadc_port, ch);;
|
||
|
/* disable data valid interrupt */
|
||
|
sadc_set_adc_valid_int_eb(test_sadc_port, ch, 0);
|
||
|
}
|
||
|
test_int_sadc_cnt++;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void sadc_data_dump_average(char *str, uint32_t *buf, uint32_t len)
|
||
|
{
|
||
|
iot_printf("[%s SADC_DATA_DUMP]len=%d\n", str, len);
|
||
|
for (uint32_t i = 0; i < len; i++) {
|
||
|
iot_printf("[%d]:phase=%d,data=%d\n", i,
|
||
|
0xF & (buf[i] >> 28),
|
||
|
0x3FF & buf[i]);
|
||
|
}
|
||
|
}
|
||
|
sar_adc_reg_t *test_g_sar_adc_reg;
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
uint8_t channel = 1;
|
||
|
uint8_t err_num_volt = 0;
|
||
|
iot_irq_t test_sadc_irq_h;
|
||
|
int test_poll_cnt = 0;
|
||
|
float temp_value;
|
||
|
|
||
|
uint8_t adc_ch[8] = {ADC_CHANNEL0, ADC_CHANNEL1, ADC_CHANNEL2,
|
||
|
ADC_CHANNEL3, ADC_CHANNEL4, ADC_CHANNEL5, ADC_CHANNEL6, ADC_CHANNEL7};
|
||
|
|
||
|
wdg_deinit(HAL_WDG_CPU_0);
|
||
|
wdg_deinit(HAL_WDG_CPU_1);
|
||
|
wdg_deinit(HAL_WDG_CPU_2);
|
||
|
|
||
|
dbg_uart_init();
|
||
|
iot_printf("sadc test\n");
|
||
|
|
||
|
sadc_init(ANA_SADC0, NULL);
|
||
|
if (0) { /* sadc interrupt test */
|
||
|
test_sadc_port = ANA_SADC0;
|
||
|
test_sadc_irq_h = iot_interrupt_create(HAL_VECTOR_SADC,
|
||
|
HAL_INTR_PRI_6, (iot_addrword_t)channel, test_sadc_irq_handler);
|
||
|
|
||
|
iot_interrupt_attach(test_sadc_irq_h);
|
||
|
iot_interrupt_unmask(test_sadc_irq_h);
|
||
|
|
||
|
/* enable data valid interrupt */
|
||
|
sadc_set_adc_valid_int_eb(test_sadc_port, channel, 1);
|
||
|
|
||
|
/* wait for sampling to complete */
|
||
|
while (test_int_sadc_cnt < TEST_SADC_INT_LEN);
|
||
|
sadc_data_dump_average("INT-P0", test_int_sadc_data, TEST_SADC_INT_LEN);
|
||
|
}
|
||
|
|
||
|
while (1) {
|
||
|
test_g_sar_adc_reg = (sar_adc_reg_t*)(SADC_BASEADDR);
|
||
|
|
||
|
//if (0) {
|
||
|
for (int ch_idx = 0; ch_idx < 6; ch_idx++) {
|
||
|
channel = adc_ch[ch_idx];
|
||
|
int adc_volt = sadc_poll_volt_start_real(channel, ADC_GAIN_3V,
|
||
|
&err_num_volt);
|
||
|
|
||
|
if (err_num_volt != 0) {
|
||
|
iot_printf("adc channel %d data is invaild!\n", channel);
|
||
|
} else {
|
||
|
iot_printf("%d,%d ", ch_idx, adc_volt);
|
||
|
}
|
||
|
}
|
||
|
//} else {
|
||
|
sadc_temperature_val_get_raw(&temp_value);
|
||
|
iot_printf("temp=%f ", temp_value);
|
||
|
//}
|
||
|
|
||
|
for (volatile uint32_t i = 0; i < 1000; i++);
|
||
|
iot_printf("\n");
|
||
|
/* test sadc ahb disable */
|
||
|
if (0 && test_poll_cnt++ > 20) {
|
||
|
iot_printf("stop sadc\r\n");
|
||
|
apb_disable(APB_SADC);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#pragma GCC pop_options
|
||
|
|