x

Dependents:   20180621_FT813

Committer:
JackB
Date:
Mon Jul 23 12:25:17 2018 +0000
Revision:
0:0f53e5add603
PCA9745

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:0f53e5add603 1 #include "mbed.h"
JackB 0:0f53e5add603 2 #include "stdint.h"
JackB 0:0f53e5add603 3 #include "PCA9745B.h"
JackB 0:0f53e5add603 4
JackB 0:0f53e5add603 5 PCA9745B::PCA9745B(uint8_t number, PinName SCLK, PinName MOSI) : n(number), spi(MOSI, NC, SCLK)
JackB 0:0f53e5add603 6 {
JackB 0:0f53e5add603 7 numdrivers = n;
JackB 0:0f53e5add603 8
JackB 0:0f53e5add603 9 // Configure SPI to 8 bits and SPI_SPEED
JackB 0:0f53e5add603 10 spi.format(8, 0);
JackB 0:0f53e5add603 11 spi.frequency(SPI_SPEED);
JackB 0:0f53e5add603 12
JackB 0:0f53e5add603 13 BCr = BCg = BCb = 0x7F;
JackB 0:0f53e5add603 14 pwmbuffer = (uint16_t *)calloc(2, 12*n);
JackB 0:0f53e5add603 15 }
JackB 0:0f53e5add603 16
JackB 0:0f53e5add603 17 void PCA9745B::write(void) {
JackB 0:0f53e5add603 18 uint32_t command;
JackB 0:0f53e5add603 19 // Magic word for write
JackB 0:0f53e5add603 20 command = 0x25;
JackB 0:0f53e5add603 21 command <<= 5;
JackB 0:0f53e5add603 22 //OUTTMG = 1, EXTGCK = 0, TMGRST = 1, DSPRPT = 1, BLANK = 0 -> 0x16
JackB 0:0f53e5add603 23 command |= 0x16;
JackB 0:0f53e5add603 24 command <<= 7;
JackB 0:0f53e5add603 25 command |= BCr;
JackB 0:0f53e5add603 26 command <<= 7;
JackB 0:0f53e5add603 27 command |= BCg;
JackB 0:0f53e5add603 28 command <<= 7;
JackB 0:0f53e5add603 29 command |= BCb;
JackB 0:0f53e5add603 30 for (uint8_t n=0; n<numdrivers; n++) {
JackB 0:0f53e5add603 31 spi.write(command >> 24);
JackB 0:0f53e5add603 32 spi.write(command >> 16);
JackB 0:0f53e5add603 33 spi.write(command >> 8);
JackB 0:0f53e5add603 34 spi.write(command);
JackB 0:0f53e5add603 35 // 12 channels per PCA9745B
JackB 0:0f53e5add603 36 for (int8_t c=11; c >= 0 ; c--) {
JackB 0:0f53e5add603 37 // 16 bits per channel, send MSB first
JackB 0:0f53e5add603 38 spi.write(pwmbuffer[n*12+c]>>8);
JackB 0:0f53e5add603 39 spi.write(pwmbuffer[n*12+c]);
JackB 0:0f53e5add603 40 }
JackB 0:0f53e5add603 41 }
JackB 0:0f53e5add603 42 }
JackB 0:0f53e5add603 43
JackB 0:0f53e5add603 44 void PCA9745B::setPWM(uint8_t chan, uint16_t pwm) {
JackB 0:0f53e5add603 45 if (chan > 12*numdrivers) return;
JackB 0:0f53e5add603 46 pwmbuffer[chan] = pwm;
JackB 0:0f53e5add603 47 }
JackB 0:0f53e5add603 48
JackB 0:0f53e5add603 49 void PCA9745B::setLED(uint8_t lednum, uint16_t r, uint16_t g, uint16_t b) {
JackB 0:0f53e5add603 50 setPWM(lednum*3, r);
JackB 0:0f53e5add603 51 setPWM(lednum*3+1, g);
JackB 0:0f53e5add603 52 setPWM(lednum*3+2, b);
JackB 0:0f53e5add603 53 }