( 1/6 )( 2/6 )( 3/6 )( 4/6 )( 5/6 ) 〔マイコンのトップに戻る〕
これは、製品の概略ブロック図です、データシートのをちょい加工しています。
1 | 1 | 1 | 0 | A2 | A1 | A0 | RW | x | x | x | x | B3 | B2 | B1 | B0 |
/******************************************************************************* * ans = ChgI2CMultiplexer(adrs,ch) * * I2Cマルチプレクサー(PCA9547)のチャンネルを切り換える処理 * * この関数は"マルチマスター"に対応しています。 * * この関数を使う場合は、"skI2Clib"のライブラリが必要です。 * * adrs : PCA9547のデバイスアドレスを指定する(0x70-0x77) * * ch : 切り換えるI2Cバスのチャンネルを指定する(0ch-7ch) * * ans : 0= 正常 * * 1= 異常(相手からACKが返ってこない) * * -1= バスの衝突が発生して10回リトライしたがダメだった * *******************************************************************************/ int ChgI2CMultiplexer(unsigned char adrs,unsigned char ch) { unsigned char c ; int ans , i ; for (i=0 ; i < 10 ; i++) { ans = I2C_Start(adrs,RW_0); // スタートコンディションを発行する if (ans == 0) { c = ch & 0x07 ; // チャネル(bit0-2)を取り出す c = c | 0x08 ; // enableビットを設定する ans = I2C_Send(c) ; // Control register の送信 I2C_Stop() ; // ストップコンディションを発行する } if (ans != -1) break ; // バスの衝突が発生していなければ終了 __delay_ms(100) ; // 100ms後に再トライ } return ans ; } 例) A0/A1/A2が全てGND配線ならデバイスアドレスは”0x70”とし、7チャンネルに切り替える場合 #include "skI2Clib.h" void interrupt InterFunction( void ) { InterI2C() ; } main() { // I2C通信のマスターモードで初期化を行う、通信速度は400KHz InitI2C_Master(1) ; // I2Cマルチプレクサー(PCA9547)を7チャンネルに切り換える ChgI2CMultiplexer(0x70,7) ; }Arduino側プログラムについて
/******************************************************************************* * ans = ChgI2CMultiplexer(adrs,ch) * * I2Cマルチプレクサー(PCA9547)のチャンネルを切り換える処理 * * この関数は、Arduino標準のWireライブラリを使っています。 * * adrs : PCA9547のデバイスアドレスを指定する(0x70-0x77) * * ch : 切り換えるI2Cバスのチャンネルを指定する(0ch-7ch) * * ans : 0=正常終了、それ以外はI2C通信エラーです * * 1=送ろうとしたデータが送信バッファのサイズを超えた(32バイトMAX) * * 2=スレーブ・アドレスを送信し、NACKを受信した * * 3=データ・バイトを送信し、NACKを受信した * * 4=その他のエラー * *******************************************************************************/ int ChgI2CMultiplexer(unsigned char adrs,unsigned char ch) { unsigned char c ; int ans ; Wire.beginTransmission(adrs) ; // 通信の開始 c = ch & 0x07 ; // チャネル(bit0-2)を取り出す c = c | 0x08 ; // enableビットを設定する Wire.write(c) ; // Control register の送信 ans = Wire.endTransmission() ; // データの送信と通信の終了 return ans ; } 例) A0/A1/A2が全てVDD配線ならデバイスアドレスは”0x77”とし、1チャンネルに切り替える場合 #include <Wire.h> void setup() { // I2Cの初期化マスターとする Wire.begin() ; // I2Cマルチプレクサー(PCA9547)を1チャンネルに切り換える ChgI2CMultiplexer(0x77,1) ; } void loop() { }
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.