i2c RGBW led driver push/pull or opendrain output

Fork of PCA9633 by Mederic Melard

Committer:
mederic
Date:
Tue Jun 26 08:54:11 2018 +0000
Revision:
3:abc759c7c7bb
Parent:
2:651ace168465
remove debug printf message

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 2:651ace168465 40 void PCA9633::config(bool invert, bool openDrain){
mederic 3:abc759c7c7bb 41 char buf[2] = {PCA9633_REG_MODE2,0};
mederic 2:651ace168465 42 _i2c->write(_addr,buf,1); //cmd to read mode2
mederic 2:651ace168465 43 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 2:651ace168465 44
mederic 2:651ace168465 45 buf[1] &= ~((1<<PCA9633_BIT_INVRT)|(1<<PCA9633_BIT_OUTDRV));
mederic 2:651ace168465 46 buf[1] |= ((invert<<PCA9633_BIT_INVRT )|((!openDrain)<<PCA9633_BIT_OUTDRV));
mederic 1:f95d80e0f84a 47 _i2c->write(_addr,buf,2);
mederic 0:39b243509a43 48 }
mederic 0:39b243509a43 49
mederic 0:39b243509a43 50 void PCA9633::softReset(void){
mederic 1:f95d80e0f84a 51 char buf[2] = {PCA9633_REG_SWRST,PCA9633_VAL_SWRST};
mederic 1:f95d80e0f84a 52 _i2c->write(0x06,buf,2);
mederic 0:39b243509a43 53 }
mederic 0:39b243509a43 54
mederic 0:39b243509a43 55 void PCA9633::pwm(char bright, char pos){
mederic 1:f95d80e0f84a 56 char buf[5] = {PCA9633_REG_PWM0,bright,bright,bright,bright};
mederic 0:39b243509a43 57 char len = 5;
mederic 0:39b243509a43 58 if(pos<PCA9633::ALL){
mederic 0:39b243509a43 59 len=2;
mederic 1:f95d80e0f84a 60 buf[0]+=pos;
mederic 0:39b243509a43 61 }
mederic 1:f95d80e0f84a 62 _i2c->write(_addr,buf,len);
mederic 0:39b243509a43 63 }
mederic 0:39b243509a43 64
mederic 1:f95d80e0f84a 65 void PCA9633::dim(char val){;
mederic 1:f95d80e0f84a 66 char buf[2] = {PCA9633_REG_MODE2,0};
mederic 1:f95d80e0f84a 67 _i2c->write(_addr,buf,1); //cmd to read mode2
mederic 1:f95d80e0f84a 68 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 1:f95d80e0f84a 69 buf[1] &= ~(1<<PCA9633_BIT_DMBLNK); //set dimming in mode2
mederic 1:f95d80e0f84a 70 _i2c->write(_addr,buf,2); //write mode2
mederic 0:39b243509a43 71
mederic 1:f95d80e0f84a 72 buf[0] = PCA9633_REG_GRPPWM;
mederic 1:f95d80e0f84a 73 buf[1] = val;
mederic 1:f95d80e0f84a 74 _i2c->write(_addr,buf,2); //dimming
mederic 0:39b243509a43 75 }
mederic 0:39b243509a43 76
mederic 0:39b243509a43 77 void PCA9633::blink(char duty, float period){
mederic 1:f95d80e0f84a 78 char buf[3] = {PCA9633_REG_MODE2,0,0};
mederic 0:39b243509a43 79 _i2c->write(_addr,buf,1); //cmd to read mode2
mederic 0:39b243509a43 80 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 0:39b243509a43 81 buf[1] |= (1<<PCA9633_BIT_DMBLNK); //set blink in mode2
mederic 0:39b243509a43 82 _i2c->write(_addr,buf,2); //write mode2
mederic 0:39b243509a43 83
mederic 0:39b243509a43 84 buf[0] = PCA9633_REG_GRPPWM;
mederic 0:39b243509a43 85 buf[1] = duty;
mederic 0:39b243509a43 86 buf[2] = char(rint((period*24.0)-1));
mederic 0:39b243509a43 87 _i2c->write(_addr,buf,3);
mederic 0:39b243509a43 88
mederic 0:39b243509a43 89 }
mederic 0:39b243509a43 90
mederic 0:39b243509a43 91 void PCA9633::ledout(char state, char pos){
mederic 1:f95d80e0f84a 92 char buf[2] = {PCA9633_REG_LEDOUT,0};
mederic 0:39b243509a43 93 _i2c->write(_addr,buf,1); //cmd to read ledout
mederic 0:39b243509a43 94 _i2c->read(_addr, &buf[1],1); //stock in buf[1]
mederic 0:39b243509a43 95
mederic 0:39b243509a43 96 if(pos<PCA9633::ALL){
mederic 1:f95d80e0f84a 97 buf[1] &= ~(0x03<<(pos<<1)); // erase 2 state bit of selected position
mederic 1:f95d80e0f84a 98 buf[1] |= (state<<(pos<<1)); // set state at position
mederic 0:39b243509a43 99 }
mederic 0:39b243509a43 100 else{
mederic 0:39b243509a43 101 for(int i=0;i<PCA9633::ALL;i++){
mederic 1:f95d80e0f84a 102 buf[1] &= ~(0x03<<(i<<1)); // erase 2 state bit of selected position
mederic 1:f95d80e0f84a 103 buf[1] |= (state<<(i<<1)); // set state at position
mederic 0:39b243509a43 104 }
mederic 0:39b243509a43 105 }
mederic 0:39b243509a43 106 _i2c->write(_addr,buf,2); //write LEDOUT
mederic 0:39b243509a43 107 }