16-channel Fm+ I2C-bus 57 mA/20 V constant current LED driver

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCA9955A.cpp Source File

PCA9955A.cpp

00001 #include "mbed.h"
00002 #include "PCA9955A.h"
00003  
00004 I2C i2c(p28,p27);        // sda, scl
00005 Serial pc(USBTX, USBRX); // tx, rx
00006 char cmd[32];
00007 int i, j, k;
00008 int sw;
00009  
00010 void set_ch(char sel)
00011 {    // PCA9541のサンプル
00012         // MST_0側の自分にスレーブ側の制御権を得る場合
00013     cmd[0] = 1;                     // PCA9541 コマンドコード Cont Reg
00014     i2c.write( 0xe2, cmd, 1);       // Cont Regを指定
00015     i2c.read( 0xe2, cmd, 1);        // Cont Regを読込み
00016     wait(0.1);                      // 0.1s待つ
00017     switch(cmd[0] & 0xf)
00018     {
00019     case 0:                         // bus off, has control
00020     case 1:                         // bus off, no control
00021     case 5:                         // bus on, no control
00022         cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
00023         cmd[1] = 4;                 // bus on, has control
00024         i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
00025         i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
00026         break;
00027     case 2:                         // bus off, no control
00028     case 3:                         // bus off, has control
00029     case 6:                         // bus on, no control
00030         cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
00031         cmd[1] = 5;                 // bus on, has control
00032         i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
00033         i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
00034         break;
00035     case 9:                         // bus on, no control
00036     case 0xc:                       // bus on, no control
00037     case 0xd:                       // bus off, no control
00038         cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
00039         cmd[1] = 0;                 // bus on, has control
00040         i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
00041         i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
00042         break;
00043     case 0xa:                       // bus on, no control
00044     case 0xe:                       // bus off, no control
00045     case 0xf:                       // bus on, has control
00046         cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
00047         cmd[1] = 1;                 // bus on, has control
00048         i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
00049         i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
00050         break;
00051     default:
00052         break;
00053     }
00054 
00055     cmd[0] = sel;                   // PCA9546 Cont Reg sel channel enabled
00056     i2c.write( 0xe8, cmd, 1);       // Send command string
00057 }
00058 
00059 int main ()
00060 {
00061     i2c.frequency(100000);
00062     pc.printf("PCA9955A Sample Program\r\n");
00063     
00064     set_ch(1);              // PCA9955Aはch0に接続
00065     
00066   // PCA9955A
00067     while(1)
00068     {
00069         pc.printf("シーケンシャル … 1, グラデーション … 2 ? \r\n");
00070         pc.scanf("%d", &sw);
00071         pc.printf("%d\r\n", sw);
00072         switch (sw)
00073         {
00074         case 1:
00075             pc.printf("シーケンシャル Sample Start\r\n");
00076 
00077             cmd[0] = MODE1;
00078             cmd[1] = 0x0;           // SLEEP = 0
00079             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00080 
00081             cmd[0] = LEDOUT0 + 0x80;   // LEDOUT0, Auto incriment
00082             cmd[1] = 0xaa;          // LED3,2,1,0 10= PWM
00083             cmd[2] = 0xaa;          // LED7,6,5,4 10= PWM
00084             cmd[3] = 0xaa;          // LED11,10,9,8 10= PWM
00085             cmd[4] = 0xaa;          // LED15,14,13,12 10= PWM
00086             i2c.write(PCA9955A_ADDR, cmd, 5);   // cmd[0]Regにcmd[1-4]を書込み
00087 
00088             cmd[0] = IREF0 + 0x80;           // IREF0, Auto incriment
00089             for(i=0; i<16; i++)  cmd[i+1] = 0x80;   // all IREF = 50%
00090             i2c.write(PCA9955A_ADDR, cmd, 17);   // cmd[0]Regにcmd[1-16]を書込み
00091 
00092             for(k=0; k<3; k++)      // 3回繰返す
00093             {
00094                 for(i=0; i<16; i++) // チャネル0~15まで一つずつ点灯
00095                 {
00096                     cmd[0] = PWM0 + 0x80;           // PWM0, Auto incriment
00097                     for(j=0; j<16; j++)  cmd[j+1] = 0x0;   // all LED PWM = 0%
00098                     cmd[i+1] = 0xff;   // iチャネルのLED PWM = 99.6%
00099                     i2c.write(PCA9955A_ADDR, cmd, 17);   // cmd[0]Regにcmd[1-16]を書込み
00100                     wait(0.5);
00101                 }
00102             }
00103             pc.printf("シーケンシャル Sample End\r\n");
00104             break;
00105         case 2:
00106             pc.printf("グラデーション Sample Start\r\n");
00107 
00108             cmd[0] = MODE1;
00109             cmd[1] = 0x0;           // SLEEP = 0
00110             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00111 
00112             cmd[0] = LEDOUT0 + 0x80;   // LEDOUT0, Auto incriment
00113             cmd[1] = 0x55;          // LED3,2,1,0 01= ON
00114             cmd[2] = 0x05;          // LED7,6 00= OFF  LED5,4 01= ON 
00115             cmd[3] = 0x00;          // LED11,10,9,8 00= OFF
00116             cmd[4] = 0x00;          // LED15,14,13,12 00= OFF
00117             i2c.write(PCA9955A_ADDR, cmd, 5);   // cmd[0]Regにcmd[1-4]を書込み
00118 
00119 /*            cmd[0] = PWMALL;
00120             cmd[1] = 0xFF;           // PWM = 99.6%
00121             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00122 */
00123             cmd[0] = GRAD_GRP_SEL1;
00124             cmd[1] = 0x50;           // LED3, 4 = GRP0
00125             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00126 
00127             cmd[0] = IREFALL;         //
00128             cmd[1] = 0x1;           // あとでIREF_GRP0で設定するので1以上であればよい
00129             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00130 /*            cmd[0] = IREF4;         //
00131             cmd[1] = 0x1;           // Idrv = 240 * 40uA(Rext = 5.6k)=9.6mA
00132             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00133 */
00134             cmd[0] = GRAD_MODE_SEL0;
00135             cmd[1] = 0x31;           // LED0, 4, 5 = Gradation
00136             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00137 
00138             cmd[0] = GRAD_GRP_SEL0;
00139             cmd[1] = 0x0;           // LED0, 1, 2, 3 = GRP0
00140             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00141 
00142 
00143             cmd[0] = IREF_GRP0;
00144             cmd[1] = 0xF0;           // Idrv = 240 * 40uA(Rext = 5.6k)=9.6mA
00145             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00146 
00147             cmd[0] = STEP_TIME_GRP0;
00148             cmd[1] = 0x3F;           // 0.5ms * 64 = 32ms
00149             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00150 
00151             cmd[0] = RAMP_RATE_GRP0;
00152             cmd[1] = 0xc0 + 0x31;    // Ramp up/down ON, Ramp rate = 50
00153             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00154 
00155             cmd[0] = HOLD_CNTL_GRP0;
00156             cmd[1] = 0xc0 + (0x1 << 3) + 0x2;   // Hold ON/OFF ON, ON = 0.25s, OFF = 0.5s
00157             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00158 
00159             cmd[0] = GRAD_CNTL;
00160             cmd[1] = 0x3;           // Gradation ON, Continuous
00161             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00162 
00163             wait(15);               // 15s 待つ
00164 
00165             cmd[0] = GRAD_CNTL;
00166             cmd[1] = 0x0;           // Gradation OFF
00167             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00168 
00169             cmd[0] = GRAD_MODE_SEL0;
00170             cmd[1] = 0x0;           // LED0, 4, 5 = Normal
00171             i2c.write(PCA9955A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
00172 
00173             pc.printf("グラデーション Sample End\r\n");
00174             break;
00175         default:
00176             break;
00177         }    
00178     }
00179 }
00180