Low-voltage 8-bit I2C-bus and SMBus low power I/O port with interrupt, weak pull-up and Agile I/O

Dependencies:   mbed

Committer:
wataaki
Date:
Wed Feb 04 06:10:27 2015 +0000
Revision:
0:16f7f665ba9d
Initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wataaki 0:16f7f665ba9d 1 #include "mbed.h"
wataaki 0:16f7f665ba9d 2 #include "PCAL9554B.h"
wataaki 0:16f7f665ba9d 3
wataaki 0:16f7f665ba9d 4 I2C i2c(p28,p27); // sda, scl
wataaki 0:16f7f665ba9d 5 Serial pc(USBTX, USBRX); // tx, rx
wataaki 0:16f7f665ba9d 6 char cmd[32];
wataaki 0:16f7f665ba9d 7 int i, j, k;
wataaki 0:16f7f665ba9d 8 int sw;
wataaki 0:16f7f665ba9d 9
wataaki 0:16f7f665ba9d 10 void set_ch(char sel)
wataaki 0:16f7f665ba9d 11 { // PCA9541のサンプル
wataaki 0:16f7f665ba9d 12 // MST_0側の自分にスレーブ側の制御権を得る場合
wataaki 0:16f7f665ba9d 13 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:16f7f665ba9d 14 i2c.write( 0xe2, cmd, 1); // Cont Regを指定
wataaki 0:16f7f665ba9d 15 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:16f7f665ba9d 16 wait(0.1); // 0.1s待つ
wataaki 0:16f7f665ba9d 17 switch(cmd[0] & 0xf)
wataaki 0:16f7f665ba9d 18 {
wataaki 0:16f7f665ba9d 19 case 0: // bus off, has control
wataaki 0:16f7f665ba9d 20 case 1: // bus off, no control
wataaki 0:16f7f665ba9d 21 case 5: // bus on, no control
wataaki 0:16f7f665ba9d 22 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:16f7f665ba9d 23 cmd[1] = 4; // bus on, has control
wataaki 0:16f7f665ba9d 24 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 25 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:16f7f665ba9d 26 break;
wataaki 0:16f7f665ba9d 27 case 2: // bus off, no control
wataaki 0:16f7f665ba9d 28 case 3: // bus off, has control
wataaki 0:16f7f665ba9d 29 case 6: // bus on, no control
wataaki 0:16f7f665ba9d 30 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:16f7f665ba9d 31 cmd[1] = 5; // bus on, has control
wataaki 0:16f7f665ba9d 32 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 33 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:16f7f665ba9d 34 break;
wataaki 0:16f7f665ba9d 35 case 9: // bus on, no control
wataaki 0:16f7f665ba9d 36 case 0xc: // bus on, no control
wataaki 0:16f7f665ba9d 37 case 0xd: // bus off, no control
wataaki 0:16f7f665ba9d 38 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:16f7f665ba9d 39 cmd[1] = 0; // bus on, has control
wataaki 0:16f7f665ba9d 40 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 41 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:16f7f665ba9d 42 break;
wataaki 0:16f7f665ba9d 43 case 0xa: // bus on, no control
wataaki 0:16f7f665ba9d 44 case 0xe: // bus off, no control
wataaki 0:16f7f665ba9d 45 case 0xf: // bus on, has control
wataaki 0:16f7f665ba9d 46 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:16f7f665ba9d 47 cmd[1] = 1; // bus on, has control
wataaki 0:16f7f665ba9d 48 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 49 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:16f7f665ba9d 50 break;
wataaki 0:16f7f665ba9d 51 default:
wataaki 0:16f7f665ba9d 52 break;
wataaki 0:16f7f665ba9d 53 }
wataaki 0:16f7f665ba9d 54
wataaki 0:16f7f665ba9d 55 cmd[0] = sel; // PCA9546 Cont Reg sel channel enabled
wataaki 0:16f7f665ba9d 56 i2c.write( 0xe8, cmd, 1); // Send command string
wataaki 0:16f7f665ba9d 57 }
wataaki 0:16f7f665ba9d 58
wataaki 0:16f7f665ba9d 59 int main ()
wataaki 0:16f7f665ba9d 60 {
wataaki 0:16f7f665ba9d 61 i2c.frequency(100000);
wataaki 0:16f7f665ba9d 62 pc.printf("PCAL9554B Sample Program\r\n");
wataaki 0:16f7f665ba9d 63 set_ch(2); // PCAL9554Bはch1に接続
wataaki 0:16f7f665ba9d 64
wataaki 0:16f7f665ba9d 65 // PCAL9554B
wataaki 0:16f7f665ba9d 66 while(1)
wataaki 0:16f7f665ba9d 67 {
wataaki 0:16f7f665ba9d 68 pc.printf("入力(PU) … 1, 出力 … 2, 出力-入力反転 … 3 ? \r\n");
wataaki 0:16f7f665ba9d 69 pc.scanf("%d", &sw);
wataaki 0:16f7f665ba9d 70 pc.printf("%d\r\n", sw);
wataaki 0:16f7f665ba9d 71 switch (sw)
wataaki 0:16f7f665ba9d 72 {
wataaki 0:16f7f665ba9d 73 case 1:
wataaki 0:16f7f665ba9d 74 pc.printf("入力(PU) Sample Start\r\n");
wataaki 0:16f7f665ba9d 75
wataaki 0:16f7f665ba9d 76 cmd[0] = PUPD_enable;
wataaki 0:16f7f665ba9d 77 cmd[1] = 0xff; // all PUPD enable
wataaki 0:16f7f665ba9d 78 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 79 cmd[0] = PUPD_selection;
wataaki 0:16f7f665ba9d 80 cmd[1] = 0xff; // all PU
wataaki 0:16f7f665ba9d 81 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 82
wataaki 0:16f7f665ba9d 83 for(i=0; i<20; i++)
wataaki 0:16f7f665ba9d 84 {
wataaki 0:16f7f665ba9d 85 cmd[0] = Input_port;
wataaki 0:16f7f665ba9d 86 i2c.write(PCAL9554B_ADDR, cmd, 1);
wataaki 0:16f7f665ba9d 87 i2c.read(PCAL9554B_ADDR, cmd, 1); // Inport Regを読込み
wataaki 0:16f7f665ba9d 88 pc.printf("Input P0=%02x\r\n",cmd[0]); // InPort Regを表示
wataaki 0:16f7f665ba9d 89 wait(0.5);
wataaki 0:16f7f665ba9d 90 }
wataaki 0:16f7f665ba9d 91 pc.printf("入力(PU) Sample End\r\n");
wataaki 0:16f7f665ba9d 92 break;
wataaki 0:16f7f665ba9d 93
wataaki 0:16f7f665ba9d 94 case 2:
wataaki 0:16f7f665ba9d 95 pc.printf("出力 Sample Start\r\n");
wataaki 0:16f7f665ba9d 96
wataaki 0:16f7f665ba9d 97 cmd[0] = Configuration;
wataaki 0:16f7f665ba9d 98 cmd[1] = 0x0; // all output
wataaki 0:16f7f665ba9d 99 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 100 for(i=0; i<256; i++)
wataaki 0:16f7f665ba9d 101 {
wataaki 0:16f7f665ba9d 102 cmd[0] = Output_port;
wataaki 0:16f7f665ba9d 103 cmd[1] = i; // P0 = i
wataaki 0:16f7f665ba9d 104 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 105
wataaki 0:16f7f665ba9d 106 cmd[0] = Input_port; // input
wataaki 0:16f7f665ba9d 107 i2c.write(PCAL9554B_ADDR, cmd, 1, true); // cmd[0]Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 108 i2c.read(PCAL9554B_ADDR, cmd, 1); // Input Regを読込み
wataaki 0:16f7f665ba9d 109 pc.printf("Output P=%02x Input P=%02x\r\n",cmd[1],cmd[0]); // Cont Regを表示
wataaki 0:16f7f665ba9d 110 wait(0.1);
wataaki 0:16f7f665ba9d 111 }
wataaki 0:16f7f665ba9d 112 pc.printf("出力 Sample End\r\n");
wataaki 0:16f7f665ba9d 113
wataaki 0:16f7f665ba9d 114 cmd[0] = Configuration;
wataaki 0:16f7f665ba9d 115 cmd[1] = 0xff; // all input
wataaki 0:16f7f665ba9d 116 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 117
wataaki 0:16f7f665ba9d 118 break;
wataaki 0:16f7f665ba9d 119
wataaki 0:16f7f665ba9d 120 case 3:
wataaki 0:16f7f665ba9d 121 pc.printf("出力-入力反転 Sample Start\r\n");
wataaki 0:16f7f665ba9d 122
wataaki 0:16f7f665ba9d 123 cmd[0] = Configuration;
wataaki 0:16f7f665ba9d 124 cmd[1] = 0x0; // all output
wataaki 0:16f7f665ba9d 125 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 126
wataaki 0:16f7f665ba9d 127 cmd[0] = Polarity_Inversion;
wataaki 0:16f7f665ba9d 128 cmd[1] = 0xff; // all inversion
wataaki 0:16f7f665ba9d 129 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 130
wataaki 0:16f7f665ba9d 131 for(i=0; i<256; i++)
wataaki 0:16f7f665ba9d 132 {
wataaki 0:16f7f665ba9d 133 cmd[0] = Output_port;
wataaki 0:16f7f665ba9d 134 cmd[1] = i; // P0 = i
wataaki 0:16f7f665ba9d 135 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 136
wataaki 0:16f7f665ba9d 137 cmd[0] = Input_port; // input
wataaki 0:16f7f665ba9d 138 i2c.write(PCAL9554B_ADDR, cmd, 1, true); // cmd[0]Regにcmd[1]を書込み
wataaki 0:16f7f665ba9d 139 i2c.read(PCAL9554B_ADDR, cmd, 1); // Input Regを読込み
wataaki 0:16f7f665ba9d 140 pc.printf("Output P=%02x Input P=%02x\r\n",cmd[1],cmd[0]); // Cont Regを表示
wataaki 0:16f7f665ba9d 141 wait(0.1);
wataaki 0:16f7f665ba9d 142 }
wataaki 0:16f7f665ba9d 143 pc.printf("出力-入力反転 Sample End\r\n");
wataaki 0:16f7f665ba9d 144
wataaki 0:16f7f665ba9d 145 cmd[0] = Configuration;
wataaki 0:16f7f665ba9d 146 cmd[1] = 0xff; // all input
wataaki 0:16f7f665ba9d 147 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 148 cmd[0] = Polarity_Inversion;
wataaki 0:16f7f665ba9d 149 cmd[1] = 0x00; // all no inversion
wataaki 0:16f7f665ba9d 150 i2c.write(PCAL9554B_ADDR, cmd, 2);
wataaki 0:16f7f665ba9d 151
wataaki 0:16f7f665ba9d 152 break;
wataaki 0:16f7f665ba9d 153 default:
wataaki 0:16f7f665ba9d 154 break;
wataaki 0:16f7f665ba9d 155 }
wataaki 0:16f7f665ba9d 156 }
wataaki 0:16f7f665ba9d 157 }