mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
0.2.2 DAC8552
This commit is contained in:
parent
7363c27ccb
commit
3f9673486c
@ -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
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 --
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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": "*"
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user