Skip to content

Commit 3f96734

Browse files
committed
0.2.2 DAC8552
1 parent 7363c27 commit 3f96734

File tree

7 files changed

+176
-56
lines changed

7 files changed

+176
-56
lines changed

libraries/DAC8552/.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/DAC8552/DAC8552.cpp

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@
22
// FILE: DAC8552.cpp
33
// AUTHOR: Rob Tillaart
44
// PURPOSE: Arduino library for DAC8552 SPI Digital Analog Convertor
5-
// VERSION: 0.2.1
5+
// VERSION: 0.2.2
66
// URL: https://github.com/RobTillaart/DAC8552
77
//
88
// HISTORY:
9-
// 0.1.0: 2017-12-14 initial version
10-
// 0.1.1: 2017-12-19 fix begin() bug
11-
// 0.1.2 2020-04-06 minor refactor, readme.md
12-
// 0.1.3 2020-06-07 fix library.json
13-
// 0.2.0 2020-12-18 add arduino-ci + unit test
14-
// add slave select pin for HW constructor
15-
// 0.2.1 2021-06-02 compile ESP32 + fix for channel B
9+
// 0.1.0: 2017-12-14 initial version
10+
// 0.1.1: 2017-12-19 fix begin() bug
11+
// 0.1.2 2020-04-06 minor refactor, readme.md
12+
// 0.1.3 2020-06-07 fix library.json
13+
// 0.2.0 2020-12-18 add arduino-ci + unit test
14+
// add slave select pin for HW constructor
15+
// 0.2.1 2021-06-02 compile ESP32 + fix for channel B
16+
// 0.2.2 2021-08-29 add support for HSPI / VSPI ESP32 ++
1617

1718

1819
#include "DAC8552.h"
@@ -24,37 +25,56 @@
2425
DAC8552::DAC8552(uint8_t slaveSelect)
2526
{
2627
_hwSPI = true;
27-
_slaveSelect = slaveSelect;
28+
_select = slaveSelect;
2829
}
2930

3031

3132
DAC8552::DAC8552(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
3233
{
33-
_hwSPI = false;
34-
_spiData = spiData;
35-
_spiClock = spiClock;
36-
_slaveSelect = slaveSelect;
34+
_hwSPI = false;
35+
_dataOut = spiData;
36+
_clock = spiClock;
37+
_select = slaveSelect;
3738
}
3839

3940

4041
// initializes the SPI
4142
// and sets internal state
4243
void DAC8552::begin()
4344
{
44-
pinMode(_slaveSelect, OUTPUT);
45-
digitalWrite(_slaveSelect, HIGH);
45+
pinMode(_select, OUTPUT);
46+
digitalWrite(_select, HIGH);
47+
48+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
4649

4750
if(_hwSPI)
4851
{
49-
SPI.begin();
52+
#if defined(ESP32)
53+
if (_useHSPI) // HSPI
54+
{
55+
mySPI = new SPIClass(HSPI);
56+
mySPI->end();
57+
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
58+
}
59+
else // VSPI
60+
{
61+
mySPI = new SPIClass(VSPI);
62+
mySPI->end();
63+
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
64+
}
65+
#else // generic hardware SPI
66+
mySPI = &SPI;
67+
mySPI->end();
68+
mySPI->begin();
69+
#endif
5070
delay(1);
5171
}
52-
else
72+
else // software SPI
5373
{
54-
pinMode(_spiData, OUTPUT);
55-
pinMode(_spiClock, OUTPUT);
56-
digitalWrite(_spiData, LOW);
57-
digitalWrite(_spiClock, LOW);
74+
pinMode(_dataOut, OUTPUT);
75+
pinMode(_clock, OUTPUT);
76+
digitalWrite(_dataOut, LOW);
77+
digitalWrite(_clock, LOW);
5878
}
5979

6080
_value[0] = 0;
@@ -64,6 +84,21 @@ void DAC8552::begin()
6484
}
6585

6686

87+
#if defined(ESP32)
88+
void DAC8552::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
89+
{
90+
_clock = clk;
91+
_dataOut = mosi;
92+
_select = select;
93+
pinMode(_select, OUTPUT);
94+
digitalWrite(_select, HIGH);
95+
96+
mySPI->end(); // disable SPI
97+
mySPI->begin(clk, miso, mosi, select);
98+
}
99+
#endif
100+
101+
67102
// channel = 0, 1, 2, 3 depending on type
68103
// value = 0..65535
69104
void DAC8552::bufferValue(uint8_t channel, uint16_t value)
@@ -112,6 +147,18 @@ uint8_t DAC8552::getPowerDownMode(uint8_t channel)
112147
}
113148

