From 5dc5fc551fa2e9d0468cc34d158f490d429e92f6 Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Sat, 28 Mar 2020 17:37:00 -0230 Subject: [PATCH 1/8] Initial commit of 16-bit adc driver --- Node/Common/drivers/inc/adc_ADS114S0.h | 21 +++++++++++++++++++++ Node/Common/drivers/inc/test.h | 1 - Node/Common/drivers/src/adc_ADS114S0.cpp | 1 + Node/Common/drivers/src/test.cpp | 2 -- 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 Node/Common/drivers/inc/adc_ADS114S0.h delete mode 100644 Node/Common/drivers/inc/test.h create mode 100644 Node/Common/drivers/src/adc_ADS114S0.cpp delete mode 100644 Node/Common/drivers/src/test.cpp diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h new file mode 100644 index 0000000..d45fd75 --- /dev/null +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -0,0 +1,21 @@ +#ifndef ADC_ADS114S0_H +#define ADC_ADS114S0_H + +#include + +class ADS114S0 +{ +public: + ADS114S0(SPIClass spi, uint8_t SS_PIN, uint8_t POWER_SEQ_PIN); + ADS114S0(SPIClass spi, uint8_t SS_PIN); + void init(); + uint16_t readSingleChannel(uint8_t); + void readActiveChannels(); + void enableChannel(uint8_t); + void disableChannel(uint8_t); + uint16_t *getuAdcData() { return uAdcData; }; + +private: +}; + +#endif \ No newline at end of file diff --git a/Node/Common/drivers/inc/test.h b/Node/Common/drivers/inc/test.h deleted file mode 100644 index fefa00a..0000000 --- a/Node/Common/drivers/inc/test.h +++ /dev/null @@ -1 +0,0 @@ -// This file is intentionally left blank \ No newline at end of file diff --git a/Node/Common/drivers/src/adc_ADS114S0.cpp b/Node/Common/drivers/src/adc_ADS114S0.cpp new file mode 100644 index 0000000..6b79e9b --- /dev/null +++ b/Node/Common/drivers/src/adc_ADS114S0.cpp @@ -0,0 +1 @@ +#include "adc_ADS114S0.h" diff --git a/Node/Common/drivers/src/test.cpp b/Node/Common/drivers/src/test.cpp deleted file mode 100644 index 7dea739..0000000 --- a/Node/Common/drivers/src/test.cpp +++ /dev/null @@ -1,2 +0,0 @@ -// This file is intentionally left blank - From 91f1adb3f3aa645fcafdfd30fba2ed33647c3fe4 Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Sun, 29 Mar 2020 14:31:54 -0230 Subject: [PATCH 2/8] Begin adding constant hex values and methods --- Node/Common/drivers/inc/adc_ADS114S0.h | 20 ++++++++++++++++++++ Node/Common/drivers/src/adc_ADS114S0.cpp | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index d45fd75..7d4fc9b 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -16,6 +16,26 @@ class ADS114S0 uint16_t *getuAdcData() { return uAdcData; }; private: + SPIClass spi; + SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE0); + uint8_t SS_PIN; + uint8_t POWER_SEQ_PIN; + bool HAS_SEQ_PIN = false; + // 16-bit data words for SPI + const uint16_t SET_CHANNEL_REG = 0x8000; + const uint16_t CONFIG_PROGRAM_REG = 0x2840; + const uint16_t MANUAL_READ = 0x1000; + const uint16_t AUTO_READ_RESET = 0x2C40; + const uint16_t AUTO_READ_NEXT = 0x2000; + const uint8_t WAKEUP = 0x02; + const uint8_t POWERDOWN = 0x04; + const uint8_t RESET = 0x06; + + uint16_t uAdcData[16]{}; //array of the latest data; 0 for channels not being used + uint16_t uActiveChannels = 0; // each bit represents a channel; 1=used, 0=unused + uint16_t uNumChannels = 0; // number of channels being used; + + uint16_t transfer(uint16_t uData); }; #endif \ No newline at end of file diff --git a/Node/Common/drivers/src/adc_ADS114S0.cpp b/Node/Common/drivers/src/adc_ADS114S0.cpp index 6b79e9b..d03b714 100644 --- a/Node/Common/drivers/src/adc_ADS114S0.cpp +++ b/Node/Common/drivers/src/adc_ADS114S0.cpp @@ -1 +1,17 @@ #include "adc_ADS114S0.h" + +ADS114S0::ADS114S0(SPIClass spi, uint8_t SS_PIN, uint8_t POWER_SEQ_PIN) : spi(spi), SS_PIN(SS_PIN), POWER_SEQ_PIN(POWER_SEQ_PIN) +{ + HAS_SEQ_PIN = true; +} + +ADS114S0::ADS114S0(SPIClass spi, uint8_t SS_PIN) : spi(spi), SS_PIN(SS_PIN) +{ +} + +void ADS114S0::init() +{ + spi.begin(); + pinMode(SS_PIN, OUTPUT); + digitalWrite(SS_PIN, HIGH); +} \ No newline at end of file From 8e9bcfe314af70285475cf043e9d212e35a2fa03 Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Wed, 8 Apr 2020 18:40:43 -0230 Subject: [PATCH 3/8] add methods for configuring adc, and reading data --- Node/Common/drivers/inc/adc_ADS114S0.h | 92 ++++++++++++++++------ Node/Common/drivers/src/adc_ADS114S0.cpp | 99 ++++++++++++++++++++++-- 2 files changed, 160 insertions(+), 31 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index 7d4fc9b..f832dc1 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -3,39 +3,81 @@ #include +enum InputMux +{ + MUX_SINGLE_0 = 0x0C, // Single-ended AIN0 + MUX_SINGLE_1 = 0x1C, // Single-ended AIN1 + MUX_SINGLE_2 = 0x2C, // Single-ended AIN2 + MUX_SINGLE_3 = 0x3C, // Single-ended AIN3 + MUX_SINGLE_4 = 0x4C, // Single-ended AIN4 + MUX_SINGLE_5 = 0x5C, // Single-ended AIN5 + MUX_SINGLE_6 = 0x6C, // Single-ended AIN6 + MUX_SINGLE_7 = 0x7C, // Single-ended AIN7 + MUX_SINGLE_8 = 0x8C, // Single-ended AIN8 + MUX_SINGLE_9 = 0x9C, // Single-ended AIN9 + MUX_SINGLE_10 = 0xAC, // Single-ended AIN10 + MUX_SINGLE_11 = 0xBC // Single-ended AIN11 +}; + +enum PGAGain +{ + GAIN_DISABLE = 0x00, // Default + GAIN_2 = 0x09, + GAIN_4 = 0x0A, + GAIN_8 = 0x0B, + GAIN_16 = 0x0C, + GAIN_32 = 0x0D, + GAIN_64 = 0x0E, + GAIN_128 = 0x0F +}; + +enum DataRate +{ + SPS_2_5 = 0x10, // 2.5 Samples Per Second + SPS_5 = 0x11, // 5 Samples Per Second + SPS_10 = 0x12, // 10 Samples Per Second + SPS_16_6 = 0x13, // 16.6 Samples Per Second + SPS_20 = 0x14, // 20 Samples Per Second (default) + SPS_50 = 0x15, // 50 Samples Per Second + SPS_60 = 0x16, // 60 Samples Per Second + SPS_100 = 0x17, // 100 Samples Per Second + SPS_200 = 0x18, // 200 Samples Per Second + SPS_400 = 0x19, // 400 Samples Per Second + SPS_800 = 0x1A, // 800 Samples Per Second + SPS_1000 = 0x1B, // 1000 Samples Per Second + SPS_2000 = 0x1C, // 2000 Samples Per Second + SPS_4000 = 0x1D // 4000 Samples Per Second +}; + class ADS114S0 { public: - ADS114S0(SPIClass spi, uint8_t SS_PIN, uint8_t POWER_SEQ_PIN); ADS114S0(SPIClass spi, uint8_t SS_PIN); void init(); - uint16_t readSingleChannel(uint8_t); - void readActiveChannels(); - void enableChannel(uint8_t); - void disableChannel(uint8_t); - uint16_t *getuAdcData() { return uAdcData; }; + void writeRegister(uint8_t, uint8_t); + uint8_t readRegister(uint8_t); + uint16_t readData(); + void setMux(InputMux); + void setPGAGain(PGAGain); + void setDataRate(DataRate); + void startConversion(); + void stopConversion(); private: SPIClass spi; - SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE0); + SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE1); uint8_t SS_PIN; - uint8_t POWER_SEQ_PIN; - bool HAS_SEQ_PIN = false; - // 16-bit data words for SPI - const uint16_t SET_CHANNEL_REG = 0x8000; - const uint16_t CONFIG_PROGRAM_REG = 0x2840; - const uint16_t MANUAL_READ = 0x1000; - const uint16_t AUTO_READ_RESET = 0x2C40; - const uint16_t AUTO_READ_NEXT = 0x2000; - const uint8_t WAKEUP = 0x02; - const uint8_t POWERDOWN = 0x04; - const uint8_t RESET = 0x06; - - uint16_t uAdcData[16]{}; //array of the latest data; 0 for channels not being used - uint16_t uActiveChannels = 0; // each bit represents a channel; 1=used, 0=unused - uint16_t uNumChannels = 0; // number of channels being used; - - uint16_t transfer(uint16_t uData); + uint8_t DRDY_PIN; + // Commands for interfacing with adc + static const uint8_t WAKEUP = 0x02; + static const uint8_t POWERDOWN = 0x04; + static const uint8_t RESET = 0x06; + static const uint8_t START = 0x016; + static const uint8_t STOP = 0x0a; + static const uint8_t SYOCAL = 0x16; // System offset calibration + static const uint8_t SYGCAL = 0x17; // System gain calibration + static const uint8_t SFOCAL = 0x19; // Self offset calibration + static const uint16_t RDATA = 0x1200; }; -#endif \ No newline at end of file +#endif diff --git a/Node/Common/drivers/src/adc_ADS114S0.cpp b/Node/Common/drivers/src/adc_ADS114S0.cpp index d03b714..7003a72 100644 --- a/Node/Common/drivers/src/adc_ADS114S0.cpp +++ b/Node/Common/drivers/src/adc_ADS114S0.cpp @@ -1,17 +1,104 @@ #include "adc_ADS114S0.h" -ADS114S0::ADS114S0(SPIClass spi, uint8_t SS_PIN, uint8_t POWER_SEQ_PIN) : spi(spi), SS_PIN(SS_PIN), POWER_SEQ_PIN(POWER_SEQ_PIN) -{ - HAS_SEQ_PIN = true; -} - ADS114S0::ADS114S0(SPIClass spi, uint8_t SS_PIN) : spi(spi), SS_PIN(SS_PIN) { } void ADS114S0::init() { - spi.begin(); pinMode(SS_PIN, OUTPUT); + spi.begin(); + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + uint8_t reset = spi.transfer(RESET); + delay(4096 * (1 / 20000000)); + uint16_t resetStatus = spi.transfer16(0x3101); + uint8_t writeReg = spi.transfer(0x00); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +void ADS114S0::writeRegister(uint8_t reg, uint8_t value) +{ + uint16_t command = ((0x40 + reg) << 8) + 0x01; + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer16(command); + spi.transfer(value); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +uint8_t ADS114S0::readRegister(uint8_t reg) +{ + uint16_t command = ((0x20 + reg) << 8) + 0x01; + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer16(command); + uint8_t data = spi.transfer(0x00); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); + return data; +} + +uint16_t ADS114S0::readData() +{ + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer(RDATA); + uint16_t data = spi.transfer16(0x0000); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); + return data; +} + +void ADS114S0::setMux(InputMux mux) +{ + uint16_t writeCommand = 0x4201; + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer16(writeCommand); + spi.transfer(mux); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +void ADS114S0::setPGAGain(PGAGain gain) +{ + uint16_t writeCommand = 0x4301; + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer16(writeCommand); + spi.transfer(gain); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +void ADS114S0::setDataRate(DataRate rate) +{ + uint16_t writeCommand = 0x4401; + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer16(writeCommand); + spi.transfer(rate); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +void ADS114S0::startConversion() +{ + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer(START); + digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); +} + +void ADS114S0::stopConversion() +{ + spi.beginTransaction(spiSettings); + digitalWrite(SS_PIN, LOW); + spi.transfer(STOP); digitalWrite(SS_PIN, HIGH); + spi.endTransaction(); } \ No newline at end of file From c08f0cf86aed19b3adb47abea96596c617e86ea2 Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Mon, 22 Jun 2020 17:59:05 -0230 Subject: [PATCH 4/8] move constant register values into enum --- Node/Common/drivers/inc/adc_ADS114S0.h | 33 ++++++++++++++------------ 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index f832dc1..abb0cec 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -3,7 +3,7 @@ #include -enum InputMux +enum class InputMux: uint8_t { MUX_SINGLE_0 = 0x0C, // Single-ended AIN0 MUX_SINGLE_1 = 0x1C, // Single-ended AIN1 @@ -19,7 +19,7 @@ enum InputMux MUX_SINGLE_11 = 0xBC // Single-ended AIN11 }; -enum PGAGain +enum class PGAGain: uint8_t { GAIN_DISABLE = 0x00, // Default GAIN_2 = 0x09, @@ -31,7 +31,7 @@ enum PGAGain GAIN_128 = 0x0F }; -enum DataRate +enum class DataRate: uint8_t { SPS_2_5 = 0x10, // 2.5 Samples Per Second SPS_5 = 0x11, // 5 Samples Per Second @@ -49,10 +49,23 @@ enum DataRate SPS_4000 = 0x1D // 4000 Samples Per Second }; +enum class Command: uint8_t +{ + WAKEUP = 0x02, + POWERDOWN = 0x04, + RESET = 0x06, + START = 0x08, + STOP = 0x0A, + SYOCAL = 0x16, // System offset calibration + SYGCAL = 0x17, // System gain calibration + SFOCAL = 0x19, // Self offset calibration + RDATA = 0x12 +}; + class ADS114S0 { public: - ADS114S0(SPIClass spi, uint8_t SS_PIN); + ADS114S0(uint8_t CS); void init(); void writeRegister(uint8_t, uint8_t); uint8_t readRegister(uint8_t); @@ -66,18 +79,8 @@ class ADS114S0 private: SPIClass spi; SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE1); - uint8_t SS_PIN; + uint8_t CS; uint8_t DRDY_PIN; - // Commands for interfacing with adc - static const uint8_t WAKEUP = 0x02; - static const uint8_t POWERDOWN = 0x04; - static const uint8_t RESET = 0x06; - static const uint8_t START = 0x016; - static const uint8_t STOP = 0x0a; - static const uint8_t SYOCAL = 0x16; // System offset calibration - static const uint8_t SYGCAL = 0x17; // System gain calibration - static const uint8_t SFOCAL = 0x19; // Self offset calibration - static const uint16_t RDATA = 0x1200; }; #endif From fa91f2219d514a5fa413fc41583d240e9dd5fc2c Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Thu, 2 Jul 2020 23:32:20 -0230 Subject: [PATCH 5/8] Add more enums for readability, nuke original method definitions and start from scratch --- Node/Common/drivers/inc/adc_ADS114S0.h | 68 ++++++++--- Node/Common/drivers/src/adc_ADS114S0.cpp | 138 +++++++++++------------ 2 files changed, 122 insertions(+), 84 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index abb0cec..db88f30 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -3,7 +3,26 @@ #include -enum class InputMux: uint8_t +enum Register : uint8_t +{ + STATUS = 0x01, + INPMUX = 0x02, + PGA = 0x03, + DATARATE = 0x04, + REF = 0x05, + IDACMAG = 0x06, + IDACMUX = 0x07, + VBIAS = 0x08, + SYS = 0x09, + OFCAL0 = 0x0B, + OFCAL1 = 0x0C, + FSCAL0 = 0x0E, + FSCAL1 = 0x0F, + GPIODAT = 0x10, + GPIOCON = 0x11 +}; + +enum InputMux : uint8_t { MUX_SINGLE_0 = 0x0C, // Single-ended AIN0 MUX_SINGLE_1 = 0x1C, // Single-ended AIN1 @@ -19,9 +38,10 @@ enum class InputMux: uint8_t MUX_SINGLE_11 = 0xBC // Single-ended AIN11 }; -enum class PGAGain: uint8_t +enum PGAGain : uint8_t { GAIN_DISABLE = 0x00, // Default + GAIN_1 = 0x08, GAIN_2 = 0x09, GAIN_4 = 0x0A, GAIN_8 = 0x0B, @@ -31,7 +51,7 @@ enum class PGAGain: uint8_t GAIN_128 = 0x0F }; -enum class DataRate: uint8_t +enum DataRate : uint8_t { SPS_2_5 = 0x10, // 2.5 Samples Per Second SPS_5 = 0x11, // 5 Samples Per Second @@ -49,7 +69,19 @@ enum class DataRate: uint8_t SPS_4000 = 0x1D // 4000 Samples Per Second }; -enum class Command: uint8_t +enum ConversionMode : uint8_t +{ + SINGLE = 0x10, + CONTINUOUS = 0x30 +}; + +enum ClockSource : uint8_t +{ + INTERNAL_CLK = 0x10, + EXTERNAL_CLK = 0x50 +}; + +enum Command : uint8_t { WAKEUP = 0x02, POWERDOWN = 0x04, @@ -62,24 +94,34 @@ enum class Command: uint8_t RDATA = 0x12 }; +static const uint16_t RREG = 0x2000; +static const uint16_t WREG = 0x3000; +static const uint8_t DEFAULTS[] = { 0x80, 0x01, 0x00, 0x14, 0x10, 0x00, + 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00 }; + class ADS114S0 { public: - ADS114S0(uint8_t CS); - void init(); - void writeRegister(uint8_t, uint8_t); - uint8_t readRegister(uint8_t); + ADS114S0(const uint8_t CS); + void beginSPI(); + void endSPI(); + void reset(); + void writeRegister(const Register, const uint8_t); + void writeRegisters(const Register, const uint8_t[], const uint8_t); + uint8_t readRegister(const Register); + void ADS114S0::readRegisters(const Register, uint8_t[], const uint8_t); uint16_t readData(); - void setMux(InputMux); - void setPGAGain(PGAGain); - void setDataRate(DataRate); + void setMux(const InputMux); + void setPGAGain(const PGAGain); + void setMode(const DataRate, const ClockSource, const ConversionMode); void startConversion(); void stopConversion(); + static const uint32_t SPI_CLOCK = 20000000; private: - SPIClass spi; SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE1); - uint8_t CS; + const uint8_t m_CS; uint8_t DRDY_PIN; }; diff --git a/Node/Common/drivers/src/adc_ADS114S0.cpp b/Node/Common/drivers/src/adc_ADS114S0.cpp index 7003a72..f8945af 100644 --- a/Node/Common/drivers/src/adc_ADS114S0.cpp +++ b/Node/Common/drivers/src/adc_ADS114S0.cpp @@ -1,104 +1,100 @@ #include "adc_ADS114S0.h" -ADS114S0::ADS114S0(SPIClass spi, uint8_t SS_PIN) : spi(spi), SS_PIN(SS_PIN) +ADS114S0::ADS114S0(const uint8_t CS) + : m_CS(CS) { + SPI.begin(); + + pinMode(m_CS, OUTPUT); + endSPI(); } -void ADS114S0::init() +void ADS114S0::beginSPI() { - pinMode(SS_PIN, OUTPUT); - spi.begin(); - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - uint8_t reset = spi.transfer(RESET); - delay(4096 * (1 / 20000000)); - uint16_t resetStatus = spi.transfer16(0x3101); - uint8_t writeReg = spi.transfer(0x00); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); + SPI.beginTransaction(SPISettings(SPI_CLOCK, MSB_FIRST, SPI_MODE1)); + digitalWrite(m_CS, LOW); } -void ADS114S0::writeRegister(uint8_t reg, uint8_t value) +void ADS114S0::endSPI() { - uint16_t command = ((0x40 + reg) << 8) + 0x01; - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer16(command); - spi.transfer(value); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); + digitalWrite(m_CS, HIGH); + SPI.endTransaction(); } -uint8_t ADS114S0::readRegister(uint8_t reg) +void ADS114S0::reset() { - uint16_t command = ((0x20 + reg) << 8) + 0x01; - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer16(command); - uint8_t data = spi.transfer(0x00); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); - return data; + beginSPI(); + SPI.transfer(RESET); + endSPI(); + + delay(10); + + writeRegisters(STATUS, DEFAULTS, 16); } -uint16_t ADS114S0::readData() +void ADS114S0::writeRegister(const Register reg, const uint8_t value) +{ + beginSPI(); + SPI.transfer16(WREG | reg<<16); + SPI.transfer(value); + endSPI(); +} + +void ADS114S0::writeRegisters(const Register reg, const uint8_t values[], const uint8_t num) +{ + beginSPI(); + SPI.transfer16(WREG | reg<<16 | (num - 1)<<8); + for (uint8_t i = 0; i < num; i++) + { + SPI.transfer(values[i]); + } + endSPI(); +} + +uint8_t ADS114S0::readRegister(const Register reg) +{ + beginSPI(); + SPI.transfer16(RREG | reg<<16); + uint8_t value = SPI.transfer(0x00); + endSPI(); + + return value; +} + +void ADS114S0::readRegisters(const Register reg, uint8_t values[], const uint8_t num) { - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer(RDATA); - uint16_t data = spi.transfer16(0x0000); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); - return data; + beginSPI(); + SPI.transfer16(RREG | reg<<16 | (num - 1)<<8); + for (uint8_t i = 0; i < num; i++) + { + values[i] = SPI.transfer(0x00); + } + endSPI(); } -void ADS114S0::setMux(InputMux mux) +void ADS114S0::setMux(const InputMux mux) { - uint16_t writeCommand = 0x4201; - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer16(writeCommand); - spi.transfer(mux); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); + writeRegister(INPMUX, mux); } -void ADS114S0::setPGAGain(PGAGain gain) +void ADS114S0::setPGAGain(const PGAGain gain) { - uint16_t writeCommand = 0x4301; - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer16(writeCommand); - spi.transfer(gain); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); + writeRegister(PGA, gain); } -void ADS114S0::setDataRate(DataRate rate) +void ADS114S0::setMode(const DataRate rate, const ClockSource clock, const ConversionMode mode) { - uint16_t writeCommand = 0x4401; - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer16(writeCommand); - spi.transfer(rate); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); + writeRegister(DATARATE, rate | clock | mode); } void ADS114S0::startConversion() { - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer(START); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); } void ADS114S0::stopConversion() { - spi.beginTransaction(spiSettings); - digitalWrite(SS_PIN, LOW); - spi.transfer(STOP); - digitalWrite(SS_PIN, HIGH); - spi.endTransaction(); +} + +uint16_t ADS114S0::readData() +{ } \ No newline at end of file From b4b54f86c4e2775f43345788c361e33a7675a4b9 Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Fri, 3 Jul 2020 09:33:33 -0230 Subject: [PATCH 6/8] Continue defining methods --- Node/Common/drivers/inc/adc_ADS114S0.h | 1 + Node/Common/drivers/src/adc_ADS114S0.cpp | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index db88f30..99429d2 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -115,6 +115,7 @@ class ADS114S0 void setMux(const InputMux); void setPGAGain(const PGAGain); void setMode(const DataRate, const ClockSource, const ConversionMode); + void setConversionMode(const ConversionMode); void startConversion(); void stopConversion(); diff --git a/Node/Common/drivers/src/adc_ADS114S0.cpp b/Node/Common/drivers/src/adc_ADS114S0.cpp index f8945af..254a7a7 100644 --- a/Node/Common/drivers/src/adc_ADS114S0.cpp +++ b/Node/Common/drivers/src/adc_ADS114S0.cpp @@ -11,7 +11,7 @@ ADS114S0::ADS114S0(const uint8_t CS) void ADS114S0::beginSPI() { - SPI.beginTransaction(SPISettings(SPI_CLOCK, MSB_FIRST, SPI_MODE1)); + SPI.beginTransaction(SPISettings(SPI_CLOCK, MSBFIRST, SPI_MODE1)); digitalWrite(m_CS, LOW); } @@ -87,14 +87,32 @@ void ADS114S0::setMode(const DataRate rate, const ClockSource clock, const Conve writeRegister(DATARATE, rate | clock | mode); } +void ADS114S0::setConversionMode(const ConversionMode mode) +{ + uint8_t currentSettings = readRegister(DATARATE); + writeRegister(DATARATE, currentSettings | mode); +} + void ADS114S0::startConversion() { + beginSPI(); + SPI.transfer(START); + endSPI(); } void ADS114S0::stopConversion() { + beginSPI(); + SPI.transfer(STOP); + endSPI(); } uint16_t ADS114S0::readData() { -} \ No newline at end of file + beginSPI(); + SPI.transfer(RDATA); + uint16_t data = SPI.transfer16(0x0000); + endSPI(); + + return data; +} From e6e36fc3d3010702022b14fa89003ac70e53459b Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Tue, 7 Jul 2020 13:26:54 -0230 Subject: [PATCH 7/8] fix method definition and remove unnecessary data members --- Node/Common/drivers/inc/adc_ADS114S0.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index 99429d2..dd1df81 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -110,7 +110,7 @@ class ADS114S0 void writeRegister(const Register, const uint8_t); void writeRegisters(const Register, const uint8_t[], const uint8_t); uint8_t readRegister(const Register); - void ADS114S0::readRegisters(const Register, uint8_t[], const uint8_t); + void readRegisters(const Register, uint8_t[], const uint8_t); uint16_t readData(); void setMux(const InputMux); void setPGAGain(const PGAGain); @@ -121,9 +121,7 @@ class ADS114S0 static const uint32_t SPI_CLOCK = 20000000; private: - SPISettings spiSettings = SPISettings(20000000, MSBFIRST, SPI_MODE1); const uint8_t m_CS; - uint8_t DRDY_PIN; }; #endif From 1faf52a0adcbe0849880f728ff0d0a7991914ead Mon Sep 17 00:00:00 2001 From: Daniel Burke Date: Wed, 15 Jul 2020 20:33:44 -0230 Subject: [PATCH 8/8] Change a couple of global constants to constexpr --- Node/Common/drivers/inc/adc_ADS114S0.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Node/Common/drivers/inc/adc_ADS114S0.h b/Node/Common/drivers/inc/adc_ADS114S0.h index dd1df81..ef175f3 100644 --- a/Node/Common/drivers/inc/adc_ADS114S0.h +++ b/Node/Common/drivers/inc/adc_ADS114S0.h @@ -94,9 +94,9 @@ enum Command : uint8_t RDATA = 0x12 }; -static const uint16_t RREG = 0x2000; -static const uint16_t WREG = 0x3000; -static const uint8_t DEFAULTS[] = { 0x80, 0x01, 0x00, 0x14, 0x10, 0x00, +constexpr uint16_t RREG = 0x2000; +constexpr uint16_t WREG = 0x3000; +constexpr uint8_t DEFAULTS[] = { 0x80, 0x01, 0x00, 0x14, 0x10, 0x00, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00 };