You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

115 lines
3.4 KiB

/*
* ADS1293.h
*
* Created on: Jun 6, 2022
* Author: Hans Hüttmann
*/
#include "ads1293.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
static uint8_t txcache[256];
static uint8_t rxcache[256];
void ads1293_spi_init(ads1293_t* ads, ads1293_spi_tx_rx_t spi_tx_rx) { ads->spi_tx_rx = spi_tx_rx; }
void ads1293_spi_writereg(ads1293_t* ads, uint8_t addr, uint8_t data) {
uint8_t txcache[2];
txcache[0] = ADS1293_WRITE_BIT & addr;
txcache[1] = data;
ads->spi_tx_rx(txcache, NULL, 2);
}
uint8_t ads1293_spi_readreg(ads1293_t* ads, uint8_t addr) {
uint8_t txcache[2];
txcache[0] = ADS1293_READ_BIT | addr;
txcache[1] = 0;
uint8_t rxcache[2];
ads->spi_tx_rx(txcache, rxcache, 2);
return rxcache[1];
}
void ads1293_spi_writereg_and_readbak(ads1293_t* ads, uint8_t addr, uint8_t data, uint8_t* readbak) {
ads1293_spi_writereg(ads, addr, data);
*readbak = ads1293_spi_readreg(ads, addr);
}
void ads1293_spi_autoinc_writereg(ads1293_t* ads, uint8_t addr, uint8_t* data, uint8_t len) { //
len = len > 255 ? 255 : len;
uint8_t addbyte = ADS1293_WRITE_BIT & addr;
txcache[0] = addbyte;
memcpy(txcache + 1, data, len);
ads->spi_tx_rx(txcache, NULL, len + 1);
}
void ads1293_spi_autoinc_readreg(ads1293_t* ads, uint8_t addr, uint8_t* data, uint8_t len) {
len = len > 255 ? 255 : len;
uint8_t addbyte = ADS1293_READ_BIT | addr;
txcache[0] = addbyte;
memset(txcache + 1, 0, len);
ads->spi_tx_rx(txcache, rxcache, len + 1);
memcpy(data, rxcache + 1, len);
}
void ads1293_spi_stream_readreg(ads1293_t* ads, uint8_t* data, uint8_t len) {
len = len > 255 ? 255 : len;
memset(txcache, 0, len);
memset(rxcache, 0, len);
uint8_t addbyte = ADS1293_READ_BIT | TI_ADS1293_DATA_LOOP_REG;
ads->spi_tx_rx(&addbyte, rxcache, len);
memcpy(data, rxcache, len);
}
void ads1293_read_ecg(ads1293_t* ads, uint32_t ch, uint32_t* data) {
uint8_t add = 0;
if (ch == 1) {
add = TI_ADS1293_DATA_CH1_ECG_H_REG;
} else if (ch == 2) {
add = TI_ADS1293_DATA_CH2_ECG_H_REG;
} else if (ch == 3) {
add = TI_ADS1293_DATA_CH3_ECG_H_REG;
} else {
return;
}
uint8_t readbak[3] = {0};
ads1293_spi_autoinc_readreg(ads, add, readbak, 3);
*data = 0;
*data = ((uint32_t)readbak[0] << 16) + ((uint32_t)readbak[1] << 8) + ((uint32_t)readbak[2] << 0);
}
void ads1293_read_ecgs(ads1293_t* ads, uint32_t* data /*3*/) {
uint8_t add = 0;
add = TI_ADS1293_DATA_CH1_ECG_H_REG;
uint8_t readbak[9] = {0};
ads1293_spi_autoinc_readreg(ads, add, readbak, 9);
data[0] = ((uint32_t)readbak[0] << 16) + ((uint32_t)readbak[1] << 8) + ((uint32_t)readbak[2] << 0);
data[1] = ((uint32_t)readbak[3] << 16) + ((uint32_t)readbak[4] << 8) + ((uint32_t)readbak[5] << 0);
data[2] = ((uint32_t)readbak[6] << 16) + ((uint32_t)readbak[7] << 8) + ((uint32_t)readbak[8] << 0);
}
void ads1293_start_conversion(ads1293_t* ads) {
uint8_t data = 0;
data = 0x01;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
void ads1293_stop_conversion(ads1293_t* ads) {
uint8_t data = 0;
data = 0x04;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
void ads1293_start_power_off(ads1293_t* ads) {
uint8_t data = 0;
data |= 0x01 << 2;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
uint8_t ads1293_read_error_lod(ads1293_t* ads) { return ads1293_spi_readreg(ads, TI_ADS1293_ERROR_LOD_REG); }