Skip to content

Commit 627e4e3

Browse files
committed
0.1.2 AD520X
1 parent 348f6cc commit 627e4e3

File tree

10 files changed

+502
-63
lines changed

10 files changed

+502
-63
lines changed

libraries/AD520X/.github/workflows/arduino_test_runner.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ jobs:
99

1010
steps:
1111
- uses: actions/checkout@v2
12-
- uses: Arduino-CI/action@master
13-
# Arduino-CI/[email protected]
12+
- uses: Arduino-CI/[email protected]

libraries/AD520X/AD520X.cpp

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22
// FILE: AD520X.cpp
33
// AUTHOR: Rob Tillaart
44
// DATE: 2020-07-24
5-
// VERSION: 0.1.1
5+
// VERSION: 0.1.2
66
// PURPOSE: Arduino library for AD5204 and AD5206 digital potentiometers (+ older AD8400, AD8402, AD8403)
77
// URL: https://github.com/RobTillaart/AD520X
88
//
99
// HISTORY:
10-
// 0.0.1 2020-07-24 initial version
11-
// 0.0.2 2020-07-25 support for AD8400 series in documentation.
12-
// 0.1.0 2020-07-26 refactor, fix #2 select pin for HW SPI; add shutdown.
13-
// 0.1.1 2020-12-08 Arduino-CI + unit test + isPowerOn()
10+
// 0.0.1 2020-07-24 initial version
11+
// 0.0.2 2020-07-25 support for AD8400 series in documentation.
12+
// 0.1.0 2020-07-26 refactor, fix #2 select pin for HW SPI; add shutdown.
13+
// 0.1.1 2020-12-08 Arduino-CI + unit test + isPowerOn()
14+
// 0.1.2 2021-08-19 VSPI / HSPI support for ESP32 only
15+
// add setGPIOpins for ESP32 only
16+
// add SetSPIspeed (generic)
1417

1518

1619
#include "AD520X.h"
@@ -20,13 +23,14 @@ AD520X::AD520X(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut,
2023
{
2124
_pmCount = 6;
2225
_select = select;
23-
_data = dataOut;
26+
_dataOut = dataOut;
2427
_clock = clock;
2528
_reset = reset;
2629
_shutdown = shutdown;
2730
_hwSPI = (dataOut == 255) && (clock == 255);
2831
}
2932

33+
3034
// initializes the pins and starts SPI in case of hardware SPI
3135
void AD520X::begin(uint8_t value)
3236
{
@@ -37,29 +41,65 @@ void AD520X::begin(uint8_t value)
3741
pinMode(_shutdown, OUTPUT);
3842
digitalWrite(_shutdown, LOW);
3943

44+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
45+
4046
if(_hwSPI)
4147
{
42-
SPI.begin();
48+
#if defined(ESP32)
49+
if (_useHSPI) // HSPI
50+
{
51+
mySPI = new SPIClass(HSPI);
52+
mySPI->end();
53+
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
54+
}
55+
else // VSPI
56+
{
57+
mySPI = new SPIClass(VSPI);
58+
mySPI->end();
59+
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
60+
}
61+
#else // generic hardware SPI
62+
mySPI = &SPI;
63+
mySPI->end();
64+
mySPI->begin();
65+
#endif
4366
delay(1);
4467
}
4568
else
4669
{
47-
pinMode(_data, OUTPUT);
48-
pinMode(_clock, OUTPUT);
49-
digitalWrite(_data, LOW);
50-
digitalWrite(_clock, LOW);
70+
pinMode(_dataOut, OUTPUT);
71+
pinMode(_clock, OUTPUT);
72+
digitalWrite(_dataOut, LOW);
73+
digitalWrite(_clock, LOW);
5174
}
5275

5376
setAll(value);
5477
}
5578

79+
80+
#if defined(ESP32)
81+
void AD520X::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
82+
{
83+
_clock = clk;
84+
_dataOut = mosi;
85+
_select = select;
86+
pinMode(_select, OUTPUT);
87+
digitalWrite(_select, HIGH);
88+
89+
mySPI->end(); // disable SPI and restart
90+
mySPI->begin(clk, miso, mosi, select);
91+
}
92+
#endif
93+
94+
5695
void AD520X::setValue(uint8_t pm, uint8_t value)
5796
{
5897
if (pm >= _pmCount) return;
5998
_value[pm] = value;
6099
updateDevice(pm);
61100
}
62101

102+
63103
void AD520X::setAll(uint8_t value)
64104
{
65105
for (uint8_t pm = 0; pm < _pmCount; pm++)
@@ -68,77 +108,98 @@ void AD520X::setAll(uint8_t value)
68108
}
69109
}
70110

111+
71112
uint8_t AD520X::getValue(uint8_t pm)
72113
{
73114
if (pm >= _pmCount) return 0;
74115
return _value[pm];
75116
}
76117

118+
77119
void AD520X::reset(uint8_t value)
78120
{
79121
digitalWrite(_reset, HIGH);
80122
digitalWrite(_reset, LOW);
81123
setAll(value);
82124
}
83125