114149

150+
void DAC8552::setSPIspeed(uint32_t speed)
151+
{
152+
_SPIspeed = speed;
153+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
154+
};
155+
156+
157+
//////////////////////////////////////////////////////////////////
158+
//
159+
// PRIVATE
160+
//
161+
115162
// channel = 0, 1, 2, 3 depending on type
116163
// direct = true ==> write buffers to both channel A and channel B
117164
// direct = false ==> buffer value
@@ -120,35 +167,35 @@ void DAC8552::updateDevice(uint8_t channel, bool directWrite)
120167
uint8_t configRegister = _register[channel];
121168
if (directWrite) configRegister |= 0x30;
122169

170+
digitalWrite(_select, LOW);
123171
if (_hwSPI)
124172
{
125-
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
126-
digitalWrite(_slaveSelect, LOW);
127-
SPI.transfer(configRegister);
128-
SPI.transfer(_value[channel] >> 8);
129-
SPI.transfer(_value[channel] & 0xFF);
130-
digitalWrite(_slaveSelect, HIGH);
131-
SPI.endTransaction();
173+
mySPI->beginTransaction(_spi_settings);
174+
mySPI->transfer(configRegister);
175+
mySPI->transfer(_value[channel] >> 8);
176+
mySPI->transfer(_value[channel] & 0xFF);
177+
mySPI->endTransaction();
132178
}
133179
else // Software SPI
134180
{
135-
digitalWrite(_slaveSelect, LOW);
136181
swSPI_transfer(configRegister);
137182
swSPI_transfer(_value[channel] >> 8);
138183
swSPI_transfer(_value[channel] & 0xFF);
139-
digitalWrite(_slaveSelect, HIGH);
140184
}
185+
digitalWrite(_select, HIGH);
141186
}
142187

143188

144189
// simple one mode version
145190
void DAC8552::swSPI_transfer(uint8_t value)
146191
{
192+
uint8_t clk = _clock;
193+
uint8_t dao = _dataOut;
147194
for (uint8_t mask = 0x80; mask; mask >>= 1)
148195
{
149-
digitalWrite(_spiData,(value & mask) != 0);
150-
digitalWrite(_spiClock, HIGH);
151-
digitalWrite(_spiClock, LOW);
196+
digitalWrite(dao,(value & mask));
197+
digitalWrite(clk, HIGH);
198+
digitalWrite(clk, LOW);
152199
}
153200
}
154201

libraries/DAC8552/DAC8552.h

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// FILE: DAC8552.h
44
// AUTHOR: Rob Tillaart
55
// PURPOSE: Arduino library for DAC8552 SPI Digital Analog Convertor
6-
// VERSION: 0.2.1
6+
// VERSION: 0.2.2
77
// HISTORY: See DAC8552.cpp
88
// URL: https://github.com/RobTillaart/DAC8552
99
//
@@ -13,7 +13,7 @@
1313
#include "SPI.h"
1414

1515

16-
#define DAC8552_LIB_VERSION (F("0.2.1"))
16+
#define DAC8552_LIB_VERSION (F("0.2.2"))
1717

1818

1919
#define DAC8552_POWERDOWN_NORMAL 0
@@ -38,17 +38,44 @@ class DAC8552
3838
void setPowerDown(uint8_t channel, uint8_t powerDownMode);
3939
uint8_t getPowerDownMode(uint8_t channel);
4040

41+
// speed in Hz
42+
void setSPIspeed(uint32_t speed);
43+
uint32_t getSPIspeed() { return _SPIspeed; };
44+
45+
bool usesHWSPI() { return _hwSPI; };
46+
47+
// ESP32 specific
48+
#if defined(ESP32)
49+
void selectHSPI() { _useHSPI = true; };
50+
void selectVSPI() { _useHSPI = false; };
51+
bool usesHSPI() { return _useHSPI; };
52+
bool usesVSPI() { return !_useHSPI; };
53+
54+
// to overrule ESP32 default hardware pins
55+
void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select);
56+
#endif
57+
4158

