Skip to content

Commit eb26267

Browse files
committed
0.2.3 DAC8554
1 parent 3f96734 commit eb26267

File tree

7 files changed

+182
-58
lines changed

7 files changed

+182
-58
lines changed

libraries/DAC8554/.github/workflows/arduino_test_runner.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ name: Arduino CI
44
on: [push, pull_request]
55

66
jobs:
7-
arduino_ci:
7+
runTest:
88
runs-on: ubuntu-latest
99

1010
steps:
1111
- uses: actions/checkout@v2
12-
- uses: Arduino-CI/action@master
13-
# Arduino-CI/[email protected]
12+
- uses: ruby/setup-ruby@v1
13+
with:
14+
ruby-version: 2.6
15+
- run: |
16+
gem install arduino_ci
17+
arduino_ci.rb

libraries/DAC8554/DAC8554.cpp

Lines changed: 83 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@
22
// FILE: DAC8554.cpp
33
// AUTHOR: Rob Tillaart
44
// PURPOSE: Arduino library for DAC8554 SPI Digital Analog Convertor
5-
// VERSION: 0.2.2
5+
// VERSION: 0.2.3
66
// URL: https://github.com/RobTillaart/DAC8554
77
//
88
// HISTORY:
9-
// 0.1.0: 2017-12-19 initial version
10-
// 0.1.2 2020-04-06 minor refactor, readme.md
11-
// 0.1.3 2020-06-07 fix library.json
12-
// 0.1.4 2020-07-20 fix URL's in demo's; MIT license; minor edits
13-
// 0.2.0 2020-12-18 add arduino-ci + unit test
14-
// 0.2.1 2021-01-10 fix slave select hardware SPI + getValue() + getPowerDownMode().
15-
// fix unit test.
16-
// 0.2.2 2021-06-02 compile ESP32
9+
// 0.1.0: 2017-12-19 initial version
10+
// 0.1.2 2020-04-06 minor refactor, readme.md
11+
// 0.1.3 2020-06-07 fix library.json
12+
// 0.1.4 2020-07-20 fix URL's in demo's; MIT license; minor edits
13+
// 0.2.0 2020-12-18 add arduino-ci + unit test
14+
// 0.2.1 2021-01-10 fix slave select hardware SPI + getValue() + getPowerDownMode().
15+
// fix unit test.
16+
// 0.2.2 2021-06-02 compile ESP32
17+
// 0.2.3 2021-08-29 add support for HSPI / VSPI ESP32 ++
18+
1719

1820
#include "DAC8554.h"
1921

@@ -27,18 +29,18 @@
2729
DAC8554::DAC8554(uint8_t slaveSelect, uint8_t address)
2830
{
2931
_hwSPI = true;
30-
_slaveSelect = slaveSelect;
32+
_select = slaveSelect;
3133
_address = (address & 0x03) << 6;
3234
}
3335

3436

3537
// 0,1,2,4 resp 8550 8551 8552 8554
3638
DAC8554::DAC8554(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect, uint8_t address)
3739
{
38-
_hwSPI = false;
39-
_spiData = spiData;
40-
_spiClock = spiClock;
41-
_slaveSelect = slaveSelect;
40+
_hwSPI = false;
41+
_dataOut = spiData;
42+
_clock = spiClock;
43+
_select = slaveSelect;
4244
_address = (address & 0x03) << 6;
4345
}
4446

@@ -47,20 +49,39 @@ DAC8554::DAC8554(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect, uint8_t
4749
// and sets internal state
4850
void DAC8554::begin()
4951
{
50-
pinMode(_slaveSelect, OUTPUT);
51-
digitalWrite(_slaveSelect, HIGH);
52+
pinMode(_select, OUTPUT);
53+
digitalWrite(_select, HIGH);
54+
55+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
5256

5357
if(_hwSPI)
5458
{
55-
SPI.begin();
59+
#if defined(ESP32)
60+
if (_useHSPI) // HSPI
61+
{
62+
mySPI = new SPIClass(HSPI);
63+
mySPI->end();
64+
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
65+
}
66+
else // VSPI
67+
{
68+
mySPI = new SPIClass(VSPI);
69+
mySPI->end();
70+
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
71+
}
72+
#else // generic hardware SPI
73+
mySPI = &SPI;
74+
mySPI->end();
75+
mySPI->begin();
76+
#endif
5677
delay(1);
5778
}
58-
else
79+
else // software SPI
5980
{
60-
pinMode(_spiData, OUTPUT);
61-
pinMode(_spiClock, OUTPUT);
62-
digitalWrite(_spiData, LOW);
63-
digitalWrite(_spiClock, LOW);
81+
pinMode(_dataOut, OUTPUT);
82+
pinMode(_clock, OUTPUT);
83+
digitalWrite(_dataOut, LOW);
84+
digitalWrite(_clock, LOW);
6485
}
6586

6687
for (uint8_t i = 0; i < 4; i++)
@@ -71,6 +92,22 @@ void DAC8554::begin()
7192
}
7293

7394

95+
#if defined(ESP32)
96+
void DAC8554::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
97+
{
98+
_clock = clk;
99+
_dataOut = mosi;
100+
_select = select;
101+
pinMode(_select, OUTPUT);
102+
digitalWrite(_select, HIGH);
103+
104+
mySPI->end(); // disable SPI
105+
mySPI->begin(clk, miso, mosi, select);
106+
}
107+
#endif
108+
109+
110+
74111
//////////////////////////////////////////////////////////////////////
75112
//
76113
// SETVALUE
@@ -195,37 +232,49 @@ void DAC8554::broadcastPowerDown(uint8_t powerDownMode)
195232
}
196233

