386 lines
11 KiB
C
386 lines
11 KiB
C
#include "ads1256.h"
|
|
#include "ads1256_constants.h"
|
|
#include "stdint.h"
|
|
|
|
static unsigned char MX_ch_code_p[5] = {0, 0x01,0x54,0x23, 0x76};
|
|
static unsigned char MX_ch_code_n[5] = {0, 0x10,0x45,0x32, 0x67};
|
|
|
|
static uint8_t PGA;
|
|
static uint8_t PGA_val = ADC_PGA_SET_INIT;
|
|
|
|
static uint8_t ADC_sps_var = ADC_SPS_SET_INIT;
|
|
|
|
static uint8_t meas_ptr = 0;
|
|
static uint8_t meas_case = MEAS_CASE_INIT;
|
|
|
|
static uint8_t meas_status = 0;
|
|
static int64_t meas[MEAS_BUF_SIZE] = {0};
|
|
static uint8_t ADC_state = 0;
|
|
|
|
void ADC_SET_CS(uint8_t state) {
|
|
if(state) {
|
|
GPIO_SET_BIT(ADC_CS_GPIO, ADC_CS_GPIO_PIN);
|
|
} else {
|
|
GPIO_RESET_BIT(ADC_CS_GPIO, ADC_CS_GPIO_PIN);
|
|
}
|
|
}
|
|
|
|
void ADC_SET_SYNC(uint8_t state) {
|
|
if(state) {
|
|
GPIO_SET_BIT(ADC_SYNC_GPIO, ADC_SYNC_GPIO_PIN);
|
|
} else {
|
|
GPIO_RESET_BIT(ADC_SYNC_GPIO, ADC_SYNC_GPIO_PIN);
|
|
}
|
|
}
|
|
|
|
void ADC_RESET_STATE(uint8_t state) {
|
|
if(state) {
|
|
GPIO_SET_BIT(ADC_RST_GPIO, ADC_RST_GPIO_PIN);
|
|
} else {
|
|
GPIO_RESET_BIT(ADC_RST_GPIO, ADC_RST_GPIO_PIN);
|
|
}
|
|
}
|
|
|
|
uint8_t read_reg(uint8_t reg_name) {
|
|
uint8_t reg_value = 0;
|
|
ADC_SET_CS(0);
|
|
|
|
SPI_WRITE(0x10 + reg_name);
|
|
SPI_WRITE(0x00);
|
|
|
|
reg_value = SPI_READ(®_value);
|
|
ADC_SET_CS(1);
|
|
|
|
return reg_value;
|
|
}
|
|
|
|
void write_reg(uint8_t reg_name, uint8_t cmd_byte) {
|
|
ADC_SET_CS(0);
|
|
SPI_WRITE(0x50 + reg_name);
|
|
SPI_WRITE(0x00);
|
|
SPI_WRITE(cmd_byte);
|
|
|
|
for (int i = 0; i < 5000; i++) {}
|
|
ADC_SET_CS(1);
|
|
}
|
|
|
|
void ADC_change_SPS(uint8_t SPS) {
|
|
ADC_sps_var = SPS <= ADC_MAX_SPS ? SPS : ADC_MAX_SPS;
|
|
ADC_init(1);
|
|
}
|
|
|
|
void ADC_set_SPS(uint8_t SPS) {
|
|
write_reg(DRATE, SPS);
|
|
while(GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN)) {}
|
|
}
|
|
|
|
void ADC_init(uint8_t buf_state) {
|
|
ADC_RESET_STATE(1);
|
|
ADC_SET_CS(1);
|
|
ADC_SET_SYNC(1);
|
|
|
|
for (uint32_t i = 0; i < 999999; i++) {}
|
|
ADC_set_SPS(ADC_sps_var);
|
|
|
|
buf_state = buf_state << 1;
|
|
|
|
write_reg(STATUS, buf_state);
|
|
ADC_set_SPS(ADC_sps_var);
|
|
ADC_set_PGA(PGA_val);
|
|
ADC_SelfCal();
|
|
for(int i = 0; i < 5000; i++) {}
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
ADC_sync(1);
|
|
}
|
|
|
|
uint8_t ADC_get_SPS(void) {
|
|
return ADC_sps_var;
|
|
}
|
|
|
|
void ADC_change_PGA(uint8_t PGA) {
|
|
if (PGA <= ADC_MAX_RANGE) {
|
|
PGA_val = PGA;
|
|
}
|
|
ADC_init(1);
|
|
}
|
|
|
|
uint8_t ADC_get_PGA(void) {
|
|
return PGA_val;
|
|
}
|
|
|
|
void ADC_set_PGA(uint8_t PGA_val_new) {
|
|
write_reg(ADCON, PGA_val_new);
|
|
PGA = PGA_val_new;
|
|
while(GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN)) {}
|
|
}
|
|
|
|
void ADC_SelfCal() {
|
|
ADC_SET_CS(0);
|
|
SPI_WRITE(0xf0);
|
|
SPI_WRITE(0xf0);
|
|
ADC_SET_CS(1);
|
|
|
|
|
|
while(GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN)) {}
|
|
}
|
|
|
|
void ADC_sync(uint8_t state) {
|
|
ADC_SET_SYNC(state);
|
|
}
|
|
|
|
void ADC_sync_trig(void) {
|
|
ADC_sync(0);
|
|
iter_delay(1000);
|
|
ADC_sync(1);
|
|
iter_delay(1000);
|
|
}
|
|
|
|
void ADC_setCh_p(uint8_t adcx, uint8_t chx) {
|
|
ADC_SET_CS(0);
|
|
iter_delay(1000);
|
|
SPI_WRITE(0x50 + MUX);
|
|
SPI_WRITE(0x00);
|
|
SPI_WRITE(MX_ch_code_p[chx]);
|
|
iter_delay(1000);
|
|
ADC_SET_CS(1);
|
|
}
|
|
|
|
void ADC_setCh_n(uint8_t adcx, uint8_t chx) {
|
|
ADC_SET_CS(0);
|
|
iter_delay(1000);
|
|
SPI_WRITE(0x50 + MUX);
|
|
SPI_WRITE(0x00);
|
|
SPI_WRITE(MX_ch_code_n[chx]);
|
|
iter_delay(1000);
|
|
ADC_SET_CS(1);
|
|
}
|
|
|
|
int64_t ADC_read(uint8_t ADC_number) {
|
|
int64_t ADC_rbyte_sum = 0;
|
|
ADC_SET_CS(0);
|
|
for (int i = 0; i < 7000; i++) {}
|
|
uint8_t read_cmd = 0x01;
|
|
SPI_READ(&read_cmd);
|
|
uint8_t read_cmd2 = 0x00;
|
|
|
|
for (int i =0; i < 10000; i++) {}
|
|
|
|
int64_t ADC_rbyte1 = SPI_READ(&read_cmd2);
|
|
int64_t ADC_rbyte2 = SPI_READ(&read_cmd2);
|
|
int64_t ADC_rbyte3 = SPI_READ(&read_cmd2);
|
|
|
|
for (int i =0; i < 20000; i++) {}
|
|
ADC_SET_CS(1);
|
|
|
|
ADC_rbyte_sum = (ADC_rbyte1 << 24) | (ADC_rbyte2 << 16) | (ADC_rbyte3 << 8);
|
|
ADC_rbyte_sum /= 256;
|
|
ADC_rbyte_sum += 8388608;
|
|
|
|
return ADC_rbyte_sum;
|
|
}
|
|
|
|
int64_t ADC_read_aver(uint8_t adcx, uint8_t chx) {
|
|
float Vin = 0;
|
|
int64_t cur_ADC_val = ADC_read(adcx);
|
|
Vin = (float)((cur_ADC_val * ADC_VREF)/(8388607.0 * PGA));
|
|
return (int64_t)((Vin + ADC_VIN_OFFSET)* uV);
|
|
}
|
|
|
|
void iter_delay(long delay) {
|
|
for(uint32_t i = 0; i < delay; i++) { }
|
|
}
|
|
|
|
void ADC_set_pos_ch(uint8_t ch) {
|
|
ADC_setCh_p(2, ch);
|
|
ADC_sync_trig();
|
|
}
|
|
|
|
void ADC_set_neg_ch(uint8_t ch) {
|
|
ADC_setCh_n(2, ch);
|
|
ADC_sync_trig();
|
|
}
|
|
|
|
void ADC_revpol_read(int64_t *ADC_arrptr) {
|
|
switch(meas_case) {
|
|
case MEAS_CASE_INIT:
|
|
meas_status = 0;
|
|
meas_ptr = 0;
|
|
meas_case = CH_1p;
|
|
break;
|
|
|
|
case CH_1p:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_pos_ch(1);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
meas_case = CH_1n;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_1n:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_neg_ch(1);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
if(meas_ptr > CH1_INDEX_RANGE)
|
|
meas_case = CH_2p; // next meas case
|
|
else
|
|
meas_case = CH_1p; // next meas case
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_2p:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_pos_ch(2);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
meas_case = CH_2n;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_2n:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_neg_ch(2);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
if (meas_ptr > CH2_INDEX_RANGE)
|
|
meas_case = CH_3p;
|
|
else
|
|
meas_case = CH_2p;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_3p:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_pos_ch(3);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
meas_case = CH_3n;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_3n:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_neg_ch(3);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
if (meas_ptr > CH3_INDEX_RANGE)
|
|
meas_case = CH_4p;
|
|
else
|
|
meas_case = CH_3p;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_4p:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_pos_ch(4);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
meas_case = CH_4n;
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
case CH_4n:
|
|
switch(ADC_state) {
|
|
case MEAS_CASE_SET_CH:
|
|
ADC_set_neg_ch(4);
|
|
ADC_state = MEAS_CASE_GET_CH_DATA;
|
|
break;
|
|
case MEAS_CASE_GET_CH_DATA:
|
|
if (GPIO_GET_INPUT_STATE(ADC_RDY_GPIO, ADC_RDY_GPIO_PIN) == 0) {
|
|
meas[meas_ptr] = ADC_read_aver(2, meas_ptr);
|
|
meas_ptr++;
|
|
if (meas_ptr > CH4_INDEX_RANGE) {
|
|
for (int i = 0; i < MEAS_BUF_SIZE; i++) {
|
|
ADC_arrptr[i] = meas[i];
|
|
}
|
|
meas_case = MEAS_CASE_INIT;
|
|
meas_status = 1;
|
|
} else {
|
|
meas_case = CH_4p;
|
|
}
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
}
|
|
break;
|
|
default:
|
|
ADC_state = MEAS_CASE_SET_CH;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
uint8_t ADC_meas_ready(void) { return meas_status; }
|
|
uint8_t ADC_get_currMeasCh(void) { return (uint8_t)meas_ptr; }
|
|
|