|
2 | 2 | // FILE: DAC8551.cpp |
3 | 3 | // AUTHOR: Rob Tillaart |
4 | 4 | // PURPOSE: Arduino library for DAC8551 SPI Digital Analog Convertor |
5 | | -// VERSION: 0.2.3 |
| 5 | +// VERSION: 0.2.4 |
6 | 6 | // URL: https://github.com/RobTillaart/DAC8551 |
7 | 7 | // |
8 | 8 | // HISTORY |
|
14 | 14 | // 0.2.1 2020-12-18 add arduino-ci + unit tests |
15 | 15 | // 0.2.2 2021-02-04 add DAC8550 DAC8501 DAC8501 derived class + minor refactor |
16 | 16 | // 0.2.3 2021-06-02 compile ESP32 |
| 17 | +// 0.2.4 2021-08-29 add support for HSPI / VSPI ESP32 ++ |
17 | 18 |
|
18 | 19 |
|
19 | 20 | #include "DAC8551.h" |
20 | 21 |
|
21 | 22 |
|
22 | 23 | DAC8551::DAC8551(uint8_t slaveSelect) |
23 | 24 | { |
24 | | - _hwSPI = true; |
25 | | - _slaveSelect = slaveSelect; |
| 25 | + _hwSPI = true; |
| 26 | + _select = slaveSelect; |
26 | 27 | } |
27 | 28 |
|
28 | 29 |
|
29 | 30 | DAC8551::DAC8551(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect) |
30 | 31 | { |
31 | | - _hwSPI = false; |
32 | | - _spiData = spiData; |
33 | | - _spiClock = spiClock; |
34 | | - _slaveSelect = slaveSelect; |
| 32 | + _hwSPI = false; |
| 33 | + _dataOut = spiData; |
| 34 | + _clock = spiClock; |
| 35 | + _select = slaveSelect; |
35 | 36 | } |
36 | 37 |
|
37 | 38 |
|
38 | 39 | // initializes the SPI |
39 | 40 | // and sets internal state |
40 | 41 | void DAC8551::begin() |
41 | 42 | { |
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); |
44 | 47 |
|
45 | 48 | if(_hwSPI) |
46 | 49 | { |
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 |
48 | 68 | delay(1); |
49 | 69 | } |
50 | | - else |
| 70 | + else // software SPI |
51 | 71 | { |
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); |
56 | 76 | } |
57 | 77 |
|
58 | 78 | _register = 0; |
59 | 79 | _value = 0; |
60 | 80 | } |
61 | 81 |
|
| 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 | + |
62 | 98 | // value = 0..65535 |
63 | 99 | void DAC8551::setValue(uint16_t value) |
64 | 100 | { |
@@ -87,37 +123,50 @@ uint8_t DAC8551::getPowerDownMode() |
87 | 123 | } |
88 | 124 |
|
89 | 125 |
|
| 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 | +// |
90 | 137 | void DAC8551::updateDevice() |
91 | 138 | { |
92 | 139 | uint8_t configRegister = _register; |
93 | 140 |
|
94 | | - digitalWrite(_slaveSelect, LOW); |
| 141 | + digitalWrite(_select, LOW); |
95 | 142 | if (_hwSPI) |
96 | 143 | { |
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(); |
102 | 149 | } |
103 | 150 | else // Software SPI |
104 | 151 | { |
105 | 152 | swSPI_transfer(configRegister); |
106 | 153 | swSPI_transfer(_value >> 8); |
107 | 154 | swSPI_transfer(_value & 0xFF); |
108 | 155 | } |
109 | | - digitalWrite(_slaveSelect, LOW); |
| 156 | + digitalWrite(_select, HIGH); |
110 | 157 | } |
111 | 158 |
|
112 | 159 |
|
113 | 160 | // simple one mode version |
114 | 161 | void DAC8551::swSPI_transfer(uint8_t value) |
115 | 162 | { |
| 163 | + uint8_t clk = _clock; |
| 164 | + uint8_t dao = _dataOut; |
116 | 165 | for (uint8_t mask = 0x80; mask; mask >>= 1) |
117 | 166 | { |
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); |
121 | 170 | } |
122 | 171 | } |
123 | 172 |
|
|
0 commit comments