197234

235+
void DAC8554::setSPIspeed(uint32_t speed)
236+
{
237+
_SPIspeed = speed;
238+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
239+
};
240+
241+
242+
//////////////////////////////////////////////////////////////////
243+
//
244+
// PRIVATE
245+
//
246+
198247
void DAC8554::writeDevice(uint8_t configRegister, uint16_t value)
199248
{
249+
digitalWrite(_select, LOW);
200250
if (_hwSPI)
201251
{
202-
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
203-
digitalWrite(_slaveSelect, LOW);
204-
SPI.transfer(configRegister);
205-
SPI.transfer(value >> 8);
206-
SPI.transfer(value & 0xFF);
207-
digitalWrite(_slaveSelect, HIGH);
208-
SPI.endTransaction();
252+
mySPI->beginTransaction(_spi_settings);
253+
mySPI->transfer(configRegister);
254+
mySPI->transfer(value >> 8);
255+
mySPI->transfer(value & 0xFF);
256+
mySPI->endTransaction();;
209257
}
210258
else // Software SPI
211259
{
212-
digitalWrite(_slaveSelect, LOW);
213260
swSPI_transfer(configRegister);
214261
swSPI_transfer(value >> 8);
215262
swSPI_transfer(value & 0xFF);
216-
digitalWrite(_slaveSelect, HIGH);
217263
}
264+
digitalWrite(_select, HIGH);
218265
}
219266

220267

221268
// simple one mode version
222269
void DAC8554::swSPI_transfer(uint8_t value)
223270
{
271+
uint8_t clk = _clock;
272+
uint8_t dao = _dataOut;
224273
for (uint8_t mask = 0x80; mask; mask >>= 1)
225274
{
226-
digitalWrite(_spiData,(value & mask) != 0);
227-
digitalWrite(_spiClock, HIGH);
228-
digitalWrite(_spiClock, LOW);
275+
digitalWrite(dao,(value & mask));
276+
digitalWrite(clk, HIGH);
277+
digitalWrite(clk, LOW);
229278
}
230279
}
231280

libraries/DAC8554/DAC8554.h

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
// FILE: DAC8554.h
44
// AUTHOR: Rob Tillaart
55
// PURPOSE: Arduino library for DAC8554 SPI Digital Analog Convertor
6-
// VERSION: 0.2.2
6+
// VERSION: 0.2.3
77
// HISTORY: See DAC8554.cpp
88
// URL: https://github.com/RobTillaart/DAC8554
99
//
1010

1111
#include "Arduino.h"
1212
#include "SPI.h"
1313

14-
#define DAC8554_LIB_VERSION (F("0.2.2"))
14+
#define DAC8554_LIB_VERSION (F("0.2.3"))
1515

1616

1717
#define DAC8554_POWERDOWN_NORMAL 0x00
@@ -49,18 +49,46 @@ class DAC8554
4949
// write powerDownMode to all 8554's channel's
5050
void broadcastPowerDown(uint8_t powerDownMode);
5151

52+
// speed in Hz
53+
void setSPIspeed(uint32_t speed);
54+
uint32_t getSPIspeed() { return _SPIspeed; };
55+
56+
bool usesHWSPI() { return _hwSPI; };
57+
58+
// ESP32 specific
59+
#if defined(ESP32)
60+
void selectHSPI() { _useHSPI = true; };
61+
void selectVSPI() { _useHSPI = false; };
62+
bool usesHSPI() { return _useHSPI; };
63+
bool usesVSPI() { return !_useHSPI; };
64+
65+
// to overrule ESP32 default hardware pins
66+
void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select);
67+
#endif
68+
69+
5270
private:
53-
uint8_t _spiData;
54-
uint8_t _spiClock;
55-
uint8_t _slaveSelect;
56-
bool _hwSPI;
71+
uint8_t _dataOut = 255;
72+
uint8_t _clock = 255;
73+
uint8_t _select = 255;
74+
75+
bool _hwSPI = false;
5776
uint8_t _address;
5877

