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
- Committer:
- wataaki
- Date:
- 2015-02-04
- Revision:
- 0:16f7f665ba9d
File content as of revision 0:16f7f665ba9d:
#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; } } }