CQ_I2C_book / Mbed 2 deprecated PCAL9554B

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
wataaki
Date:
Wed Feb 04 06:10:27 2015 +0000
Commit message:
Initial version

Changed in this revision

PCAL9554B.cpp Show annotated file Show diff for this revision Revisions of this file
PCAL9554B.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 16f7f665ba9d PCAL9554B.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCAL9554B.cpp	Wed Feb 04 06:10:27 2015 +0000
@@ -0,0 +1,157 @@
+#include "mbed.h"
+#include "PCAL9554B.h"
+ 
+I2C i2c(p28,p27);        // sda, scl
+Serial pc(USBTX, USBRX); // tx, rx
+char cmd[32];
+int i, j, k;
+int sw;
+
+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("PCAL9554B Sample Program\r\n");
+    set_ch(2);              // PCAL9554Bはch1に接続
+
+  // PCAL9554B
+    while(1)
+    {
+        pc.printf("入力(PU) … 1, 出力 … 2, 出力-入力反転 … 3 ? \r\n");
+        pc.scanf("%d", &sw);
+        pc.printf("%d\r\n", sw);
+        switch (sw)
+        {
+        case 1:
+            pc.printf("入力(PU) Sample Start\r\n");
+
+            cmd[0] = PUPD_enable;
+            cmd[1] = 0xff;           // all PUPD enable
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+            cmd[0] = PUPD_selection;
+            cmd[1] = 0xff;           // all PU
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+            for(i=0; i<20; i++)
+            {
+                cmd[0] = Input_port;
+                i2c.write(PCAL9554B_ADDR, cmd, 1);
+                i2c.read(PCAL9554B_ADDR, cmd, 1);    // Inport Regを読込み
+                pc.printf("Input P0=%02x\r\n",cmd[0]); // InPort Regを表示
+                wait(0.5);
+            }
+            pc.printf("入力(PU) Sample End\r\n");
+            break;
+            
+        case 2:
+            pc.printf("出力 Sample Start\r\n");
+
+            cmd[0] = Configuration;
+            cmd[1] = 0x0;           // all output
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+            for(i=0; i<256; i++)
+            {
+                cmd[0] = Output_port;
+                cmd[1] = i;           // P0 = i
+                i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+                cmd[0] = Input_port;           // input
+                i2c.write(PCAL9554B_ADDR, cmd, 1, true);   // cmd[0]Regにcmd[1]を書込み
+                i2c.read(PCAL9554B_ADDR, cmd, 1);    // Input Regを読込み
+                pc.printf("Output P=%02x Input P=%02x\r\n",cmd[1],cmd[0]); // Cont Regを表示
+                wait(0.1);
+            }
+            pc.printf("出力 Sample End\r\n");
+
+            cmd[0] = Configuration;
+            cmd[1] = 0xff;           // all input
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+            break;
+            
+        case 3:
+            pc.printf("出力-入力反転 Sample Start\r\n");
+
+            cmd[0] = Configuration;
+            cmd[1] = 0x0;           // all output
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+            cmd[0] = Polarity_Inversion;
+            cmd[1] = 0xff;           // all inversion
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+            for(i=0; i<256; i++)
+            {
+                cmd[0] = Output_port;
+                cmd[1] = i;           // P0 = i
+                i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+                cmd[0] = Input_port;           // input
+                i2c.write(PCAL9554B_ADDR, cmd, 1, true);   // cmd[0]Regにcmd[1]を書込み
+                i2c.read(PCAL9554B_ADDR, cmd, 1);    // Input Regを読込み
+                pc.printf("Output P=%02x Input P=%02x\r\n",cmd[1],cmd[0]); // Cont Regを表示
+                wait(0.1);
+            }
+            pc.printf("出力-入力反転 Sample End\r\n");
+
+            cmd[0] = Configuration;
+            cmd[1] = 0xff;           // all input
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+            cmd[0] = Polarity_Inversion;
+            cmd[1] = 0x00;           // all no inversion
+            i2c.write(PCAL9554B_ADDR, cmd, 2);
+
+            break;
+        default:
+            break;
+        }    
+    }
+}   
diff -r 000000000000 -r 16f7f665ba9d PCAL9554B.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCAL9554B.h	Wed Feb 04 06:10:27 2015 +0000
@@ -0,0 +1,24 @@
+// for PCAL9554B
+//#define PCAL9554B_ADDR 0x40
+//#define PCAL9554B_ADDR 0x42
+//#define PCAL9554B_ADDR 0x44
+//#define PCAL9554B_ADDR 0x46
+#define PCAL9554B_ADDR 0x48
+//#define PCAL9554B_ADDR 0x4a
+//#define PCAL9554B_ADDR 0x4c
+//#define PCAL9554B_ADDR 0x4e
+
+#define Input_port                0x00
+#define Output_port               0x01
+#define Polarity_Inversion        0x02
+#define Configuration             0x03
+#define Output_Drive_Strength0    0x40
+#define Output_Drive_Strength1    0x41
+#define Input_latch               0x42
+#define PUPD_enable               0x43
+#define PUPD_selection            0x44
+#define Interrupt_mask            0x45
+#define Interrupt_status          0x46
+#define Output_port_configuration 0x4f
+
+
diff -r 000000000000 -r 16f7f665ba9d mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Feb 04 06:10:27 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1
\ No newline at end of file