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
2729DAC8554::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
3638DAC8554::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
4850void 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+
198247void 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
222269void 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
0 commit comments