4259
private:
43-
uint8_t _spiData;
44-
uint8_t _spiClock;
45-
uint8_t _slaveSelect;
46-
bool _hwSPI;
60+
uint8_t _dataOut = 255;
61+
uint8_t _clock = 255;
62+
uint8_t _select = 255;
63+
64+
bool _hwSPI = false;
4765
uint16_t _value[2];
4866
uint8_t _register[2];
4967

68+
uint32_t _SPIspeed = 16000000;
69+
5070
void updateDevice(uint8_t channel, bool directWrite);
5171
void swSPI_transfer(uint8_t value);
72+
73+
SPIClass * mySPI;
74+
SPISettings _spi_settings;
75+
76+
#if defined(ESP32)
77+
bool _useHSPI = true;
78+
#endif
5279
};
5380

5481
// -- END OF FILE --

libraries/DAC8552/README.md

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

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

@@ -29,6 +31,32 @@ since 0.2.0 the slaveSelect pin needs to be defined.
2931
- **uint16_t getValue(uint8_t channel)**returns the last value written.
3032

3133

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

3462
Check datasheet for details.
@@ -38,12 +66,17 @@ but waits until (TODO CHECK DATASHEET)
3866
- **void setPowerDown(uint8_t channel, uint8_t powerDownMode)** sets power down mode. 0 - 3.
3967
- **uint8_t getPowerDownMode(uint8_t channel)** returns last written mode.
4068

41-
| Power down mode | Value |
42-
|:------------------------|:-----:|
43-
| DAC8552_POWERDOWN_NORMAL | 0 |
44-
| DAC8552_POWERDOWN_1K | 1 |
45-
| DAC8552_POWERDOWN_100K | 2 |
46-
| DAC8552_POWERDOWN_HIGH_IMP | 3 |
69+
| Power down mode | Value |
70+
|:---------------------------|:-----:|
71+
| DAC8552_POWERDOWN_NORMAL | 0 |
72+
| DAC8552_POWERDOWN_1K | 1 |
73+
| DAC8552_POWERDOWN_100K | 2 |
74+
| DAC8552_POWERDOWN_HIGH_IMP | 3 |
75+
76+
77+
## Future
78+
79+
- testing
4780

4881

4982
## Operation
@@ -67,7 +100,3 @@ See examples
67100
**demo_powerdown.ino**
68101
- idem
69102

70-
71-
## TODO
72-
73-
more testing

libraries/DAC8552/keywords.txt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Syntax Coloring Map For DAC8552
1+
# Syntax Colouring Map For DAC8552
22

3-
# Datatypes (KEYWORD1)
3+
# Data types (KEYWORD1)
44
DAC8552 KEYWORD1
55

66

@@ -9,10 +9,23 @@ begin KEYWORD2
99
bufferValue KEYWORD2
1010
setValue KEYWORD2
1111
getValue KEYWORD2
12+
1213
bufferPowerDown KEYWORD2
1314
setPowerDown KEYWORD2
1415
getPowerDownMode KEYWORD2
1516

17+
setSPIspeed KEYWORD2
18+
getSPIspeed KEYWORD2
19+
20+
usesHWSPI KEYWORD2
21+
22+
selectHSPI KEYWORD2
23+
selectVSPI KEYWORD2
24+
usesHSPI KEYWORD2
25+
usesVSPI KEYWORD2
26+
27+
setGPIOpins KEYWORD2
28+
1629

1730
# Constants (LITERAL1)
1831
DAC8552_LIB_VERSION LITERAL1

libraries/DAC8552/library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"type": "git",
1616
"url": "https://github.com/RobTillaart/DAC8552"
1717
},
18-
"version": "0.2.1",
18+
"version": "0.2.2",
1919
"license": "MIT",
2020
"frameworks": "arduino",
2121
"platforms": "*"

libraries/DAC8552/library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=DAC8552
2-
version=0.2.1
2+
version=0.2.2
33
author=Rob Tillaart <[email protected]>
44
maintainer=Rob Tillaart <[email protected]>
55
sentence=Arduino library for DAC8552 SPI Digital Analog Convertor

0 commit comments

Comments
 (0)