0.2.2 DAC8552

This commit is contained in:
rob tillaart 2021-08-30 13:27:26 +02:00
parent 7363c27ccb
commit 3f9673486c
7 changed files with 176 additions and 56 deletions

View File

@ -4,10 +4,14 @@ name: Arduino CI
on: [push, pull_request]
jobs:
arduino_ci:
runTest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: Arduino-CI/action@master
# Arduino-CI/action@v0.1.1
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.6
- run: |
gem install arduino_ci
arduino_ci.rb

View File

@ -2,17 +2,18 @@
// FILE: DAC8552.cpp
// AUTHOR: Rob Tillaart
// PURPOSE: Arduino library for DAC8552 SPI Digital Analog Convertor
// VERSION: 0.2.1
// VERSION: 0.2.2
// URL: https://github.com/RobTillaart/DAC8552
//
// HISTORY:
// 0.1.0: 2017-12-14 initial version
// 0.1.1: 2017-12-19 fix begin() bug
// 0.1.2 2020-04-06 minor refactor, readme.md
// 0.1.3 2020-06-07 fix library.json
// 0.2.0 2020-12-18 add arduino-ci + unit test
// add slave select pin for HW constructor
// 0.2.1 2021-06-02 compile ESP32 + fix for channel B
// 0.1.0: 2017-12-14 initial version
// 0.1.1: 2017-12-19 fix begin() bug
// 0.1.2 2020-04-06 minor refactor, readme.md
// 0.1.3 2020-06-07 fix library.json
// 0.2.0 2020-12-18 add arduino-ci + unit test
// add slave select pin for HW constructor
// 0.2.1 2021-06-02 compile ESP32 + fix for channel B
// 0.2.2 2021-08-29 add support for HSPI / VSPI ESP32 ++
#include "DAC8552.h"
@ -24,16 +25,16 @@
DAC8552::DAC8552(uint8_t slaveSelect)
{
_hwSPI = true;
_slaveSelect = slaveSelect;
_select = slaveSelect;
}
DAC8552::DAC8552(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
{
_hwSPI = false;
_spiData = spiData;
_spiClock = spiClock;
_slaveSelect = slaveSelect;
_hwSPI = false;
_dataOut = spiData;
_clock = spiClock;
_select = slaveSelect;
}
@ -41,20 +42,39 @@ DAC8552::DAC8552(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
// and sets internal state
void DAC8552::begin()
{
pinMode(_slaveSelect, OUTPUT);
digitalWrite(_slaveSelect, HIGH);
pinMode(_select, OUTPUT);
digitalWrite(_select, HIGH);
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
if(_hwSPI)
{
SPI.begin();
#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
delay(1);
}
else
else // software SPI
{
pinMode(_spiData, OUTPUT);
pinMode(_spiClock, OUTPUT);
digitalWrite(_spiData, LOW);
digitalWrite(_spiClock, LOW);
pinMode(_dataOut, OUTPUT);
pinMode(_clock, OUTPUT);
digitalWrite(_dataOut, LOW);
digitalWrite(_clock, LOW);
}
_value[0] = 0;
@ -64,6 +84,21 @@ void DAC8552::begin()
}
#if defined(ESP32)
void DAC8552::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
// channel = 0, 1, 2, 3 depending on type
// value = 0..65535
void DAC8552::bufferValue(uint8_t channel, uint16_t value)
@ -112,6 +147,18 @@ uint8_t DAC8552::getPowerDownMode(uint8_t channel)
}
void DAC8552::setSPIspeed(uint32_t speed)
{
_SPIspeed = speed;
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
};
//////////////////////////////////////////////////////////////////
//
// PRIVATE
//
// channel = 0, 1, 2, 3 depending on type
// direct = true ==> write buffers to both channel A and channel B
// direct = false ==> buffer value
@ -120,35 +167,35 @@ void DAC8552::updateDevice(uint8_t channel, bool directWrite)
uint8_t configRegister = _register[channel];
if (directWrite) configRegister |= 0x30;
digitalWrite(_select, LOW);
if (_hwSPI)
{
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
digitalWrite(_slaveSelect, LOW);
SPI.transfer(configRegister);
SPI.transfer(_value[channel] >> 8);
SPI.transfer(_value[channel] & 0xFF);
digitalWrite(_slaveSelect, HIGH);
SPI.endTransaction();
mySPI->beginTransaction(_spi_settings);
mySPI->transfer(configRegister);
mySPI->transfer(_value[channel] >> 8);
mySPI->transfer(_value[channel] & 0xFF);
mySPI->endTransaction();
}
else // Software SPI
{
digitalWrite(_slaveSelect, LOW);
swSPI_transfer(configRegister);
swSPI_transfer(_value[channel] >> 8);
swSPI_transfer(_value[channel] & 0xFF);
digitalWrite(_slaveSelect, HIGH);
}
digitalWrite(_select, HIGH);
}
// simple one mode version
void DAC8552::swSPI_transfer(uint8_t value)
{
uint8_t clk = _clock;
uint8_t dao = _dataOut;
for (uint8_t mask = 0x80; mask; mask >>= 1)
{
digitalWrite(_spiData,(value & mask) != 0);
digitalWrite(_spiClock, HIGH);
digitalWrite(_spiClock, LOW);
digitalWrite(dao,(value & mask));
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW);
}
}

