Skip to content

Commit 970983c

Browse files
committed
0.1.1 PCA9632
1 parent d0fac87 commit 970983c

File tree

9 files changed

+466
-109
lines changed

9 files changed

+466
-109
lines changed

libraries/PCA9632/CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88

9+
10+
11+
## [0.1.1] - 2025-05-05
12+
- fix #2, wrong color
13+
- fix version number in library.properties
14+
- give **writeRegister() / readRegister()** full name.
15+
- add **PCA9632_AUTO_INCR_ALL** in **write(array)**
16+
- add **allOff()**
17+
- sync PCA9634 (not tested)
18+
- add **getGroupPWM() + setGroupPWM(uint8_t value)**
19+
- add **getGroupFREQ() + setGroupFREQ(uint8_t value)**
20+
- add **subCall()** and **allCall()** functions.
21+
- update readme.md
22+
- update keywords.txt
23+
- minor edits
24+
25+
926
## [0.1.0] - 2024-11-25
1027
- initial version
1128

libraries/PCA9632/LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2024-2024 Rob Tillaart
3+
Copyright (c) 2024-2025 Rob Tillaart
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

libraries/PCA9632/PCA9632.cpp

Lines changed: 212 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,21 @@
22
// FILE: PCA9632.cpp
33
// AUTHOR: Rob Tillaart
44
// 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.
77
// URL: https://github.com/RobTillaart/PCA9632
88

99

1010
#include "PCA9632.h"
1111

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+
1220

1321
//////////////////////////////////////////////////////////////
1422
//
@@ -46,28 +54,34 @@ uint8_t PCA9632::getAddress()
4654
}
4755

4856

57+
uint8_t PCA9632::channelCount()
58+
{
59+
return 4;
60+
}
61+
62+
4963
/////////////////////////////////////////////////////
5064
//
5165
// WRITE
5266
//
5367
uint8_t PCA9632::writeR(uint8_t R)
5468
{
55-
return writeReg(PCA9632_PWM0, R);
69+
return writeRegister(PCA9632_PWM0, R);
5670
}
5771

5872
uint8_t PCA9632::writeG(uint8_t G)
5973
{
60-
return writeReg(PCA9632_PWM1, G);
74+
return writeRegister(PCA9632_PWM1, G);
6175
}
6276

6377
uint8_t PCA9632::writeB(uint8_t B)
6478
{
65-
return writeReg(PCA9632_PWM2, B);
79+
return writeRegister(PCA9632_PWM2, B);
6680
}
6781

6882
uint8_t PCA9632::writeW(uint8_t W)
6983
{
70-
return writeReg(PCA9632_PWM3, W);
84+
return writeRegister(PCA9632_PWM3, W);
7185
}
7286

7387
uint8_t PCA9632::write(uint8_t channel, uint8_t value)
@@ -77,7 +91,7 @@ uint8_t PCA9632::write(uint8_t channel, uint8_t value)
7791
_error = PCA9632_ERR_CHAN;
7892
return _error;
7993
}
80-
return writeReg(PCA9632_PWM0 + channel, value);
94+
return writeRegister(PCA9632_PWM0 + channel, value);
8195
}
8296

8397
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)
90104
uint8_t PCA9632::write(uint8_t * arr)
91105
{
92106
_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);
94109
for (uint8_t i = 0; i < 4; i++)
95110
{
96111
_wire->write(arr[i]);
@@ -105,33 +120,208 @@ uint8_t PCA9632::write(uint8_t * arr)
105120
return _error;
106121
}
107122

123+
uint8_t PCA9632::allOff()
124+
{
125+
uint8_t arr[4] = {0, 0, 0, 0};
126+
return write(arr);
127+
}
128+
108129

109130
/////////////////////////////////////////////////////
110131
//
111132
// WRITE MODE REGISTERS
112133
//
113134
uint8_t PCA9632::setMode1(uint8_t value)
114135
{
115-
return writeReg(PCA9632_MODE1, value);
136+
return writeRegister(PCA9632_MODE1, value);
116137
}
117138

118-
119139
uint8_t PCA9632::setMode2(uint8_t value)
120140
{
121-
return writeReg(PCA9632_MODE2, value);
141+
return writeRegister(PCA9632_MODE2, value);
122142
}
123143

124-
125144
uint8_t PCA9632::getMode1()
126145
{
127-
return readReg(PCA9632_MODE1);
146+
return readRegister(PCA9632_MODE1);
128147
}
129148

130-
131149
uint8_t PCA9632::getMode2()
132150
{
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;
134239
}
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+
135325

136326

137327
/////////////////////////////////////////////////////
@@ -147,7 +337,7 @@ uint8_t PCA9632::setLedDriverModeAll(uint8_t mode)
147337
}
148338
// all 4 channels same mode.
149339
uint8_t mask = mode | mode << 2 | mode << 4 | mode << 6;
150-
return writeReg(PCA9632_LEDOUT, mask);
340+
return writeRegister(PCA9632_LEDOUT, mask);
151341
}
152342

153343

@@ -168,8 +358,8 @@ uint8_t PCA9632::setLedDriverMode(uint8_t channel, uint8_t mode)
168358
uint8_t shift = channel * 2; // 0,2,4,6 places
169359
uint8_t setmask = mode << shift;
170360
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);
173363
}
174364

175365

@@ -183,7 +373,7 @@ uint8_t PCA9632::getLedDriverMode(uint8_t channel)
183373
}
184374

185375
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;
187377
_error = PCA9632_OK;
188378
return value;
189379
}
@@ -204,9 +394,10 @@ int PCA9632::lastError()
204394
//
205395
// LOW LEVEL
206396
//
207-
uint8_t PCA9632::writeReg(uint8_t reg, uint8_t value)
397+
uint8_t PCA9632::writeRegister(uint8_t reg, uint8_t value)
208398
{
209399
_wire->beginTransmission(_address);
400+
// no Auto-Increment page 8 - table 5.
210401
_wire->write(reg);
211402
_wire->write(value);
212403
_error = _wire->endTransmission();
@@ -216,7 +407,7 @@ uint8_t PCA9632::writeReg(uint8_t reg, uint8_t value)
216407
}
217408

218409

219-
uint8_t PCA9632::readReg(uint8_t reg)
410+
uint8_t PCA9632::readRegister(uint8_t reg)
220411
{
221412
_wire->beginTransmission(_address);
222413
_wire->write(reg);

0 commit comments

Comments
 (0)