Low-voltage 8-bit I2C-bus and SMBus low power I/O port with interrupt, weak pull-up and Agile I/O
Dependencies: mbed
PCAL9554B.cpp@0:16f7f665ba9d, 2015-02-04 (annotated)
- Committer:
- wataaki
- Date:
- Wed Feb 04 06:10:27 2015 +0000
- Revision:
- 0:16f7f665ba9d
Initial version
Who changed what in which revision?
User | Revision | Line number | New 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 | } |