0.3.0 DAC8551

This commit is contained in:
Rob Tillaart 2023-12-02 10:36:26 +01:00
parent 26de9a464e
commit 1f503b9d80
12 changed files with 128 additions and 158 deletions

View File

@ -6,12 +6,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.3.0] - 2023-12-01
- refactor constructor interface - breaking changes.
- minimize conditional code. -- create SPI_CLASS macro to solve it.
- update readme.md
- update examples
----
## [0.2.7] - 2023-09-23
- add example DAC8531_hw_spi.ino + screenshot
- update readme.md
- minor edits
## [0.2.6] - 2022-10-31
- add changelog.md
- add rp2040 to build-CI

View File

@ -2,26 +2,30 @@
// FILE: DAC8551.cpp
// AUTHOR: Rob Tillaart
// PURPOSE: Arduino library for DAC8551 SPI Digital Analog Convertor
// VERSION: 0.2.7
// VERSION: 0.3.0
// URL: https://github.com/RobTillaart/DAC8551
#include "DAC8551.h"
DAC8551::DAC8551(uint8_t slaveSelect)
DAC8551::DAC8551(uint8_t select, __SPI_CLASS__ * spi)
{
_hwSPI = true;
_select = slaveSelect;
_select = select;
_dataOut = 255;
_clock = 255;
_mySPI = spi;
_hwSPI = true;
}
DAC8551::DAC8551(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
DAC8551::DAC8551(uint8_t select, uint8_t spiData, uint8_t spiClock)
{
_hwSPI = false;
_select = select;
_dataOut = spiData;
_clock = spiClock;
_select = slaveSelect;
_mySPI = NULL;
_hwSPI = false;
}
@ -36,27 +40,11 @@ void DAC8551::begin()
if(_hwSPI)
{
#if defined(ESP32)
if (_useHSPI) // HSPI
{
mySPI = new SPIClass(HSPI);
mySPI->end();
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
}
else // VSPI
{
mySPI = new SPIClass(VSPI);
mySPI->end();
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
}
#else // generic hardware SPI
mySPI = &SPI;
mySPI->end();
mySPI->begin();
#endif
_mySPI->end();
_mySPI->begin();
delay(1);
}
else // software SPI
else // SOFTWARE SPI
{
pinMode(_dataOut, OUTPUT);
pinMode(_clock, OUTPUT);
@ -69,21 +57,6 @@ void DAC8551::begin()
}
#if defined(ESP32)
void DAC8551::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
{
_clock = clk;
_dataOut = mosi;
_select = select;
pinMode(_select, OUTPUT);
digitalWrite(_select, HIGH);
mySPI->end(); // disable SPI
mySPI->begin(clk, miso, mosi, select);
}
#endif
// value = 0..65535
void DAC8551::setValue(uint16_t value)
{
@ -121,7 +94,7 @@ void DAC8551::setSPIspeed(uint32_t speed)
//////////////////////////////////////////////////////////////////
//
// PRIVATE
// PROTECTED
//
void DAC8551::updateDevice()
{
@ -130,11 +103,11 @@ void DAC8551::updateDevice()
digitalWrite(_select, LOW);
if (_hwSPI)
{
mySPI->beginTransaction(_spi_settings);
mySPI->transfer(configRegister);
mySPI->transfer(_value >> 8);
mySPI->transfer(_value & 0xFF);
mySPI->endTransaction();
_mySPI->beginTransaction(_spi_settings);
_mySPI->transfer(configRegister);
_mySPI->transfer(_value >> 8);
_mySPI->transfer(_value & 0xFF);
_mySPI->endTransaction();
}
else // Software SPI
{
@ -162,38 +135,34 @@ void DAC8551::swSPI_transfer(uint8_t value)
/////////////////////////////////////////////////////////
//
// derive 8501, 8531 and 8550 from 8551
// DERIVED CLASSES DAC8501, DAC8531, DAC8550
//
DAC8501::DAC8501(uint8_t select, __SPI_CLASS__ * spi) : DAC8551(select, spi)
{
}
DAC8501::DAC8501(uint8_t slaveSelect) : DAC8551(slaveSelect)
DAC8501::DAC8501(uint8_t select, uint8_t spiData, uint8_t spiClock)
: DAC8551(select, spiData, spiClock)
{
}
DAC8531::DAC8531(uint8_t select, __SPI_CLASS__ * spi) : DAC8551(select, spi)
{
}
DAC8531::DAC8531(uint8_t select, uint8_t spiData, uint8_t spiClock)
: DAC8551(select, spiData, spiClock)
{
}
DAC8501::DAC8501(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
: DAC8551(spiData, spiClock, slaveSelect)
DAC8550::DAC8550(uint8_t select, __SPI_CLASS__ * spi) : DAC8551(select, spi)
{
}
DAC8531::DAC8531(uint8_t slaveSelect) : DAC8551(slaveSelect)
{
}
DAC8531::DAC8531(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
: DAC8551(spiData, spiClock, slaveSelect)
{
}
DAC8550::DAC8550(uint8_t slaveSelect) : DAC8551(slaveSelect)
{
}
DAC8550::DAC8550(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
: DAC8551(spiData, spiClock, slaveSelect)
DAC8550::DAC8550(uint8_t select, uint8_t spiData, uint8_t spiClock)
: DAC8551(select, spiData, spiClock)
{
}

View File

@ -4,7 +4,7 @@
// AUTHOR: Rob Tillaart
// PURPOSE: Arduino library for DAC8551 SPI Digital Analog Convertor
// could work with DAC8550, not tested
// VERSION: 0.2.7
// VERSION: 0.3.0
// HISTORY: See DAC8551.cpp
// URL: https://github.com/RobTillaart/DAC8551
//
@ -14,7 +14,7 @@
#include "SPI.h"
#define DAC8551_LIB_VERSION (F("0.2.7"))
#define DAC8551_LIB_VERSION (F("0.3.0"))
#define DAC8551_POWERDOWN_NORMAL 0
@ -23,11 +23,20 @@
#define DAC8551_POWERDOWN_HIGH_IMP 3
#ifndef __SPI_CLASS__
#if defined(ARDUINO_ARCH_RP2040)
#define __SPI_CLASS__ SPIClassRP2040
#else
#define __SPI_CLASS__ SPIClass
#endif
#endif
class DAC8551
{
public:
DAC8551(uint8_t slaveSelect);
DAC8551(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect);
DAC8551(uint8_t select, __SPI_CLASS__ * spi = &SPI);
DAC8551(uint8_t select, uint8_t spiData, uint8_t spiClock);
void begin();
@ -43,16 +52,6 @@ public:
bool usesHWSPI() { return _hwSPI; };
// ESP32 specific
#if defined(ESP32)
void selectHSPI() { _useHSPI = true; };
void selectVSPI() { _useHSPI = false; };
bool usesHSPI() { return _useHSPI; };
bool usesVSPI() { return !_useHSPI; };
// to overrule ESP32 default hardware pins
void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select);
#endif
protected:
uint8_t _dataOut = 255;
@ -68,19 +67,14 @@ protected:
void updateDevice();
void swSPI_transfer(uint8_t value);
SPIClass * mySPI;
SPISettings _spi_settings;
#if defined(ESP32)
bool _useHSPI = true;
#endif
__SPI_CLASS__ * _mySPI;
SPISettings _spi_settings;
};
/////////////////////////////////////////////////////////
//
// derive 8501, 8531 and 8550 from 8551
// DERIVED DAC8501, DAC8531, DAC8550
//
#define DAC8501_POWERDOWN_NORMAL 0
@ -92,9 +86,8 @@ protected:
class DAC8501 : public DAC8551
{
public:
DAC8501(uint8_t slaveSelect);
DAC8501(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect);
DAC8501(uint8_t select, __SPI_CLASS__ * spi = &SPI);
DAC8501(uint8_t select, uint8_t spiData, uint8_t spiClock);
};
@ -107,9 +100,8 @@ public:
class DAC8531 : public DAC8551
{
public:
DAC8531(uint8_t slaveSelect);
DAC8531(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect);
DAC8531(uint8_t select, __SPI_CLASS__ * spi = &SPI);
DAC8531(uint8_t select, uint8_t spiData, uint8_t spiClock);
};
@ -122,11 +114,10 @@ public:
class DAC8550 : public DAC8551
{
public:
DAC8550(uint8_t slaveSelect);
DAC8550(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect);
DAC8550(uint8_t select, __SPI_CLASS__ * spi = &SPI);
DAC8550(uint8_t select, uint8_t spiData, uint8_t spiClock);
};
// -- END OF FILE --
// -- END OF FILE --

View File

@ -24,8 +24,23 @@ They all have classes derived 1 to 1 from DAC8551.
**Warning** this library is not tested extensively.
#### 0.3.0 Breaking change
The version 0.3.0 has breaking changes in the interface.
The essence is removal of ESP32 specific code from the library.
This makes it possible to support the ESP32-S3 and other processors in the future.
Also it makes the library a bit simpler to maintain.
Note order of parameters changed.
#### Related
- https://github.com/RobTillaart/DAC8550
- https://github.com/RobTillaart/DAC8551
- https://github.com/RobTillaart/DAC8552
- https://github.com/RobTillaart/DAC8554
- https://github.com/RobTillaart/MCP_DAC
- https://github.com/RobTillaart/AD5680 (18 bit DAC)
@ -37,15 +52,13 @@ They all have classes derived 1 to 1 from DAC8551.
### Core
- **DAC8501(uint8_t slaveSelect)** Constructor for DAC8501 with hardware SPI,
- **DAC8531(uint8_t slaveSelect)** Constructor for DAC8531 with hardware SPI,
- **DAC8550(uint8_t slaveSelect)** Constructor for DAC8550 with hardware SPI,
- **DAC8551(uint8_t slaveSelect)** Constructor for DAC8551 with hardware SPI,
since 0.2.0 the slaveSelect pin needs to be defined.
- **DAC8501(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)** Constructor for the software SPI
- **DAC8531(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)** Constructor for the software SPI
- **DAC8550(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)** Constructor for the software SPI
- **DAC8551(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)** Constructor for the software SPI
- **DAC8551(uint8_t select, SPIClassRP2040 \* spi = &SPI)** Constructor HW SPI RP2040.
- **DAC8551(uint8_t select, SPIClass \* spi = &SPI)** Constructor HW SPI other.
- **DAC8551(uint8_t select, uint8_t spiData, uint8_t spiClock)** Constructor SW SPI.
- **DAC8501(...)** idem constructors for DAC8501.
- **DAC8531(...)** idem constructors for DAC8531.
- **DAC8550(...)** idem constructors for DAC8550.
- **DAC8551(...)** idem constructors for DAC8551.
- **void begin()** initializes all pins to default state
- **void setValue(uint16_t value)** set the value of the channel to 0 - 65535
- **uint16_t getValue()** returns the last value written.
@ -60,24 +73,6 @@ To be used only if one needs a specific speed.
- **bool usesHWSPI()** returns true if HW SPI is used.
### ESP32 specific
- **void selectHSPI()** in case hardware SPI, the ESP32 has two options HSPI and VSPI.
- **void selectVSPI()** see above.
- **bool usesHSPI()** returns true if HSPI is used.
- **bool usesVSPI()** returns true if VSPI is used.
The **selectVSPI()** or the **selectHSPI()** needs to be called
BEFORE the **begin()** function.
#### experimental
- **void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)**
overrule GPIO pins of ESP32 for hardware SPI.
Needs to be called AFTER the **begin()** function.
### Power down
check datasheet for details.

View File

@ -7,21 +7,24 @@
#include "DAC8551.h"
DAC8531 mydac(8); // CLK=D13, MISO=D11, SS = D8
// select, data, clock
DAC8531 mydac(8, 11, 13);
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("DAC8551_LIB_VERSION: ");
Serial.println(DAC8551_LIB_VERSION);
mydac.begin();
}
void loop()
{
// minimal sawtooth
// minimal sawtooth
for (uint16_t val = 0; val < 65500; val += 30)
{
mydac.setValue(val);
@ -34,7 +37,7 @@ void loop()
}
Serial.println();
// minimal sinus
// minimal sinus
for (long i = 0; i < 360; i++ )
{
long s = 32768 + 32768 * sin( i * (PI / 180.0));
@ -51,3 +54,4 @@ void loop()
// -- END OF FILE --

View File

@ -6,23 +6,27 @@
#include "DAC8551.h"
#include "Wire.h"
// HW SPI uses slave spin since 0.2.0
DAC8531 mydac(1);
SPIClass * mySPI = new SPIClass(VSPI); // HSPI
// select, address HW SPI
DAC8531 mydac(5, mySPI);
void setup()
{
Serial.begin(115200);
mydac.selectVSPI();
Serial.println(__FILE__);
Serial.print("DAC8551_LIB_VERSION: ");
Serial.println(DAC8551_LIB_VERSION);
mydac.begin();
}
void loop()
{
// minimal sawtooth
// minimal sawtooth
for (uint16_t val = 0; val < 65500; val += 30)
{
mydac.setValue(val);
@ -35,7 +39,7 @@ void loop()
}
Serial.println();
// minimal sinus
// minimal sinus
for (long i = 0; i < 360; i++ )
{
long s = 32768 + 32768 * sin( i * (PI / 180.0));
@ -51,4 +55,5 @@ void loop()
}
// -- END OF FILE --
// -- END OF FILE --

View File

@ -9,22 +9,24 @@
#include "DAC8551.h"
// HW SPI uses slave spin since 0.2.0
DAC8551 mydac(10);
// select, address HW SPI
DAC8551 mydac(10, &SPI); // explicit SPI
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("DAC8551_LIB_VERSION: ");
Serial.println(DAC8551_LIB_VERSION);
mydac.begin();
}
void loop()
{
// minimal sawtooth
// minimal sawtooth
for (uint16_t val = 0; val < 65500; val += 30)
{
mydac.setValue(val);
@ -37,7 +39,7 @@ void loop()
}
Serial.println();
// minimal sinus
// minimal sinus
for (long i = 0; i < 360; i++ )
{
long s = 32768 + 32768 * sin( i * (PI / 180.0));

View File

@ -10,15 +10,17 @@
#include "DAC8551.h"
// HW SPI uses slave spin since 0.2.0
DAC8551 mydac(10);
// select, address HW SPI
DAC8551 mydac(10); // uses default
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("DAC8551_LIB_VERSION: ");
Serial.println(DAC8551_LIB_VERSION);
mydac.begin();
}
@ -51,5 +53,5 @@ void loop()
}
// -- END OF FILE --
// -- END OF FILE --

View File

@ -10,7 +10,7 @@
#include "DAC8551.h"
// SW SPI pins 4,5,6
// SW SPI pins select, data, clock
DAC8551 mydac(4, 5, 6);
@ -18,7 +18,9 @@ void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("DAC8551_LIB_VERSION: ");
Serial.println(DAC8551_LIB_VERSION);
mydac.begin();
}

View File

@ -19,13 +19,6 @@ getSPIspeed KEYWORD2
usesHWSPI KEYWORD2
selectHSPI KEYWORD2
selectVSPI KEYWORD2
usesHSPI KEYWORD2
usesVSPI KEYWORD2
setGPIOpins KEYWORD2
# Constants (LITERAL1)
DAC8551_LIB_VERSION LITERAL1

View File

@ -15,7 +15,7 @@
"type": "git",
"url": "https://github.com/RobTillaart/DAC8551"
},
"version": "0.2.7",
"version": "0.3.0",
"license": "MIT",
"frameworks": "*",
"platforms": "*",

View File

@ -1,8 +1,8 @@
name=DAC8551
version=0.2.7
version=0.3.0
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for DAC8501, DAC8531, DAC8550 and DAC8551 SPI 16-bit Digital Analog Convertor
sentence=Arduino library for DAC8501, DAC8531, DAC8550 and DAC8551 SPI 16-bit Digital Analog Convertor.
paragraph=
category=Sensors
url=https://github.com/RobTillaart/DAC8551