( 1/6 )( 2/6 )( 3/6 )( 4/6 )( 5/6 ) 〔マイコンのトップに戻る〕

これは、製品の概略ブロック図です、データシートのをちょい加工しています。
左は、PCA9547Dのピン配列構成図です。| 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.