View File

@ -3,7 +3,7 @@
// FILE: DAC8552.h
// AUTHOR: Rob Tillaart
// PURPOSE: Arduino library for DAC8552 SPI Digital Analog Convertor
// VERSION: 0.2.1
// VERSION: 0.2.2
// HISTORY: See DAC8552.cpp
// URL: https://github.com/RobTillaart/DAC8552
//
@ -13,7 +13,7 @@
#include "SPI.h"
#define DAC8552_LIB_VERSION (F("0.2.1"))
#define DAC8552_LIB_VERSION (F("0.2.2"))
#define DAC8552_POWERDOWN_NORMAL 0
@ -38,17 +38,44 @@ public:
void setPowerDown(uint8_t channel, uint8_t powerDownMode);
uint8_t getPowerDownMode(uint8_t channel);
// speed in Hz
void setSPIspeed(uint32_t speed);
uint32_t getSPIspeed() { return _SPIspeed; };
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
private:
uint8_t _spiData;
uint8_t _spiClock;
uint8_t _slaveSelect;
bool _hwSPI;
uint8_t _dataOut = 255;
uint8_t _clock = 255;
uint8_t _select = 255;
bool _hwSPI = false;
uint16_t _value[2];
uint8_t _register[2];
uint32_t _SPIspeed = 16000000;
void updateDevice(uint8_t channel, bool directWrite);
void swSPI_transfer(uint8_t value);
SPIClass * mySPI;
SPISettings _spi_settings;
#if defined(ESP32)
bool _useHSPI = true;
#endif
};
// -- END OF FILE --

View File

@ -1,5 +1,7 @@
[![Arduino CI](https://github.com/RobTillaart/DAC8552/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![Arduino-lint](https://github.com/RobTillaart/DAC8552/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/DAC8552/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/DAC8552/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/DAC8552/actions/workflows/jsoncheck.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/DAC8552/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/DAC8552.svg?maxAge=3600)](https://github.com/RobTillaart/DAC8552/releases)
@ -29,6 +31,32 @@ since 0.2.0 the slaveSelect pin needs to be defined.
- **uint16_t getValue(uint8_t channel)**returns the last value written.
### Hardware SPI
To be used only if one needs a specific speed.
- **void setSPIspeed(uint32_t speed)** set SPI transfer rate.
- **uint32_t getSPIspeed()** returns SPI transfer rate.
- **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.
@ -38,12 +66,17 @@ but waits until (TODO CHECK DATASHEET)
- **void setPowerDown(uint8_t channel, uint8_t powerDownMode)** sets power down mode. 0 - 3.
- **uint8_t getPowerDownMode(uint8_t channel)** returns last written mode.
| Power down mode | Value |
|:------------------------|:-----:|
| DAC8552_POWERDOWN_NORMAL | 0 |
| DAC8552_POWERDOWN_1K | 1 |
| DAC8552_POWERDOWN_100K | 2 |
| DAC8552_POWERDOWN_HIGH_IMP | 3 |
| Power down mode | Value |
|:---------------------------|:-----:|
| DAC8552_POWERDOWN_NORMAL | 0 |
| DAC8552_POWERDOWN_1K | 1 |
| DAC8552_POWERDOWN_100K | 2 |
| DAC8552_POWERDOWN_HIGH_IMP | 3 |
## Future
- testing
## Operation
@ -67,7 +100,3 @@ See examples
**demo_powerdown.ino**
- idem
## TODO
more testing

View File

@ -1,6 +1,6 @@
# Syntax Coloring Map For DAC8552
# Syntax Colouring Map For DAC8552
# Datatypes (KEYWORD1)
# Data types (KEYWORD1)
DAC8552 KEYWORD1
@ -9,10 +9,23 @@ begin KEYWORD2
bufferValue KEYWORD2
setValue KEYWORD2
getValue KEYWORD2
bufferPowerDown KEYWORD2
setPowerDown KEYWORD2
getPowerDownMode KEYWORD2
setSPIspeed KEYWORD2
getSPIspeed KEYWORD2
usesHWSPI KEYWORD2
selectHSPI KEYWORD2
selectVSPI KEYWORD2
usesHSPI KEYWORD2
usesVSPI KEYWORD2
setGPIOpins KEYWORD2
# Constants (LITERAL1)
DAC8552_LIB_VERSION LITERAL1

View File

@ -15,7 +15,7 @@
"type": "git",
"url": "https://github.com/RobTillaart/DAC8552"
},
"version": "0.2.1",
"version": "0.2.2",
"license": "MIT",
"frameworks": "arduino",
"platforms": "*"

View File

@ -1,5 +1,5 @@
name=DAC8552
version=0.2.1
version=0.2.2
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for DAC8552 SPI Digital Analog Convertor