Skip to content

Commit 7363c27

Browse files
committed
0.2.4 DAC8551
1 parent b579d97 commit 7363c27

File tree

8 files changed

+212
-85
lines changed

8 files changed

+212
-85
lines changed

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

Lines changed: 74 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// FILE: DAC8551.cpp
33
// AUTHOR: Rob Tillaart
44
// PURPOSE: Arduino library for DAC8551 SPI Digital Analog Convertor
5-
// VERSION: 0.2.3
5+
// VERSION: 0.2.4
66
// URL: https://github.com/RobTillaart/DAC8551
77
//
88
// HISTORY
@@ -14,51 +14,87 @@
1414
// 0.2.1 2020-12-18 add arduino-ci + unit tests
1515
// 0.2.2 2021-02-04 add DAC8550 DAC8501 DAC8501 derived class + minor refactor
1616
// 0.2.3 2021-06-02 compile ESP32
17+
// 0.2.4 2021-08-29 add support for HSPI / VSPI ESP32 ++
1718

1819

1920
#include "DAC8551.h"
2021

2122

2223
DAC8551::DAC8551(uint8_t slaveSelect)
2324
{
24-
_hwSPI = true;
25-
_slaveSelect = slaveSelect;
25+
_hwSPI = true;
26+
_select = slaveSelect;
2627
}
2728

2829

2930
DAC8551::DAC8551(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect)
3031
{
31-
_hwSPI = false;
32-
_spiData = spiData;
33-
_spiClock = spiClock;
34-
_slaveSelect = slaveSelect;
32+
_hwSPI = false;
33+
_dataOut = spiData;
34+
_clock = spiClock;
35+
_select = slaveSelect;
3536
}
3637

3738

3839
// initializes the SPI
3940
// and sets internal state
4041
void DAC8551::begin()
4142
{
42-
pinMode(_slaveSelect, OUTPUT);
43-
digitalWrite(_slaveSelect, HIGH);
43+
pinMode(_select, OUTPUT);
44+
digitalWrite(_select, HIGH);
45+
46+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
4447

4548
if(_hwSPI)
4649
{
47-
SPI.begin();
50+
#if defined(ESP32)
51+
if (_useHSPI) // HSPI
52+
{
53+
mySPI = new SPIClass(HSPI);
54+
mySPI->end();
55+
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
56+
}
57+
else // VSPI
58+
{
59+
mySPI = new SPIClass(VSPI);
60+
mySPI->end();
61+
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
62+
}
63+
#else // generic hardware SPI
64+
mySPI = &SPI;
65+
mySPI->end();
66+
mySPI->begin();
67+
#endif
4868
delay(1);
4969
}
50-
else
70+
else // software SPI
5171
{
52-
pinMode(_spiData, OUTPUT);
53-
pinMode(_spiClock, OUTPUT);
54-
digitalWrite(_spiData, LOW);
55-
digitalWrite(_spiClock, LOW);
72+
pinMode(_dataOut, OUTPUT);
73+
pinMode(_clock, OUTPUT);
74+
digitalWrite(_dataOut, LOW);
75+
digitalWrite(_clock, LOW);
5676
}
5777

5878
_register = 0;
5979
_value = 0;
6080
}
6181

82+
83+
#if defined(ESP32)
84+
void DAC8551::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
85+
{
86+
_clock = clk;
87+
_dataOut = mosi;
88+
_select = select;
89+
pinMode(_select, OUTPUT);
90+
digitalWrite(_select, HIGH);
91+
92+
mySPI->end(); // disable SPI
93+
mySPI->begin(clk, miso, mosi, select);
94+
}
95+
#endif
96+
97+
6298
// value = 0..65535
6399
void DAC8551::setValue(uint16_t value)
64100
{
@@ -87,37 +123,50 @@ uint8_t DAC8551::getPowerDownMode()
87123
}
88124

89125

126+
void DAC8551::setSPIspeed(uint32_t speed)
127+
{
128+
_SPIspeed = speed;
129+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
130+
};
131+
132+
133+
//////////////////////////////////////////////////////////////////
134+
//
135+
// PRIVATE
136+
//
90137
void DAC8551::updateDevice()
91138
{
92139
uint8_t configRegister = _register;
93140

94-
digitalWrite(_slaveSelect, LOW);
141+
digitalWrite(_select, LOW);
95142
if (_hwSPI)
96143
{
97-
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
98-
SPI.transfer(configRegister);
99-
SPI.transfer(_value >> 8);
100-
SPI.transfer(_value & 0xFF);
101-
SPI.endTransaction();
144+
mySPI->beginTransaction(_spi_settings);
145+
mySPI->transfer(configRegister);
146+
mySPI->transfer(_value >> 8);
147+
mySPI->transfer(_value & 0xFF);
148+
mySPI->endTransaction();
102149
}
103150
else // Software SPI
104151
{
105152
swSPI_transfer(configRegister);
106153
swSPI_transfer(_value >> 8);
107154
swSPI_transfer(_value & 0xFF);
108155
}
109-
digitalWrite(_slaveSelect, LOW);
156+
digitalWrite(_select, HIGH);
110157
}
111158

112159

113160
// simple one mode version
114161
void DAC8551::swSPI_transfer(uint8_t value)
115162
{
163+
uint8_t clk = _clock;
164+
uint8_t dao = _dataOut;
116165
for (uint8_t mask = 0x80; mask; mask >>= 1)
117166
{
118-
digitalWrite(_spiData,(value & mask) != 0);
119-
digitalWrite(_spiClock, HIGH);
120-
digitalWrite(_spiClock, LOW);
167+
digitalWrite(dao,(value & mask));
168+
digitalWrite(clk, HIGH);
169+
digitalWrite(clk, LOW);
121170
}
122171
}
123172

