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

Dependencies:   mbed

Revision:
0:2ae25badaf6a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCA9956A.cpp	Wed Feb 04 06:09:44 2015 +0000
@@ -0,0 +1,97 @@
+#include "mbed.h"
+#include "PCA9956A.h"
+ 
+I2C i2c(p28,p27);        // sda, scl
+Serial pc(USBTX, USBRX); // tx, rx
+char cmd[32];
+int i, j;
+ 
+void set_ch(char sel)
+{    // PCA9541のサンプル
+        // MST_0側の自分にスレーブ側の制御権を得る場合
+    cmd[0] = 1;                     // PCA9541 コマンドコード Cont Reg
+    i2c.write( 0xe2, cmd, 1);       // Cont Regを指定
+    i2c.read( 0xe2, cmd, 1);        // Cont Regを読込み
+    wait(0.1);                      // 0.1s待つ
+    switch(cmd[0] & 0xf)
+    {
+    case 0:                         // bus off, has control
+    case 1:                         // bus off, no control
+    case 5:                         // bus on, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 4;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 2:                         // bus off, no control
+    case 3:                         // bus off, has control
+    case 6:                         // bus on, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 5;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 9:                         // bus on, no control
+    case 0xc:                       // bus on, no control
+    case 0xd:                       // bus off, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 0;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 0xa:                       // bus on, no control
+    case 0xe:                       // bus off, no control
+    case 0xf:                       // bus on, has control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 1;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    default:
+        break;
+    }
+
+    cmd[0] = sel;                   // PCA9546 Cont Reg sel channel enabled
+    i2c.write( 0xe8, cmd, 1);       // Send command string
+}
+
+int main ()
+{
+    i2c.frequency(100000);
+    pc.printf("PCA9956A Sample Program\r\n");
+     
+    set_ch(2);              // PCA9956Aはch1に接続
+
+  // PCA9956A
+  cmd[0] = MODE1;
+  cmd[1] = 0x0;           // SLEEP = 0
+  i2c.write(PCA9956A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
+
+  cmd[0] = LEDOUT0 + 0x80;   // LEDOUT0, Auto incriment
+  cmd[1] = 0xaa;          // LED3,2,1,0 10= PWM
+  cmd[2] = 0xaa;          // LED7,6,5,4 10= PWM
+  cmd[3] = 0xaa;          // LED11,10,9,8 10= PWM
+  cmd[4] = 0xaa;          // LED15,14,13,12 10= PWM
+  cmd[5] = 0xaa;          // LED19,18,17,16 10= PWM
+  cmd[6] = 0xaa;          // LED23,22,21,20 10= PWM
+  i2c.write(PCA9956A_ADDR, cmd, 7);   // cmd[0]Regにcmd[1-6]を書込み
+
+  cmd[0] = IREFALL;
+  cmd[1] = 0x80;        // Idrv = 40uA * 128 = 5.12mA
+  i2c.write(PCA9956A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
+
+  while(1)
+  {
+    if (i>23) i = 0;
+    cmd[0] = PWMALL;
+    cmd[1] = 0x0;           // PWM = 0%
+    i2c.write(PCA9956A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
+
+    cmd[0] = PWM0 + i;      // PWMx = PWM0 + i
+    cmd[1] = 0xf0;          // PWM = 99.6%
+    i2c.write(PCA9956A_ADDR, cmd, 2);   // cmd[0]Regにcmd[1]を書込み
+    wait(0.5);
+    i++;
+  }
+}
+