Library for NXP MCU I2C RGB LED DEMO board (6 x PCA9635)

Dependents:   RGB2

PCA9635 board - schematic

Warning

When the original NXP demo board is connected to another mcu board : Disable the on-board 8051 mcu.

Committer:
frankvnk
Date:
Tue Apr 01 20:03:30 2014 +0000
Revision:
1:b89b54759940
Parent:
0:1258ad754d9c
Added global intensity function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:1258ad754d9c 1 /**************************************************************************************************
frankvnk 0:1258ad754d9c 2 ***** *****
frankvnk 0:1258ad754d9c 3 ***** Name: PCA9635_6.cpp *****
frankvnk 0:1258ad754d9c 4 ***** Date: 09/03/2014 *****
frankvnk 0:1258ad754d9c 5 ***** Auth: Frank Vannieuwkerke *****
frankvnk 0:1258ad754d9c 6 ***** Func: library for I2C RGB LED Demo board (6 x PCA9635) *****
frankvnk 0:1258ad754d9c 7 ***** Ported from http://mbed.org/users/JimCarver/code/RGB2/ *****
frankvnk 0:1258ad754d9c 8 **************************************************************************************************/
frankvnk 0:1258ad754d9c 9
frankvnk 0:1258ad754d9c 10 //#include "mbed.h"
frankvnk 0:1258ad754d9c 11 #include "PCA9635_6.h"
frankvnk 0:1258ad754d9c 12
frankvnk 0:1258ad754d9c 13 // TODO : check which variables are used - add const if they do not change.
frankvnk 0:1258ad754d9c 14 #define SW_RESET_I2C_ADDRESS 0x06
frankvnk 0:1258ad754d9c 15 #define ALL_CALL_I2C_ADDRESS 0xE0
frankvnk 0:1258ad754d9c 16 #define SUB_ADDRESS_1 0xE2
frankvnk 0:1258ad754d9c 17 #define SUB_ADDRESS_2 0xE4
frankvnk 0:1258ad754d9c 18 #define SUB_ADDRESS_3 0xE8
frankvnk 0:1258ad754d9c 19
frankvnk 0:1258ad754d9c 20 uint8_t SW_RESET[3] = {2,0xA5,0x5A};
frankvnk 0:1258ad754d9c 21
frankvnk 0:1258ad754d9c 22 uint8_t WAKE_UP_AND_INIT[4] = {3,0x80,0x81,0x01};
frankvnk 0:1258ad754d9c 23
frankvnk 0:1258ad754d9c 24 uint8_t GLOBAL_BLINK_SUB_ADDR_1[4] = {3,0x80,0x89,0x21}; // Blink + All Call/Sub-Addr1
frankvnk 0:1258ad754d9c 25 uint8_t GLOBAL_BLINK_SUB_ADDR_2[4] = {3,0x80,0x85,0x21}; // Blink + All Call/Sub-Addr2
frankvnk 0:1258ad754d9c 26 uint8_t GLOBAL_BLINK_SUB_ADDR_3[4] = {3,0x80,0x83,0x21}; // Blink + All Call/Sub-Addr3
frankvnk 0:1258ad754d9c 27 uint8_t GLOBAL_DIM[3] = {2,0x01,0x01};
frankvnk 0:1258ad754d9c 28 uint8_t GLOBAL_INTENSITY[3] = { 2, 0x92, 0};
frankvnk 0:1258ad754d9c 29
frankvnk 0:1258ad754d9c 30 uint8_t ALL_LED_FULL_PWM[18]={17,0x82,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
frankvnk 0:1258ad754d9c 31
frankvnk 0:1258ad754d9c 32 uint8_t LED_ALL_ON[6] = {5,0x94,0x55,0x55,0x55,0x55};
frankvnk 0:1258ad754d9c 33 uint8_t LED_ALL_OFF[6] = {5,0x94,0x00,0x00,0x00,0x00};
frankvnk 0:1258ad754d9c 34 uint8_t LED_ALL_INDVDL_PLUS_GLOBL_PWM_CTRL[6] = {5,0x94,0xFF,0xFF,0xFF,0xFF};
frankvnk 0:1258ad754d9c 35
frankvnk 0:1258ad754d9c 36 uint8_t LED_0_3_6_9_12_15_ON[6] = {5,0x94,0x41,0x10,0x04,0x41};
frankvnk 0:1258ad754d9c 37 uint8_t LED_1_4_7_10_13_ON[6] = {5,0x94,0x10,0x04,0x41,0x10};
frankvnk 0:1258ad754d9c 38 uint8_t LED_2_5_8_11_14_ON[6] = {5,0x94,0x04,0x41,0x10,0x04};
frankvnk 0:1258ad754d9c 39
frankvnk 0:1258ad754d9c 40 //uint8_t dflag, tflag;
frankvnk 0:1258ad754d9c 41
frankvnk 0:1258ad754d9c 42 uint8_t Buffer1[18];
frankvnk 0:1258ad754d9c 43 uint8_t Buffer2[18];
frankvnk 0:1258ad754d9c 44 uint8_t Buffer3[18];
frankvnk 0:1258ad754d9c 45 uint8_t Buffer4[18];
frankvnk 0:1258ad754d9c 46 uint8_t Buffer5[18];
frankvnk 0:1258ad754d9c 47 uint8_t Buffer6[18];
frankvnk 0:1258ad754d9c 48
frankvnk 0:1258ad754d9c 49 I2C_MESSAGE I2C_Message;
frankvnk 0:1258ad754d9c 50 //int dval;
frankvnk 0:1258ad754d9c 51
frankvnk 0:1258ad754d9c 52 /*typedef struct {
frankvnk 0:1258ad754d9c 53 uint32_t LED;
frankvnk 0:1258ad754d9c 54 uint8_t RED, GREEN, BLUE, INTENSITY;
frankvnk 0:1258ad754d9c 55 } LED_Report_type ;
frankvnk 0:1258ad754d9c 56
frankvnk 0:1258ad754d9c 57 volatile LED_Report_type *LED_Report;*/
frankvnk 0:1258ad754d9c 58
frankvnk 0:1258ad754d9c 59 typedef struct {
frankvnk 0:1258ad754d9c 60 // Definition for a LED location, buffer pointer, and index into that buffer
frankvnk 0:1258ad754d9c 61 uint8_t *buf, n;
frankvnk 0:1258ad754d9c 62 } LED_type;
frankvnk 0:1258ad754d9c 63
frankvnk 0:1258ad754d9c 64 typedef struct {
frankvnk 0:1258ad754d9c 65 LED_type RED;
frankvnk 0:1258ad754d9c 66 LED_type GREEN;
frankvnk 0:1258ad754d9c 67 LED_type BLUE;
frankvnk 0:1258ad754d9c 68 } RGB_type;
frankvnk 0:1258ad754d9c 69
frankvnk 0:1258ad754d9c 70 // An array of structures that define the buffer and location in the buffer for all of the LEDs
frankvnk 0:1258ad754d9c 71 // Due to the design of the RGB LED board this is easier than the convoluted calculation needed
frankvnk 0:1258ad754d9c 72 //
frankvnk 0:1258ad754d9c 73 RGB_type RGB_LED[32] = {
frankvnk 0:1258ad754d9c 74 // RED GREEN BLUE
frankvnk 0:1258ad754d9c 75 // LED1-16
frankvnk 0:1258ad754d9c 76 Buffer1, 2, Buffer1, 3, Buffer1, 4,
frankvnk 0:1258ad754d9c 77 Buffer1, 5, Buffer1, 6, Buffer1, 7,
frankvnk 0:1258ad754d9c 78 Buffer1, 8, Buffer1, 9, Buffer1, 10,
frankvnk 0:1258ad754d9c 79 Buffer1, 11, Buffer1, 12, Buffer1, 13,
frankvnk 0:1258ad754d9c 80 Buffer1, 14, Buffer1, 15, Buffer1, 16,
frankvnk 0:1258ad754d9c 81 Buffer1, 17, Buffer3, 2, Buffer3, 3,
frankvnk 0:1258ad754d9c 82 Buffer3, 4, Buffer3, 5, Buffer3, 6,
frankvnk 0:1258ad754d9c 83 Buffer3, 7, Buffer3, 8, Buffer3, 9,
frankvnk 0:1258ad754d9c 84 Buffer3, 10, Buffer3, 11, Buffer3, 12,
frankvnk 0:1258ad754d9c 85 Buffer3, 13, Buffer3, 14, Buffer3, 15,
frankvnk 0:1258ad754d9c 86 Buffer3, 16, Buffer3, 17, Buffer5, 2,
frankvnk 0:1258ad754d9c 87 Buffer5, 3, Buffer5, 4, Buffer5, 5,
frankvnk 0:1258ad754d9c 88 Buffer5, 6, Buffer5, 7, Buffer5, 8,
frankvnk 0:1258ad754d9c 89 Buffer5, 9, Buffer5, 10, Buffer5, 11,
frankvnk 0:1258ad754d9c 90 Buffer5, 12, Buffer5, 13, Buffer5, 14,
frankvnk 0:1258ad754d9c 91 Buffer5, 15, Buffer5, 16, Buffer5, 17,
frankvnk 0:1258ad754d9c 92
frankvnk 0:1258ad754d9c 93 // LED17-32
frankvnk 0:1258ad754d9c 94 Buffer2, 2, Buffer2, 3, Buffer2, 4,
frankvnk 0:1258ad754d9c 95 Buffer2, 5, Buffer2, 6, Buffer2, 7,
frankvnk 0:1258ad754d9c 96 Buffer2, 8, Buffer2, 9, Buffer2, 10,
frankvnk 0:1258ad754d9c 97 Buffer2, 11, Buffer2, 12, Buffer2, 13,
frankvnk 0:1258ad754d9c 98 Buffer2, 14, Buffer2, 15, Buffer2, 16,
frankvnk 0:1258ad754d9c 99 Buffer2, 17, Buffer4, 2, Buffer4, 3,
frankvnk 0:1258ad754d9c 100 Buffer4, 4, Buffer4, 5, Buffer4, 6,
frankvnk 0:1258ad754d9c 101 Buffer4, 7, Buffer4, 8, Buffer4, 9,
frankvnk 0:1258ad754d9c 102 Buffer4, 10, Buffer4, 11, Buffer4, 12,
frankvnk 0:1258ad754d9c 103 Buffer4, 13, Buffer4, 14, Buffer4, 15,
frankvnk 0:1258ad754d9c 104 Buffer4, 16, Buffer4, 17, Buffer6, 2,
frankvnk 0:1258ad754d9c 105 Buffer6, 3, Buffer6, 4, Buffer6, 5,
frankvnk 0:1258ad754d9c 106 Buffer6, 6, Buffer6, 7, Buffer6, 8,
frankvnk 0:1258ad754d9c 107 Buffer6, 9, Buffer6, 10, Buffer6, 11,
frankvnk 0:1258ad754d9c 108 Buffer6, 12, Buffer6, 13, Buffer6, 14,
frankvnk 0:1258ad754d9c 109 Buffer6, 15, Buffer6, 16, Buffer6, 17
frankvnk 0:1258ad754d9c 110 };
frankvnk 0:1258ad754d9c 111
frankvnk 0:1258ad754d9c 112 PCA9635_6::PCA9635_6(PinName sda, PinName scl, PinName en) : _i2c(sda, scl), _en(en)
frankvnk 0:1258ad754d9c 113 {
frankvnk 0:1258ad754d9c 114 _i2c.frequency(800000);
frankvnk 0:1258ad754d9c 115 // enable PCA9635 board
frankvnk 0:1258ad754d9c 116 _en = 0;
frankvnk 0:1258ad754d9c 117 // Perform Software Reset - Set the PCA9635 in a known state
frankvnk 0:1258ad754d9c 118 I2C_Message.buf = SW_RESET;
frankvnk 0:1258ad754d9c 119 Write_To_Device(SW_RESET_I2C_ADDRESS);
frankvnk 0:1258ad754d9c 120 // Wake up and Init the PCA9635 using ALL CALL address
frankvnk 0:1258ad754d9c 121 I2C_Message.buf = WAKE_UP_AND_INIT;
frankvnk 0:1258ad754d9c 122 Write_All_Devices();
frankvnk 0:1258ad754d9c 123 Init_Buffers();
frankvnk 0:1258ad754d9c 124 // Program all LED outputs to Individual PWM + Global PWM using ALL CALL address
frankvnk 0:1258ad754d9c 125 I2C_Message.buf = LED_ALL_INDVDL_PLUS_GLOBL_PWM_CTRL;
frankvnk 0:1258ad754d9c 126 Write_All_Devices();
frankvnk 0:1258ad754d9c 127 }
frankvnk 0:1258ad754d9c 128
frankvnk 0:1258ad754d9c 129 void PCA9635_6::set_LED(int LEDn, uint8_t R, uint8_t G, uint8_t B)
frankvnk 0:1258ad754d9c 130 {
frankvnk 0:1258ad754d9c 131 RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n] = R;
frankvnk 0:1258ad754d9c 132 RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n] = G;
frankvnk 0:1258ad754d9c 133 RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n] = B;
frankvnk 0:1258ad754d9c 134 }
frankvnk 0:1258ad754d9c 135
frankvnk 0:1258ad754d9c 136 void PCA9635_6::Init_Buffers(void)
frankvnk 0:1258ad754d9c 137 {
frankvnk 0:1258ad754d9c 138 int i = 0;
frankvnk 0:1258ad754d9c 139 for (i = 0; i<18; i++) {
frankvnk 0:1258ad754d9c 140 Buffer1[i] = 0;
frankvnk 0:1258ad754d9c 141 Buffer2[i] = 0;
frankvnk 0:1258ad754d9c 142 Buffer3[i] = 0;
frankvnk 0:1258ad754d9c 143 Buffer4[i] = 0;
frankvnk 0:1258ad754d9c 144 Buffer5[i] = 0;
frankvnk 0:1258ad754d9c 145 Buffer6[i] = 0;
frankvnk 0:1258ad754d9c 146 }
frankvnk 0:1258ad754d9c 147
frankvnk 0:1258ad754d9c 148 Buffer1[0] = 17;
frankvnk 0:1258ad754d9c 149 Buffer2[0] = 17;
frankvnk 0:1258ad754d9c 150 Buffer3[0] = 17;
frankvnk 0:1258ad754d9c 151 Buffer4[0] = 17;
frankvnk 0:1258ad754d9c 152 Buffer5[0] = 17;
frankvnk 0:1258ad754d9c 153 Buffer6[0] = 17;
frankvnk 0:1258ad754d9c 154 Buffer1[1] = 0x82;
frankvnk 0:1258ad754d9c 155 Buffer2[1] = 0x82;
frankvnk 0:1258ad754d9c 156 Buffer3[1] = 0x82;
frankvnk 0:1258ad754d9c 157 Buffer4[1] = 0x82;
frankvnk 0:1258ad754d9c 158 Buffer5[1] = 0x82;
frankvnk 0:1258ad754d9c 159 Buffer6[1] = 0x82;
frankvnk 0:1258ad754d9c 160 }
frankvnk 0:1258ad754d9c 161
frankvnk 0:1258ad754d9c 162
frankvnk 0:1258ad754d9c 163 void PCA9635_6::Set_Same_Color_Single_Device(uint8_t A, uint8_t B, uint8_t C)
frankvnk 0:1258ad754d9c 164 {
frankvnk 0:1258ad754d9c 165 int i;
frankvnk 0:1258ad754d9c 166 Buffer1[0] = 17;
frankvnk 0:1258ad754d9c 167 Buffer1[1] = 0x82;
frankvnk 0:1258ad754d9c 168 for (i = 0; i < 5; i++) {
frankvnk 0:1258ad754d9c 169 Buffer1[3*i+2] = A;
frankvnk 0:1258ad754d9c 170 Buffer1[3*i+3] = B;
frankvnk 0:1258ad754d9c 171 Buffer1[3*i+4] = C;
frankvnk 0:1258ad754d9c 172 }
frankvnk 0:1258ad754d9c 173 Buffer1[17] = A;
frankvnk 0:1258ad754d9c 174 }
frankvnk 0:1258ad754d9c 175
frankvnk 0:1258ad754d9c 176
frankvnk 0:1258ad754d9c 177 void PCA9635_6::i2cfail(void)
frankvnk 0:1258ad754d9c 178 {
frankvnk 0:1258ad754d9c 179 // printf("-------> I2C error\r\n");
frankvnk 0:1258ad754d9c 180 while(1) {
frankvnk 0:1258ad754d9c 181 }
frankvnk 0:1258ad754d9c 182 }
frankvnk 0:1258ad754d9c 183
frankvnk 0:1258ad754d9c 184 void PCA9635_6::I2C_Write(I2C_MESSAGE *mp)
frankvnk 0:1258ad754d9c 185 {
frankvnk 0:1258ad754d9c 186 if(_i2c.write(mp->address, (char *) &mp->buf[1], mp->buf[0])) i2cfail();
frankvnk 0:1258ad754d9c 187 }
frankvnk 0:1258ad754d9c 188
frankvnk 0:1258ad754d9c 189 void PCA9635_6::Write_All_Devices(void)
frankvnk 0:1258ad754d9c 190 {
frankvnk 0:1258ad754d9c 191 I2C_Message.address = ALL_CALL_I2C_ADDRESS;
frankvnk 0:1258ad754d9c 192 I2C_Write(&I2C_Message);
frankvnk 0:1258ad754d9c 193 }
frankvnk 0:1258ad754d9c 194
frankvnk 0:1258ad754d9c 195 void PCA9635_6::Write_To_Device(uint8_t I2C_Address)
frankvnk 0:1258ad754d9c 196 {
frankvnk 0:1258ad754d9c 197 I2C_Message.address = I2C_Address;
frankvnk 0:1258ad754d9c 198 I2C_Write(&I2C_Message);
frankvnk 0:1258ad754d9c 199 }
frankvnk 0:1258ad754d9c 200
frankvnk 0:1258ad754d9c 201 void PCA9635_6::Write_To_Device_And_Wait(uint8_t I2C_Address, uint8_t Delay_Value)
frankvnk 0:1258ad754d9c 202 {
frankvnk 0:1258ad754d9c 203 I2C_Message.address = I2C_Address;
frankvnk 0:1258ad754d9c 204 I2C_Write(&I2C_Message);
frankvnk 0:1258ad754d9c 205 wait_ms(Delay_Value);
frankvnk 0:1258ad754d9c 206 }
frankvnk 0:1258ad754d9c 207
frankvnk 0:1258ad754d9c 208 void PCA9635_6::ALL_LED_OFF(void) // Switch off all the LEDs
frankvnk 0:1258ad754d9c 209 {
frankvnk 0:1258ad754d9c 210 I2C_Message.buf = LED_ALL_OFF;
frankvnk 0:1258ad754d9c 211 Write_All_Devices();
frankvnk 0:1258ad754d9c 212 }
frankvnk 0:1258ad754d9c 213
frankvnk 0:1258ad754d9c 214 void PCA9635_6::LED_INTENSITY(void)
frankvnk 0:1258ad754d9c 215 {
frankvnk 0:1258ad754d9c 216 //GLOBAL_INTENSITY[2] = global_i;
frankvnk 0:1258ad754d9c 217 I2C_Message.buf = GLOBAL_INTENSITY;
frankvnk 0:1258ad754d9c 218 Write_All_Devices();
frankvnk 0:1258ad754d9c 219 }
frankvnk 0:1258ad754d9c 220
frankvnk 0:1258ad754d9c 221 void PCA9635_6::update_LED(void)
frankvnk 0:1258ad754d9c 222 {
frankvnk 0:1258ad754d9c 223 I2C_Message.buf = Buffer1;
frankvnk 0:1258ad754d9c 224 Write_To_Device(0x80);
frankvnk 0:1258ad754d9c 225 I2C_Message.buf = Buffer2;
frankvnk 0:1258ad754d9c 226 Write_To_Device(0x86);
frankvnk 0:1258ad754d9c 227 I2C_Message.buf = Buffer3;
frankvnk 0:1258ad754d9c 228 Write_To_Device(0x82);
frankvnk 0:1258ad754d9c 229 I2C_Message.buf = Buffer4;
frankvnk 0:1258ad754d9c 230 Write_To_Device(0x88);
frankvnk 0:1258ad754d9c 231 I2C_Message.buf = Buffer5;
frankvnk 0:1258ad754d9c 232 Write_To_Device(0x84);
frankvnk 0:1258ad754d9c 233 I2C_Message.buf = Buffer6;
frankvnk 0:1258ad754d9c 234 Write_To_Device(0x8A);
frankvnk 0:1258ad754d9c 235 }
frankvnk 0:1258ad754d9c 236
frankvnk 0:1258ad754d9c 237 void PCA9635_6::read_LED( int LEDn, uint8_t *R, uint8_t *G, uint8_t *B)
frankvnk 0:1258ad754d9c 238 {
frankvnk 0:1258ad754d9c 239 *R = RGB_LED[LEDn].RED.buf[RGB_LED[LEDn].RED.n];
frankvnk 0:1258ad754d9c 240 *G = RGB_LED[LEDn].GREEN.buf[RGB_LED[LEDn].GREEN.n];
frankvnk 0:1258ad754d9c 241 *B = RGB_LED[LEDn].BLUE.buf[RGB_LED[LEDn].BLUE.n];
frankvnk 0:1258ad754d9c 242 }
frankvnk 0:1258ad754d9c 243
frankvnk 1:b89b54759940 244 void PCA9635_6::set_global_intensity(uint8_t globi)
frankvnk 1:b89b54759940 245 {
frankvnk 1:b89b54759940 246 GLOBAL_INTENSITY[2] = globi;
frankvnk 1:b89b54759940 247 }
frankvnk 0:1258ad754d9c 248
frankvnk 1:b89b54759940 249