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"
2425DAC8552::DAC8552 (uint8_t slaveSelect)
2526{
2627 _hwSPI = true ;
27- _slaveSelect = slaveSelect;
28+ _select = slaveSelect;
2829}
2930
3031
3132DAC8552::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
4243void 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
69104void 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
145190void 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
0 commit comments