i2c RGBW led driver push/pull or opendrain output

Fork of PCA9633 by Mederic Melard

Committer:
mederic
Date:
Thu Jun 21 07:28:23 2018 +0000
Revision:
1:f95d80e0f84a
Parent:
0:39b243509a43
Child:
2:651ace168465
first released

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mederic 0:39b243509a43 1 #include "PCA9633.h"
mederic 0:39b243509a43 2 #include <math.h>
mederic 0:39b243509a43 3
mederic 0:39b243509a43 4 //***********************************/************************************
mederic 0:39b243509a43 5 // Constant //
mederic 0:39b243509a43 6 //***********************************/************************************
mederic 1:f95d80e0f84a 7 #define PCA9633_ADD_SWRST 0x06 // Software Reset Call Address (0x03<<1)
mederic 0:39b243509a43 8 #define PCA9633_REG_SWRST 0xa5 // Software Reset register
mederic 0:39b243509a43 9 #define PCA9633_VAL_SWRST 0x5a // Software Reset register
mederic 0:39b243509a43 10
mederic 0:39b243509a43 11 // Register addr (with auto increment)
mederic 0:39b243509a43 12 #define PCA9633_REG_MODE1 0x80 // Mode register 1
mederic 0:39b243509a43 13 #define PCA9633_REG_MODE2 0x81 // Mode register 2
mederic 0:39b243509a43 14 #define PCA9633_REG_PWM0 0x82 // brightness control LED0
mederic 0:39b243509a43 15 #define PCA9633_REG_GRPPWM 0x86 // group duty cycle control
mederic 0:39b243509a43 16 #define PCA9633_REG_GRPFREQ 0x87 // group frequency
mederic 0:39b243509a43 17 #define PCA9633_REG_LEDOUT 0x88 // LED output state
mederic 0:39b243509a43 18
mederic 0:39b243509a43 19 //PCA9633 MODE2 register bit
mederic 0:39b243509a43 20 #define PCA9633_BIT_DMBLNK 0x05
mederic 0:39b243509a43 21 #define PCA9633_BIT_INVRT 0x04
mederic 0:39b243509a43 22 #define PCA9633_BIT_OUTDRV 0x02
mederic 0:39b243509a43 23
mederic 0:39b243509a43 24 //***********************************/************************************
mederic 0:39b243509a43 25 // Constructors //
mederic 0:39b243509a43 26 //***********************************/************************************
mederic 0:39b243509a43 27 PCA9633::PCA9633(I2C *i2c, char addr, bool invert, bool openDrain):_i2c(i2c){
mederic 0:39b243509a43 28 _addr = addr<<1;
mederic 0:39b243509a43 29 softReset();
mederic 0:39b243509a43 30 /* SLEEP=0 Normal Mode
mederic 0:39b243509a43 31 SUB1 =0 PCA9633 does not respond to I2C-bus subaddress 1.
mederic 0:39b243509a43 32 SUB2 =0 PCA9633 does not respond to I2C-bus subaddress 2.
mederic 0:39b243509a43 33 SUB3 =0 PCA9633 does not respond to I2C-bus subaddress 3.
mederic 0:39b243509a43 34 ALLCAL =0 PCA9633 does not respond to LED All Call I2C-bus address.*/
mederic 1:f95d80e0f84a 35 char buf[2] = {PCA9633_REG_MODE1,0};
mederic 1:f95d80e0f84a 36 _i2c->write(_addr,buf,2);
mederic 0:39b243509a43 37 config(invert, openDrain);
mederic 0:39b243509a43 38 }
mederic 0:39b243509a43 39
mederic 0:39b243509a43 40 void PCA9633::config(bool invert, bool openDrain){
mederic 1:f95d80e0f84a 41 char buf[2] = {PCA9633_REG_MODE2,0};
mederic 1:f95d80e0f84a 42 buf[1] = (invert<<PCA9633_BIT_INVRT ) | (openDrain<<PCA9633_BIT_OUTDRV);
mederic 1:f95d80e0f84a 43 _i2c->write(_addr,buf,2);
mederic 0:39b243509a43 44 }
mederic 0:39b243509a43 45
mederic 0:39b243509a43 46 void PCA9633::softReset(void){
mederic 1:f95d80e0f84a 47 char buf[2] = {PCA9633_REG_SWRST,PCA9633_VAL_SWRST};
mederic 1:f95d80e0f84a 48 _i2c->write(0x06,buf,2);
mederic 0:39b243509a43 49 }
mederic 0:39b243509a43 50
mederic 0:39b243509a43 51 void PCA9633::pwm(char bright, char pos){
mederic 1:f95d80e0f84a 52 char buf[5] = {PCA9633_REG_PWM0,bright,bright,bright,bright};
mederic 0:39b243509a43 53 char len = 5;
mederic 0:39b243509a43 54 if(pos<PCA9633::ALL){
mederic 0:39b243509a43 55 len=2;
mederic 1:f95d80e0f84a 56 buf[0]+=pos;
mederic 0:39b243509a43 57 }
mederic 1:f95d80e0f84a 58 _i2c->write(_addr,buf,len);
mederic 0:39b243509a43 59 }
mederic 0:39b243509a43 60
mederic 1:f95d80e0f84a 61 void PCA9633::dim(char val){;
mederic 1:f95d80e0f84a 62 char buf[2] = {PCA9633_REG_MODE2,0};
mederic 1:f95d80e0f84a 63 _i2c->write(_addr,buf,1); //cmd to read mode2
mederic 1:f95d80e0f84a 64 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 1:f95d80e0f84a 65 buf[1] &= ~(1<<PCA9633_BIT_DMBLNK); //set dimming in mode2
mederic 1:f95d80e0f84a 66 _i2c->write(_addr,buf,2); //write mode2
mederic 0:39b243509a43 67
mederic 1:f95d80e0f84a 68 buf[0] = PCA9633_REG_GRPPWM;
mederic 1:f95d80e0f84a 69 buf[1] = val;
mederic 1:f95d80e0f84a 70 _i2c->write(_addr,buf,2); //dimming
mederic 0:39b243509a43 71 }
mederic 0:39b243509a43 72
mederic 0:39b243509a43 73 void PCA9633::blink(char duty, float period){
mederic 1:f95d80e0f84a 74 char buf[3] = {PCA9633_REG_MODE2,0,0};
mederic 0:39b243509a43 75 _i2c->write(_addr,buf,1); //cmd to read mode2
mederic 0:39b243509a43 76 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 0:39b243509a43 77 buf[1] |= (1<<PCA9633_BIT_DMBLNK); //set blink in mode2
mederic 0:39b243509a43 78 _i2c->write(_addr,buf,2); //write mode2
mederic 0:39b243509a43 79
mederic 0:39b243509a43 80 buf[0] = PCA9633_REG_GRPPWM;
mederic 0:39b243509a43 81 buf[1] = duty;
mederic 0:39b243509a43 82 buf[2] = char(rint((period*24.0)-1));
mederic 0:39b243509a43 83 _i2c->write(_addr,buf,3);
mederic 0:39b243509a43 84
mederic 0:39b243509a43 85 }
mederic 0:39b243509a43 86
mederic 0:39b243509a43 87 void PCA9633::ledout(char state, char pos){
mederic 1:f95d80e0f84a 88 char buf[2] = {PCA9633_REG_LEDOUT,0};
mederic 0:39b243509a43 89 _i2c->write(_addr,buf,1); //cmd to read ledout
mederic 0:39b243509a43 90 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 0:39b243509a43 91
mederic 0:39b243509a43 92 if(pos<PCA9633::ALL){
mederic 1:f95d80e0f84a 93 buf[1] &= ~(0x03<<(pos<<1)); // erase 2 state bit of selected position
mederic 1:f95d80e0f84a 94 buf[1] |= (state<<(pos<<1)); // set state at position
mederic 0:39b243509a43 95 }
mederic 0:39b243509a43 96 else{
mederic 0:39b243509a43 97 for(int i=0;i<PCA9633::ALL;i++){
mederic 1:f95d80e0f84a 98 buf[1] &= ~(0x03<<(i<<1)); // erase 2 state bit of selected position
mederic 1:f95d80e0f84a 99 buf[1] |= (state<<(i<<1)); // set state at position
mederic 0:39b243509a43 100 }
mederic 0:39b243509a43 101 }
mederic 0:39b243509a43 102 _i2c->write(_addr,buf,2); //write LEDOUT
mederic 0:39b243509a43 103 }