I2C-bus master selector with interrupt logic and reset

Dependencies:   mbed

Committer:
wataaki
Date:
Wed Feb 04 06:01:04 2015 +0000
Revision:
0:62f897b8acfa
initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wataaki 0:62f897b8acfa 1 #include "mbed.h"
wataaki 0:62f897b8acfa 2
wataaki 0:62f897b8acfa 3 I2C i2c(p28,p27); // sda, scl
wataaki 0:62f897b8acfa 4 Serial pc(USBTX, USBRX); // tx, rx
wataaki 0:62f897b8acfa 5 char cmd[32];
wataaki 0:62f897b8acfa 6 int i, j, k;
wataaki 0:62f897b8acfa 7 int sw;
wataaki 0:62f897b8acfa 8
wataaki 0:62f897b8acfa 9 void set_ch(char sel)
wataaki 0:62f897b8acfa 10 { // PCA9541のサンプル
wataaki 0:62f897b8acfa 11 // MST_0側の自分にスレーブ側の制御権を得る場合
wataaki 0:62f897b8acfa 12 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:62f897b8acfa 13 i2c.write( 0xe2, cmd, 1); // Cont Regを指定
wataaki 0:62f897b8acfa 14 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:62f897b8acfa 15 wait(0.1); // 0.1s待つ
wataaki 0:62f897b8acfa 16 switch(cmd[0] & 0xf)
wataaki 0:62f897b8acfa 17 {
wataaki 0:62f897b8acfa 18 case 0: // bus off, has control
wataaki 0:62f897b8acfa 19 case 1: // bus off, no control
wataaki 0:62f897b8acfa 20 case 5: // bus on, no control
wataaki 0:62f897b8acfa 21 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:62f897b8acfa 22 cmd[1] = 4; // bus on, has control
wataaki 0:62f897b8acfa 23 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:62f897b8acfa 24 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:62f897b8acfa 25 break;
wataaki 0:62f897b8acfa 26 case 2: // bus off, no control
wataaki 0:62f897b8acfa 27 case 3: // bus off, has control
wataaki 0:62f897b8acfa 28 case 6: // bus on, no control
wataaki 0:62f897b8acfa 29 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:62f897b8acfa 30 cmd[1] = 5; // bus on, has control
wataaki 0:62f897b8acfa 31 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:62f897b8acfa 32 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:62f897b8acfa 33 break;
wataaki 0:62f897b8acfa 34 case 9: // bus on, no control
wataaki 0:62f897b8acfa 35 case 0xc: // bus on, no control
wataaki 0:62f897b8acfa 36 case 0xd: // bus off, no control
wataaki 0:62f897b8acfa 37 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:62f897b8acfa 38 cmd[1] = 0; // bus on, has control
wataaki 0:62f897b8acfa 39 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:62f897b8acfa 40 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:62f897b8acfa 41 break;
wataaki 0:62f897b8acfa 42 case 0xa: // bus on, no control
wataaki 0:62f897b8acfa 43 case 0xe: // bus off, no control
wataaki 0:62f897b8acfa 44 case 0xf: // bus on, has control
wataaki 0:62f897b8acfa 45 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg
wataaki 0:62f897b8acfa 46 cmd[1] = 1; // bus on, has control
wataaki 0:62f897b8acfa 47 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み
wataaki 0:62f897b8acfa 48 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み
wataaki 0:62f897b8acfa 49 break;
wataaki 0:62f897b8acfa 50 default:
wataaki 0:62f897b8acfa 51 break;
wataaki 0:62f897b8acfa 52 }
wataaki 0:62f897b8acfa 53
wataaki 0:62f897b8acfa 54 cmd[0] = sel; // PCA9546 Cont Reg sel channel enabled
wataaki 0:62f897b8acfa 55 i2c.write( 0xe8, cmd, 1); // Send command string
wataaki 0:62f897b8acfa 56 }
wataaki 0:62f897b8acfa 57
wataaki 0:62f897b8acfa 58 int main ()
wataaki 0:62f897b8acfa 59 {
wataaki 0:62f897b8acfa 60 i2c.frequency(100000);
wataaki 0:62f897b8acfa 61 pc.printf("PCA9541A Sample Program\r\n");
wataaki 0:62f897b8acfa 62
wataaki 0:62f897b8acfa 63 set_ch(1); // PCA9541Aによりマスターを選択後
wataaki 0:62f897b8acfa 64 // PCA9546によりchnに接続
wataaki 0:62f897b8acfa 65
wataaki 0:62f897b8acfa 66 // PCA9541A
wataaki 0:62f897b8acfa 67 while(1);
wataaki 0:62f897b8acfa 68 }