libraries/DAC8551/DAC8551.h

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// AUTHOR: Rob Tillaart
55
// PURPOSE: Arduino library for DAC8551 SPI Digital Analog Convertor
66
// could work with DAC8550, not tested
7-
// VERSION: 0.2.3
7+
// VERSION: 0.2.4
88
// HISTORY: See DAC8551.cpp
99
// URL: https://github.com/RobTillaart/DAC8551
1010
//
@@ -14,7 +14,7 @@
1414
#include "SPI.h"
1515

1616

17-
#define DAC8551_LIB_VERSION (F("0.2.3"))
17+
#define DAC8551_LIB_VERSION (F("0.2.4"))
1818

1919

2020
#define DAC8551_POWERDOWN_NORMAL 0
@@ -37,16 +37,44 @@ class DAC8551
3737
void setPowerDown(uint8_t powerDownMode);
3838
uint8_t getPowerDownMode();
3939

40+
// speed in Hz
41+
void setSPIspeed(uint32_t speed);
42+
uint32_t getSPIspeed() { return _SPIspeed; };
43+
44+
bool usesHWSPI() { return _hwSPI; };
45+
46+
// ESP32 specific
47+
#if defined(ESP32)
48+
void selectHSPI() { _useHSPI = true; };
49+
void selectVSPI() { _useHSPI = false; };
50+
bool usesHSPI() { return _useHSPI; };
51+
bool usesVSPI() { return !_useHSPI; };
52+
53+
// to overrule ESP32 default hardware pins
54+
void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select);
55+
#endif
56+
4057
protected:
41-
uint8_t _spiData;
42-
uint8_t _spiClock;
43-
uint8_t _slaveSelect;
44-
bool _hwSPI;
45-
uint16_t _value;
46-
uint8_t _register;
58+
uint8_t _dataOut = 255;
59+
uint8_t _clock = 255;
60+
uint8_t _select = 255;
61+
62+
bool _hwSPI = false;
63+
uint16_t _value = 0;
64+
uint8_t _register = 0;
65+
66+
uint32_t _SPIspeed = 16000000;
4767

4868
void updateDevice();
4969
void swSPI_transfer(uint8_t value);
70+
71+
72+
SPIClass * mySPI;
73+
SPISettings _spi_settings;
74+
75+
#if defined(ESP32)
76+
bool _useHSPI = true;
77+
#endif
5078
};
5179

5280

@@ -100,7 +128,4 @@ class DAC8550 : public DAC8551
100128
};
101129

102130

103-
104-
105-
106131
// -- END OF FILE --

libraries/DAC8551/README.md

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11

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

8+
69
# DAC8551
710

811
Arduino library for DAC8501 DAC8531, DAC8550, DAC8551 SPI Digital Analog Convertor
@@ -36,28 +39,53 @@ since 0.2.0 the slaveSelect pin needs to be defined.
3639
- **uint16_t getValue()** returns the last value written.
3740

3841

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

4170
check datasheet for details.
4271

4372
- **void setPowerDown(uint8_t powerDownMode)** sets power down mode. 0 - 3.
4473
- **uint8_t getPowerDownMode()** returns last written mode.
4574

46-
| Power down mode | Value |
47-
|:------------------------|:-----:|
48-
| DAC8551_POWERDOWN_NORMAL | 0 |
49-
| DAC8551_POWERDOWN_1K | 1 |
50-
| DAC8551_POWERDOWN_100K | 2 |
51-
| DAC8551_POWERDOWN_HIGH_IMP | 3 |
75+
| Power down mode | Value |
76+
|:---------------------------|:-----:|
77+
| DAC8551_POWERDOWN_NORMAL | 0 |
78+
| DAC8551_POWERDOWN_1K | 1 |
79+
| DAC8551_POWERDOWN_100K | 2 |
80+
| DAC8551_POWERDOWN_HIGH_IMP | 3 |
5281

5382

5483
DAC8501, DAC8531 and DAC8550 uses the same constants.
5584

5685

5786
## Future
5887

59-
- more testing
60-
- investigate differences between 8551 and 8550.
88+
- testing
6189

6290

6391
## Operation

libraries/DAC8551/keywords.txt

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

3-
# Datatypes (KEYWORD1)
3+
# Data types (KEYWORD1)
44
DAC8501 KEYWORD1
55
DAC8531 KEYWORD1
66
DAC8550 KEYWORD1
@@ -14,6 +14,17 @@ getValue KEYWORD2
1414
setPowerDown KEYWORD2
1515
getPowerDownMode KEYWORD2
1616

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
1728

1829
# Constants (LITERAL1)
1930
DAC8551_LIB_VERSION LITERAL1

libraries/DAC8551/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/DAC8551"
1717
},
18-
"version": "0.2.3",
18+
"version": "0.2.4",
1919
"license": "MIT",
2020
"frameworks": "arduino",
2121
"platforms": "*"

libraries/DAC8551/library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=DAC8551
2-
version=0.2.3
2+
version=0.2.4
33
author=Rob Tillaart <[email protected]>
44
maintainer=Rob Tillaart <[email protected]>
55
sentence=Arduino library for DAC8501, DAC8531, DAC8550 and DAC8551 SPI 16-bit Digital Analog Convertor

0 commit comments

Comments
 (0)