2
2
// FILE: PCA9632.cpp
3
3
// AUTHOR: Rob Tillaart
4
4
// DATE: 2024-11-25
5
- // VERSION: 0.1.0
6
- // PURPOSE: Arduino library for PCA9632 and PCA9633 4 channel, I2C LED driver.
5
+ // VERSION: 0.1.1
6
+ // PURPOSE: Arduino library for PCA9632 and PCA9633 I2C 8 bit PWM LED driver, 4 channel .
7
7
// URL: https://github.com/RobTillaart/PCA9632
8
8
9
9
10
10
#include " PCA9632.h"
11
11
12
+ #define PCA9632_NO_INCREMENT 0x00
13
+ #define PCA9632_AUTO_INCR_ALL 0x80
14
+ // not used.
15
+ // #define PCA963X_AUTO_INCR_xxx 0xA0
16
+ // #define PCA963X_AUTO_INCR_xxx 0xC0
17
+ // #define PCA963X_AUTO_INCR_xxx 0xE0
18
+
19
+
12
20
13
21
// ////////////////////////////////////////////////////////////
14
22
//
@@ -46,28 +54,34 @@ uint8_t PCA9632::getAddress()
46
54
}
47
55
48
56
57
+ uint8_t PCA9632::channelCount ()
58
+ {
59
+ return 4 ;
60
+ }
61
+
62
+
49
63
// ///////////////////////////////////////////////////
50
64
//
51
65
// WRITE
52
66
//
53
67
uint8_t PCA9632::writeR (uint8_t R)
54
68
{
55
- return writeReg (PCA9632_PWM0, R);
69
+ return writeRegister (PCA9632_PWM0, R);
56
70
}
57
71
58
72
uint8_t PCA9632::writeG (uint8_t G)
59
73
{
60
- return writeReg (PCA9632_PWM1, G);
74
+ return writeRegister (PCA9632_PWM1, G);
61
75
}
62
76
63
77
uint8_t PCA9632::writeB (uint8_t B)
64
78
{
65
- return writeReg (PCA9632_PWM2, B);
79
+ return writeRegister (PCA9632_PWM2, B);
66
80
}
67
81
68
82
uint8_t PCA9632::writeW (uint8_t W)
69
83
{
70
- return writeReg (PCA9632_PWM3, W);
84
+ return writeRegister (PCA9632_PWM3, W);
71
85
}
72
86
73
87
uint8_t PCA9632::write (uint8_t channel, uint8_t value)
@@ -77,7 +91,7 @@ uint8_t PCA9632::write(uint8_t channel, uint8_t value)
77
91
_error = PCA9632_ERR_CHAN;
78
92
return _error;
79
93
}
80
- return writeReg (PCA9632_PWM0 + channel, value);
94
+ return writeRegister (PCA9632_PWM0 + channel, value);
81
95
}
82
96
83
97
uint8_t PCA9632::write (uint8_t R, uint8_t G, uint8_t B, uint8_t W)
@@ -90,7 +104,8 @@ uint8_t PCA9632::write(uint8_t R, uint8_t G, uint8_t B, uint8_t W)
90
104
uint8_t PCA9632::write (uint8_t * arr)
91
105
{
92
106
_wire->beginTransmission (_address);
93
- _wire->write (PCA9632_PWM0);
107
+ // auto increment all page 8 - table 5.
108
+ _wire->write (PCA9632_AUTO_INCR_ALL + PCA9632_PWM0);
94
109
for (uint8_t i = 0 ; i < 4 ; i++)
95
110
{
96
111
_wire->write (arr[i]);
@@ -105,33 +120,208 @@ uint8_t PCA9632::write(uint8_t * arr)
105
120
return _error;
106
121
}
107
122
123
+ uint8_t PCA9632::allOff ()
124
+ {
125
+ uint8_t arr[4 ] = {0 , 0 , 0 , 0 };
126
+ return write (arr);
127
+ }
128
+
108
129
109
130
// ///////////////////////////////////////////////////
110
131
//
111
132
// WRITE MODE REGISTERS
112
133
//
113
134
uint8_t PCA9632::setMode1 (uint8_t value)
114
135
{
115
- return writeReg (PCA9632_MODE1, value);
136
+ return writeRegister (PCA9632_MODE1, value);
116
137
}
117
138
118
-
119
139
uint8_t PCA9632::setMode2 (uint8_t value)
120
140
{
121
- return writeReg (PCA9632_MODE2, value);
141
+ return writeRegister (PCA9632_MODE2, value);
122
142
}
123
143
124
-
125
144
uint8_t PCA9632::getMode1 ()
126
145
{
127
- return readReg (PCA9632_MODE1);
146
+ return readRegister (PCA9632_MODE1);
128
147
}
129
148
130
-
131
149
uint8_t PCA9632::getMode2 ()
132
150
{
133
- return readReg (PCA9632_MODE2);
151
+ return readRegister (PCA9632_MODE2);
152
+ }
153
+
154
+
155
+ // ///////////////////////////////////////////////////
156
+ //
157
+ // GROUP REGISTERS
158
+ //
159
+ uint8_t PCA9632::setGroupPWM (uint8_t value)
160
+ {
161
+ return writeRegister (PCA9632_GRPPWM, value);
162
+ }
163
+
164
+ uint8_t PCA9632::getGroupPWM ()
165
+ {
166
+ return readRegister (PCA9632_GRPPWM);
167
+ }
168
+
169
+ uint8_t PCA9632::setGroupFREQ (uint8_t value)
170
+ {
171
+ return writeRegister (PCA9632_GRPFREQ, value);
172
+ }
173
+
174
+ uint8_t PCA9632::getGroupFREQ ()
175
+ {
176
+ return readRegister (PCA9632_GRPFREQ);
177
+ }
178
+
179
+
180
+ // ///////////////////////////////////////////////////
181
+ //
182
+ // SUB CALL - to be tested
183
+ //
184
+ bool PCA9632::enableSubCall (uint8_t nr)
185
+ {
186
+ if ((nr == 0 ) || (nr > 3 )) return false ;
187
+ uint8_t prev = getMode1 ();
188
+ uint8_t mask = prev;
189
+ if (nr == 1 ) mask |= PCA9632_MODE1_SUB1;
190
+ else if (nr == 2 ) mask |= PCA9632_MODE1_SUB2;
191
+ else mask |= PCA9632_MODE1_SUB3;
192
+ // only update if changed.
193
+ if (mask != prev)
194
+ {
195
+ setMode1 (mask);
196
+ // TODO error handling ...
197
+ }
198
+ return true ;
199
+ }
200
+
201
+
202
+ bool PCA9632::disableSubCall (uint8_t nr)
203
+ {
204
+ if ((nr == 0 ) || (nr > 3 )) return false ;
205
+ uint8_t prev = getMode1 ();
206
+ uint8_t mask = prev;
207
+ if (nr == 1 ) mask &= ~PCA9632_MODE1_SUB1;
208
+ else if (nr == 2 ) mask &= ~PCA9632_MODE1_SUB2;
209
+ else mask &= ~PCA9632_MODE1_SUB3;
210
+ // only update if changed.
211
+ if (mask != prev)
212
+ {
213
+ setMode1 (mask);
214
+ // TODO error handling ...
215
+ }
216
+ return true ;
217
+ }
218
+
219
+
220
+ bool PCA9632::isEnabledSubCall (uint8_t nr)
221
+ {
222
+ if ((nr == 0 ) || (nr > 3 )) return false ;
223
+ uint8_t mask = getMode1 ();
224
+ if (nr == 1 ) return (mask & PCA9632_MODE1_SUB1) > 0 ;
225
+ if (nr == 2 ) return (mask & PCA9632_MODE1_SUB2) > 0 ;
226
+ return (mask & PCA9632_MODE1_SUB3) > 0 ;
227
+ }
228
+
229
+
230
+ bool PCA9632::setSubCallAddress (uint8_t nr, uint8_t address)
231
+ {
232
+ if ((nr == 0 ) || (nr > 3 ))
233
+ {
234
+ // _error = ?? TODO
235
+ return false ;
236
+ }
237
+ writeRegister (PCA9632_SUBADR (nr), address);
238
+ return true ;
134
239
}
240
+
241
+
242
+ uint8_t PCA9632::getSubCallAddress (uint8_t nr)
243
+ {
244
+ if ((nr == 0 ) || (nr > 3 ))
245
+ {
246
+ // _error = ?? TODO
247
+ return 0 ;
248
+ }
249
+ uint8_t address = readRegister (PCA9632_SUBADR (nr));
250
+ return address;
251
+ }
252
+
253
+
254
+ // ///////////////////////////////////////////////////
255
+ //
256
+ // ALL CALL - to be tested
257
+ //
258
+ bool PCA9632::enableAllCall ()
259
+ {
260
+ uint8_t prev = getMode1 ();
261
+ uint8_t mask = prev | PCA9632_MODE1_ALLCALL;
262
+ // only update if changed.
263
+ if (mask != prev)
264
+ {
265
+ setMode1 (mask);
266
+ // error handling TODO
267
+ }
268
+ return true ;
269
+ }
270
+
271
+
272
+ bool PCA9632::disableAllCall ()
273
+ {
274
+ uint8_t prev = getMode1 ();
275
+ uint8_t mask = prev & ~PCA9632_MODE1_ALLCALL;
276
+ // only update if changed.
277
+ if (mask != prev)
278
+ {
279
+ setMode1 (mask);
280
+ // error handling TODO
281
+ }
282
+ return true ;
283
+ }
284
+
285
+
286
+ bool PCA9632::isEnabledAllCall ()
287
+ {
288
+ uint8_t mask = getMode1 ();
289
+ return (mask & PCA9632_MODE1_ALLCALL) > 0 ;
290
+ }
291
+
292
+
293
+ bool PCA9632::setAllCallAddress (uint8_t address)
294
+ {
295
+ writeRegister (PCA9632_ALLCALLADR, address);
296
+ return true ;
297
+ }
298
+
299
+
300
+ uint8_t PCA9632::getAllCallAddress ()
301
+ {
302
+ uint8_t address = readRegister (PCA9632_ALLCALLADR);
303
+ return address;
304
+ }
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
135
325
136
326
137
327
// ///////////////////////////////////////////////////
@@ -147,7 +337,7 @@ uint8_t PCA9632::setLedDriverModeAll(uint8_t mode)
147
337
}
148
338
// all 4 channels same mode.
149
339
uint8_t mask = mode | mode << 2 | mode << 4 | mode << 6 ;
150
- return writeReg (PCA9632_LEDOUT, mask);
340
+ return writeRegister (PCA9632_LEDOUT, mask);
151
341
}
152
342
153
343
@@ -168,8 +358,8 @@ uint8_t PCA9632::setLedDriverMode(uint8_t channel, uint8_t mode)
168
358
uint8_t shift = channel * 2 ; // 0,2,4,6 places
169
359
uint8_t setmask = mode << shift;
170
360
uint8_t clrmask = ~(0x03 << shift);
171
- uint8_t value = (readReg (PCA9632_LEDOUT) & clrmask) | setmask;
172
- return writeReg (PCA9632_LEDOUT, value);
361
+ uint8_t value = (readRegister (PCA9632_LEDOUT) & clrmask) | setmask;
362
+ return writeRegister (PCA9632_LEDOUT, value);
173
363
}
174
364
175
365
@@ -183,7 +373,7 @@ uint8_t PCA9632::getLedDriverMode(uint8_t channel)
183
373
}
184
374
185
375
uint8_t shift = channel * 2 ; // 0, 2, 4, 6 places
186
- uint8_t value = (readReg (PCA9632_LEDOUT) >> shift ) & 0x03 ;
376
+ uint8_t value = (readRegister (PCA9632_LEDOUT) >> shift ) & 0x03 ;
187
377
_error = PCA9632_OK;
188
378
return value;
189
379
}
@@ -204,9 +394,10 @@ int PCA9632::lastError()
204
394
//
205
395
// LOW LEVEL
206
396
//
207
- uint8_t PCA9632::writeReg (uint8_t reg, uint8_t value)
397
+ uint8_t PCA9632::writeRegister (uint8_t reg, uint8_t value)
208
398
{
209
399
_wire->beginTransmission (_address);
400
+ // no Auto-Increment page 8 - table 5.
210
401
_wire->write (reg);
211
402
_wire->write (value);
212
403
_error = _wire->endTransmission ();
@@ -216,7 +407,7 @@ uint8_t PCA9632::writeReg(uint8_t reg, uint8_t value)
216
407
}
217
408
218
409
219
- uint8_t PCA9632::readReg (uint8_t reg)
410
+ uint8_t PCA9632::readRegister (uint8_t reg)
220
411
{
221
412
_wire->beginTransmission (_address);
222
413
_wire->write (reg);
0 commit comments