22// FILE: PCA9635.cpp
33// AUTHOR: Rob Tillaart
44// DATE: 23-apr-2016
5- // VERSION: 0.6.0
5+ // VERSION: 0.6.1
66// PURPOSE: Arduino library for PCA9635 I2C LED driver, 16 channel PWM, 8 bit
77// URL: https://github.com/RobTillaart/PCA9635
88
@@ -75,6 +75,33 @@ uint8_t PCA9635::channelCount()
7575//
7676// LED DRIVER MODE
7777//
78+ uint8_t PCA9635::setLedDriverModeAll (uint8_t mode)
79+ {
80+ if (mode > 3 ) return PCA963X_ERR_MODE;
81+ uint8_t mask = 0b00000000 ;
82+ switch (mode)
83+ {
84+ case PCA963X_LEDGRPPWM:
85+ mask = 0b11111111 ;
86+ break ;
87+ case PCA963X_LEDPWM:
88+ mask = 0b10101010 ;
89+ break ;
90+ case PCA963X_LEDON:
91+ mask = 0b01010101 ;
92+ break ;
93+ default :
94+ mask = 0b00000000 ;
95+ break ;
96+ }
97+ for (int reg = 0 ; reg < 4 ; reg++)
98+ {
99+ writeLedOut (reg, mask);
100+ }
101+ return PCA963X_OK;
102+ }
103+
104+
78105uint8_t PCA9635::setLedDriverMode (uint8_t channel, uint8_t mode)
79106{
80107 if (channel >= _channelCount)
@@ -93,8 +120,8 @@ uint8_t PCA9635::setLedDriverMode(uint8_t channel, uint8_t mode)
93120 uint8_t shift = (channel & 0x03 ) * 2 ; // 0,2,4,6 places
94121 uint8_t setmask = mode << shift;
95122 uint8_t clrmask = ~(0x03 << shift);
96- uint8_t value = (readReg (reg) & clrmask) | setmask;
97- writeReg (reg, value);
123+ uint8_t value = (readRegister (reg) & clrmask) | setmask;
124+ writeRegister (reg, value);
98125 _error = PCA963X_OK;
99126 return _error;
100127}
@@ -111,7 +138,7 @@ uint8_t PCA9635::getLedDriverMode(uint8_t channel)
111138
112139 uint8_t reg = PCA963X_LEDOUT_BASE + (channel >> 2 );
113140 uint8_t shift = (channel & 0x03 ) * 2 ; // 0, 2, 4, 6 places
114- uint8_t value = (readReg (reg) >> shift ) & 0x03 ;
141+ uint8_t value = (readRegister (reg) >> shift ) & 0x03 ;
115142 _error = PCA963X_OK;
116143 return value;
117144}
@@ -125,7 +152,7 @@ uint8_t PCA9635::writeMode(uint8_t reg, uint8_t value)
125152{
126153 if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
127154 {
128- writeReg (reg, value);
155+ writeRegister (reg, value);
129156 return PCA963X_OK;
130157 }
131158 _error = PCA963X_ERR_REG;
@@ -139,7 +166,7 @@ uint8_t PCA9635::readMode(uint8_t reg)
139166 if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
140167 {
141168 _error = PCA963X_OK;
142- uint8_t value = readReg (reg);
169+ uint8_t value = readRegister (reg);
143170 return value;
144171 }
145172 _error = PCA963X_ERR_REG;
@@ -149,53 +176,55 @@ uint8_t PCA9635::readMode(uint8_t reg)
149176
150177uint8_t PCA9635::setMode1 (uint8_t value)
151178{
152- return writeMode (PCA963X_MODE1, value);
179+ writeRegister (PCA963X_MODE1, value);
180+ return PCA963X_OK;
153181}
154182
155183
156184uint8_t PCA9635::setMode2 (uint8_t value)
157185{
158- return writeMode (PCA963X_MODE2, value);
186+ writeRegister (PCA963X_MODE2, value);
187+ return PCA963X_OK;
159188}
160189
161190
162191uint8_t PCA9635::getMode1 ()
163192{
164- return readMode (PCA963X_MODE1);
193+ return readRegister (PCA963X_MODE1);
165194}
166195
167196
168197uint8_t PCA9635::getMode2 ()
169198{
170- return readMode (PCA963X_MODE2);
199+ return readRegister (PCA963X_MODE2);
171200}
172201
173202
174203// ///////////////////////////////////////////////////
175204//
176- // GROUP PWM
205+ // GROUP REGISTERS
177206//
178- void PCA9635::setGroupPWM (uint8_t value)
207+ uint8_t PCA9635::setGroupPWM (uint8_t value)
179208{
180- writeReg (PCA963X_GRPPWM, value);
209+ return writeRegister (PCA963X_GRPPWM, value);
181210}
182211
183212
184213uint8_t PCA9635::getGroupPWM ()
185214{
186- return readReg (PCA963X_GRPPWM);
215+ return readRegister (PCA963X_GRPPWM);
187216}
188217
189218
190- void PCA9635::setGroupFREQ (uint8_t value)
219+ uint8_t PCA9635::setGroupFREQ (uint8_t value)
191220{
192- writeReg (PCA963X_GRPFREQ, value);
221+ return writeRegister (PCA963X_GRPFREQ, value);
193222}
194223
195224
196225uint8_t PCA9635::getGroupFREQ ()
197226{
198- return readReg (PCA963X_GRPFREQ);
227+ return readRegister (PCA963X_GRPFREQ);
199228}
200229
201230
@@ -246,6 +275,19 @@ uint8_t PCA9635::writeN(uint8_t channel, uint8_t* arr, uint8_t count)
246275}
247276
248277
278+ uint8_t PCA9635::writeAll (uint8_t * arr)
279+ {
280+ return writeN (0 , arr, 16 );
281+ }
282+
283+
284+ uint8_t PCA9635::allOff ()
285+ {
286+ uint8_t arr[16 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
287+ return writeN (0 , arr, 16 );
288+ }
289+
290+
249291uint8_t PCA9635::writeN_noStop (uint8_t channel, uint8_t * arr, uint8_t count)
250292{
251293 if (channel + count > _channelCount)
@@ -291,7 +333,7 @@ int PCA9635::lastError()
291333
292334// ///////////////////////////////////////////////////
293335//
294- // SUB CALL - ALL CALL
336+ // SUB CALL
295337//
296338bool PCA9635::enableSubCall (uint8_t nr)
297339{
@@ -346,7 +388,7 @@ bool PCA9635::setSubCallAddress(uint8_t nr, uint8_t address)
346388 // _error = ?? TODO
347389 return false ;
348390 }
349- writeReg (PCA963X_SUBADR (nr), address);
391+ writeRegister (PCA963X_SUBADR (nr), address);
350392 return true ;
351393}
352394
@@ -358,11 +400,15 @@ uint8_t PCA9635::getSubCallAddress(uint8_t nr)
358400 // _error = ?? TODO
359401 return 0 ;
360402 }
361- uint8_t address = readReg (PCA963X_SUBADR (nr));
403+ uint8_t address = readRegister (PCA963X_SUBADR (nr));
362404 return address;
363405}
364406
365407
408+ // ///////////////////////////////////////////////////
409+ //
410+ // ALL CALL
411+ //
366412bool PCA9635::enableAllCall ()
367413{
368414 uint8_t prev = getMode1 ();
@@ -394,20 +440,20 @@ bool PCA9635::disableAllCall()
394440bool PCA9635::isEnabledAllCall ()
395441{
396442 uint8_t mask = getMode1 ();
397- return mask & PCA963X_MODE1_ALLCALL;
443+ return ( mask & PCA963X_MODE1_ALLCALL) > 0 ;
398444}
399445
400446
401447bool PCA9635::setAllCallAddress (uint8_t address)
402448{
403- writeReg (PCA963X_ALLCALLADR, address);
449+ writeRegister (PCA963X_ALLCALLADR, address);
404450 return true ;
405451}
406452
407453
408454uint8_t PCA9635::getAllCallAddress ()
409455{
410- uint8_t address = readReg (PCA963X_ALLCALLADR);
456+ uint8_t address = readRegister (PCA963X_ALLCALLADR);
411457 return address;
412458}
413459
@@ -485,51 +531,33 @@ int PCA9635::I2C_SoftwareReset(uint8_t method)
485531uint8_t PCA9635::writeLedOut (uint8_t reg, uint8_t mask)
486532{
487533 if (reg > 3 ) return PCA963X_ERROR;
488- writeReg (PCA963X_LEDOUT_BASE + reg, mask);
534+ writeRegister (PCA963X_LEDOUT_BASE + reg, mask);
489535 return PCA963X_OK;
490536}
491537
492538
493539uint8_t PCA9635::readLedOut (uint8_t reg)
494540{
495541 if (reg > 3 ) return 0x00 ;
496- return readReg (PCA963X_LEDOUT_BASE + reg);
542+ return readRegister (PCA963X_LEDOUT_BASE + reg);
497543}
498544
499545
500- // TODO move to right section after testing.
546+ // ///////////////////////////////////////////////////
547+ //
548+ // OBSOLETE
549+ //
501550uint8_t PCA9635::setLedDriverMode (uint8_t mode)
502551{
503- if (mode > 3 ) return PCA963X_ERR_MODE;
504- uint8_t mask = 0b00000000 ;
505- switch (mode)
506- {
507- case PCA963X_LEDGRPPWM:
508- mask = 0b11111111 ;
509- break ;
510- case PCA963X_LEDPWM:
511- mask = 0b10101010 ;
512- break ;
513- case PCA963X_LEDON:
514- mask = 0b01010101 ;
515- break ;
516- default :
517- mask = 0b00000000 ;
518- break ;
519- }
520- for (int reg = 0 ; reg < 4 ; reg++)
521- {
522- writeLedOut (reg, mask);
523- }
524- return PCA963X_OK;
552+ return setLedDriverModeAll (mode);
525553}
526554
527555
528556// ///////////////////////////////////////////////////
529557//
530558// PRIVATE
531559//
532- uint8_t PCA9635::writeReg (uint8_t reg, uint8_t value)
560+ uint8_t PCA9635::writeRegister (uint8_t reg, uint8_t value)
533561{
534562 _wire->beginTransmission (_address);
535563 _wire->write (reg);
@@ -542,7 +570,7 @@ uint8_t PCA9635::writeReg(uint8_t reg, uint8_t value)
542570}
543571
544572
545- uint8_t PCA9635::readReg (uint8_t reg)
573+ uint8_t PCA9635::readRegister (uint8_t reg)
546574{
547575 _wire->beginTransmission (_address);
548576 _wire->write (reg);
0 commit comments