Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Revision 0:16f7f665ba9d, committed 2015-02-04
- Comitter:
- wataaki
- Date:
- Wed Feb 04 06:10:27 2015 +0000
- Commit message:
- Initial version
Changed in this revision
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