forked from RobTillaart/Arduino
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDAC8554.cpp
More file actions
181 lines (163 loc) · 4.29 KB
/
Copy pathDAC8554.cpp
File metadata and controls
181 lines (163 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//
// FILE: DAC8554.cpp
// AUTHOR: Rob Tillaart
// PURPOSE: DAC8554 library for Arduino
// VERSION: 0.1.0
// URL: https://github.com/RobTillaart/Arduino/tree/master/libraries/DAC8554
// HISTORY:
// 0.1.0: 2017-12-19 initial version
//
// Released to the public domain
//
#include <SPI.h>
#include <DAC8554.h>
#define DAC8554_BUFFER_WRITE 0x00
#define DAC8554_SINGLE_WRITE 0x10
#define DAC8554_ALL_WRITE 0x20
#define DAC8554_BROADCAST 0x30
DAC8554::DAC8554(uint8_t address)
{
_hwSPI = true;
_address = (address & 0x03) << 6;
}
// 0,1,2,4 resp 8550 8551 8552 8554
DAC8554::DAC8554(uint8_t spiData, uint8_t spiClock, uint8_t slaveSelect, uint8_t address)
{
_hwSPI = false;
_spiData = spiData;
_spiClock = spiClock;
_slaveSelect = slaveSelect;
_address = (address & 0x03) << 6;
}
// initializes the SPI
// and sets internal state
void DAC8554::begin()
{
if(_hwSPI)
{
SPI.begin();
delay(1);
}
else
{
pinMode(_spiData, OUTPUT);
pinMode(_spiClock, OUTPUT);
pinMode(_slaveSelect, OUTPUT);
}
}
//////////////////////////////////////////////////////////////////////
//
// SETVALUE
//
// DAC = 0,1,2,3
// value = 0..65535
void DAC8554::bufferValue(uint8_t DAC, uint16_t value)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_BUFFER_WRITE;
configRegister |= (DAC << 1);
writeDevice(configRegister, value);
}
void DAC8554::setValue(uint8_t DAC, uint16_t value)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_ALL_WRITE;
configRegister |= (DAC << 1);
writeDevice(configRegister, value);
}
void DAC8554::setSingleValue(uint8_t DAC, uint16_t value)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_SINGLE_WRITE;
configRegister |= (DAC << 1);
writeDevice(configRegister, value);
}
//////////////////////////////////////////////////////////////////////
//
// POWERDOWN
//
// DAC = 0,1,2,3
// powerDownMode =
// DAC8554_POWERDOWN_NORMAL 0x00
// DAC8554_POWERDOWN_1K 0x40
// DAC8554_POWERDOWN_100K 0x80
// DAC8554_POWERDOWN_HIGH_IMP 0xC0
void DAC8554::bufferPowerDown(uint8_t DAC, uint8_t powerDownMode)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_BUFFER_WRITE;
configRegister |= (DAC << 1);
uint16_t value = (powerDownMode & 0xC0) << 8;
writeDevice(configRegister, value);
}
void DAC8554::setPowerDown(uint8_t DAC, uint8_t powerDownMode)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_ALL_WRITE;
configRegister |= (DAC << 1);
uint16_t value = (powerDownMode & 0xC0) << 8;
writeDevice(configRegister, value);
}
void DAC8554::setSinglePowerDown(uint8_t DAC, uint8_t powerDownMode)
{
uint8_t configRegister = _address;
configRegister |= DAC8554_SINGLE_WRITE;
configRegister |= (DAC << 1);
uint16_t value = (powerDownMode & 0xC0) << 8;
writeDevice(configRegister, value);
}
//////////////////////////////////////////////////////////////////////
//
// BROADCAST (addresses all 8554 on "SPI-bus")
//
void DAC8554::broadcastBuffer()
{
uint8_t configRegister = DAC8554_BROADCAST;
uint16_t value = 0;
writeDevice(configRegister, value);
}
void DAC8554::broadcastValue(uint16_t value)
{
uint8_t configRegister = DAC8554_BROADCAST;
configRegister |= 0x04; // TODO magic number
writeDevice(configRegister, value);
}
void DAC8554::broadcastPowerDown(uint8_t powerDownMode)
{
uint8_t configRegister = DAC8554_BROADCAST;
configRegister |= 0x05; // TODO magic number
uint16_t value = (powerDownMode & 0xC0) << 8;
writeDevice(configRegister, value);
}
void DAC8554::writeDevice(uint8_t configRegister, uint16_t value)
{
if (_hwSPI)
{
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1));
digitalWrite(_slaveSelect, LOW);
SPI.transfer(configRegister);
SPI.transfer(value >> 8);
SPI.transfer(value & 0xFF);
digitalWrite(_slaveSelect, LOW);
SPI.endTransaction();
}
else // Software SPI
{
digitalWrite(_slaveSelect, LOW);
swSPI_transfer(configRegister);
swSPI_transfer(value >> 8);
swSPI_transfer(value & 0xFF);
digitalWrite(_slaveSelect, LOW);
}
}
// simple one mode version
void DAC8554::swSPI_transfer(uint8_t value)
{
for (uint8_t mask = 0x80; mask; mask >>= 1)
{
digitalWrite(_spiData,(value & mask) != 0);
digitalWrite(_spiClock, HIGH);
digitalWrite(_spiClock, LOW);
}
}
// END OF FILE