5978
uint16_t _value[4]; // holdes last written / buffered value per channel
6079
uint8_t _register[4]; // holds powerDownMode per channel
6180

81+
uint32_t _SPIspeed = 16000000;
82+
6283
void writeDevice(uint8_t configRegister, uint16_t value);
6384
void swSPI_transfer(uint8_t value);
85+
86+
SPIClass * mySPI;
87+
SPISettings _spi_settings;
88+
89+
#if defined(ESP32)
90+
bool _useHSPI = true;
91+
#endif
6492
};
6593

6694
// -- END OF FILE --

libraries/DAC8554/README.md

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11

22
[![Arduino CI](https://github.com/RobTillaart/DAC8554/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
3+
[![Arduino-lint](https://github.com/RobTillaart/DAC8554/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/DAC8554/actions/workflows/arduino-lint.yml)
4+
[![JSON check](https://github.com/RobTillaart/DAC8554/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/DAC8554/actions/workflows/jsoncheck.yml)
35
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/DAC8554/blob/master/LICENSE)
46
[![GitHub release](https://img.shields.io/github/release/RobTillaart/DAC8554.svg?maxAge=3600)](https://github.com/RobTillaart/DAC8554/releases)
57

@@ -12,7 +14,7 @@ Arduino library for DAC8554 SPI Digital Analog Convertor
1214

1315
The DAC8554 is a SPI based 16 bit DAC with four channels.
1416

15-
**Warning** the library is not tested extensively.
17+
**Warning** This library is not tested extensively
1618

1719

1820
## Interface
@@ -28,20 +30,46 @@ since 0.2.0 the slaveSelect pin needs to be defined.
2830
- **uint16_t getValue(uint8_t channel)** returns the last value written.
2931

3032

33+
### Hardware SPI
34+
35+
To be used only if one needs a specific speed.
36+
37+
- **void setSPIspeed(uint32_t speed)** set SPI transfer rate.
38+
- **uint32_t getSPIspeed()** returns SPI transfer rate.
39+
- **bool usesHWSPI()** returns true if HW SPI is used.
40+
41+
42+
### ESP32 specific
43+
44+
- **void selectHSPI()** in case hardware SPI, the ESP32 has two options HSPI and VSPI.
45+
- **void selectVSPI()** see above.
46+
- **bool usesHSPI()** returns true if HSPI is used.
47+
- **bool usesVSPI()** returns true if VSPI is used.
48+
49+
The **selectVSPI()** or the **selectHSPI()** needs to be called
50+
BEFORE the **begin()** function.
51+
52+
53+
#### experimental
54+
55+
- **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
56+
AFTER the **begin()** function.
57+
58+
3159
### Power down
3260

33-
check datasheet for details.
61+
Check datasheet for details.
3462

3563
- **void setPowerDown(uint8_t powerDownMode)** sets power down mode. 0 - 3.
3664
- **uint8_t getPowerDownMode()** returns last written mode.
3765
- **void setSinglePowerDown(uint8_t channel, uint8_t powerDownMode)** does not affect other channels.
3866

39-
| Power down mode | Value |
40-
|:------------------------|:-----:|
41-
| DAC8554_POWERDOWN_NORMAL | 0x00 |
42-
| DAC8554_POWERDOWN_1K | 0x40 |
43-
| DAC8554_POWERDOWN_100K | 0x80 |
44-
| DAC8554_POWERDOWN_HIGH_IMP | 0xC0 |
67+
| Power down mode | Value |
68+
|:----------------------------|:-----:|
69+
| DAC8554_POWERDOWN_NORMAL | 0x00 |
70+
| DAC8554_POWERDOWN_1K | 0x40 |
71+
| DAC8554_POWERDOWN_100K | 0x80 |
72+
| DAC8554_POWERDOWN_HIGH_IMP | 0xC0 |
4573

4674

4775
### Broadcast
@@ -51,6 +79,10 @@ check datasheet for details.
5179
- **void broadcastValue(uint16_t value)** write value to all(up to 4) 8554's channel's
5280
- **void broadcastPowerDown(uint8_t powerDownMode)** write powerDownMode to all 8554's channel's
5381

82+
## Future
83+
84+
- testing
85+
5486

5587
## Operation
5688

@@ -73,6 +105,3 @@ See examples
73105
**demo_powerdown.ino**
74106
- idem
75107

76-
## TODO
77-
78-
more testing

0 commit comments

Comments
 (0)