126+
127+
void AD520X::setSPIspeed(uint32_t speed)
128+
{
129+
_SPIspeed = speed;
130+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE1);
131+
};
132+
133+
134+
/////////////////////////////////////////////////////////////////////////////
135+
//
136+
// PROTECTED
137+
//
84138
void AD520X::updateDevice(uint8_t pm)
85139
{
140+
digitalWrite(_select, LOW);
86141
if (_hwSPI)
87142
{
88-
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
89-
digitalWrite(_select, LOW);
90-
SPI.transfer(pm);
91-
SPI.transfer(_value[pm]);
92-
digitalWrite(_select, HIGH);
93-
SPI.endTransaction();
143+
mySPI->beginTransaction(_spi_settings);
144+
mySPI->transfer(pm);
145+
mySPI->transfer(_value[pm]);
146+
mySPI->endTransaction();
94147
}
95148
else // Software SPI
96149
{
97-
digitalWrite(_select, LOW);
98150
swSPI_transfer(pm);
99151
swSPI_transfer(_value[pm]);
100-
digitalWrite(_select, HIGH);
101152
}
153+
digitalWrite(_select, HIGH);
102154
}
103155

156+
104157
// simple one mode version
105-
void AD520X::swSPI_transfer(uint8_t value)
158+
void AD520X::swSPI_transfer(uint8_t val)
106159
{
160+
uint8_t clk = _clock;
161+
uint8_t dao = _dataOut;
107162
for (uint8_t mask = 0x80; mask; mask >>= 1)
108163
{
109-
digitalWrite(_data,(value & mask) != 0);
110-
digitalWrite(_clock, HIGH);
111-
digitalWrite(_clock, LOW);
164+
digitalWrite(dao,(val & mask));
165+
digitalWrite(clk, HIGH);
166+
digitalWrite(clk, LOW);
112167
}
113168
}
114169

115170

116171
/////////////////////////////////////////////////////////////////////////////
117-
172+
//
173+
// DERIVED CLASSES
174+
//
118175
AD5206::AD5206(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
119176
: AD520X(select, reset, shutdown, dataOut, clock)
120177
{
121178
_pmCount = 6;
122179
}
123180

181+
124182
AD5204::AD5204(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
125183
: AD520X(select, reset, shutdown, dataOut, clock)
126184
{
127185
_pmCount = 4;
128186
}
129187

188+
130189
AD8403::AD8403(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
131190
: AD520X(select, reset, shutdown, dataOut, clock)
132191
{
133192
_pmCount = 4;
134193
}
135194

195+
136196
AD8402::AD8402(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
137197
: AD520X(select, reset, shutdown, dataOut, clock)
138198
{
139199
_pmCount = 2;
140200
}
141201

202+
142203
AD8400::AD8400(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
143204
: AD520X(select, reset, shutdown, dataOut, clock)
144205
{

libraries/AD520X/AD520X.h

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@
33
// FILE: AD520X.h
44
// AUTHOR: Rob Tillaart
55
// DATE: 2020-07-24
6-
// VERSION: 0.1.1
6+
// VERSION: 0.1.2
77
// PURPOSE: Arduino library for AD5204 and AD5206 digital potentiometers (+ older AD8400, AD8402, AD8403)
88
// URL: https://github.com/RobTillaart/AD520X
99
//
1010
// HISTORY:
1111
// see AD520X.cpp file
1212
//
1313

14+
1415
#include "Arduino.h"
1516
#include "SPI.h"
1617

17-
#define AD520X_LIB_VERSION "0.1.1"
18+
19+
#define AD520X_LIB_VERSION (F("0.1.2"))
20+
1821

1922
class AD520X
2023
{
@@ -34,48 +37,81 @@ class AD520X
3437
void powerDown() { powerOff(); }; // will become obsolete
3538
bool isPowerOn() { return digitalRead(_shutdown) == LOW; };
3639

40+
// speed in Hz
41+
void setSPIspeed(uint32_t speed);
42+
uint32_t getSPIspeed() { return _SPIspeed; };
43+
44+
// debugging
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+
3758

3859
protected:
39-
uint8_t _data;
40-
uint8_t _clock;
41-
uint8_t _select;
42-
uint8_t _reset;
43-
uint8_t _shutdown;
44-
bool _hwSPI = 3;
45-
uint8_t _value[6];
46-
uint8_t _pmCount = 6;
47-
48-
void updateDevice(uint8_t pm);
49-
void swSPI_transfer(uint8_t value);
60+
uint8_t _dataOut;
61+
uint8_t _clock;
62+
uint8_t _select;
63+
uint8_t _reset;
64+
uint8_t _shutdown;
65+
bool _hwSPI = 3;
66+
uint32_t _SPIspeed = 16000000;
67+
68+
uint8_t _value[6];
69+
uint8_t _pmCount = 6;
70+
71+
void updateDevice(uint8_t pm);
72+
void swSPI_transfer(uint8_t value);
73+
74+
SPIClass * mySPI;
75+
SPISettings _spi_settings;
76+
77+
#if defined(ESP32)
78+
bool _useHSPI = true;
79+
#endif
5080
};
5181

5282

5383
/////////////////////////////////////////////////////////////////////////////
54-
84+
//
85+
// DERIVED CLASSES
86+
//
5587
class AD5206 : public AD520X
5688
{
5789
public:
5890
AD5206(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut = 255, uint8_t clock = 255);
5991
};
6092

93+
6194
class AD5204 : public AD520X
6295
{
6396
public:
6497
AD5204(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut = 255, uint8_t clock = 255);
6598
};
6699

100+
67101
class AD8400 : public AD520X
68102
{
69103
public:
70104
AD8400(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut = 255, uint8_t clock = 255);
71105
};
72106

107+
73108
class AD8402 : public AD520X
74109
{
75110
public:
76111
AD8402(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut = 255, uint8_t clock = 255);
77112
};
78113

114+
79115
class AD8403 : public AD520X
80116
{
81117
public:

0 commit comments

Comments
 (0)