i2c RGBW led driver push/pull or opendrain output
Fork of PCA9633 by
PCA9633.cpp@3:abc759c7c7bb, 2018-06-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |