x
PCA9745B.cpp@0:0f53e5add603, 2018-07-23 (annotated)
- Committer:
- JackB
- Date:
- Mon Jul 23 12:25:17 2018 +0000
- Revision:
- 0:0f53e5add603
PCA9745
Who changed what in which revision?
User | Revision | Line number | New 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 | } |