GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
こんにちは。
I2Cを使ってSAKURAをマスタ、KURUMIスレーブにしようと思っています。
Arduino DUOで動作確認をしたサンプルを使用してみましたが、スレーブの反応がありません。
信号線のプルアップもしています。
どこかおかしいところはあるでしょうか?
よろしくお願いします。
マスタ側
/*GR-SAKURA Sketch Template Version: V1.06*/#include <rxduino.h>#include <Wire.h>void setup(){ Wire.begin(); // join i2c bus (address optional for master)}byte x = 0;void loop(){ Wire.beginTransmission(4); // transmit to device #4 Wire.write("x is "); // sends five bytes Wire.write(x); // sends one byte Wire.endTransmission(); // stop transmitting x++; delay(500);}
スレーブ側
/*GR-KURUMI Sketch Template Version: V1.01*/#include <RLduino78.h>#include <Wire.h>// function that executes whenever data is received from master// this function is registered as an event, see setup()void receiveEvent(int howMany){ while(1 < Wire.available()) // loop through all but the last { char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(x); // print the integer}void setup(){ delay(5000); Wire.begin(4); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output}void loop(){ delay(100);}
なんかKURUMIをバスに接続するとSCLが0.2Vぐらいまで下がってしまうのですが…
書き忘れましたが、問題切り分けのためにブレッドボードでテストをしています。
Kurauchiさん
まず、こちらでWireのスレーブ評価を行った時のハード構成と、プログラムを貼り付けたいと思います。
#include <RLduino78.h>#include <Wire.h>
void receiveEvent(int howMany);
void setup(){ Wire.begin(80); // join i2c bus with address #80 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output}
void loop(){ delay(100);}
// function that executes whenever data is received from master// this function is registered as an event, see setup()void receiveEvent(int howMany){ while(1 < Wire.available()) // loop through all but the last { char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(x); // print the integer}
void requestEvent();
void setup(){ Wire.begin(80); // join i2c bus with address #80 Wire.onRequest(requestEvent); // register event}
// function that executes whenever data is requested by master// this function is registered as an event, see setup()void requestEvent(){ Wire.write("hello "); // respond with message of 6 bytes // as expected by master}
貼り付けてから見比べてみましたが、基本的に一緒ですね。
念のためですが、KURUMI側はSCLがD7、SDAがD8につながってますよね。
0.2Vになるというのが解せないです。
Okamiyaさん、ありがとうございます。
配線は間違いないです。
次はKURUMIを交換して試してみます。
ですよね。。こちらでもSAKURAとKURUMIで試してみます。
Kurauchiさん、取り急ぎなのですが、アドレス#4でやると確かに再現します。アドレス#80にしたら、以下のように正常にスレーブ動作しました。
RL78のマニュアルには「NXP社発行のI2Cバスの仕様書を参照してください。」とあるのですが、ハード的に予約アドレスをはじいているようです。
x is 198
x is 199
x is 200
x is 201
x is 202
x is 203
x is 204
x is 205
x is 206
x is 207
x is 208
x is 209
x is 210
x is 211
x is 212
なるほど、そうだったのですか。
つまり、80〜239(0x10〜0xEF)の間でなければいけないということですね?
(Arduinoのサンプルにしてやられました…)
スッキリしました。ありがとうございました!
www.nxp.com/.../UM10204_JA.pdf
表 3. 予約済のアドレス
X = don’t care; 1 = HIGH; 0 = LOW.
スレーブアドレスR/W ビ ッ ト説明
0000 000 0 ゼネラルコールアドレス[1]
0000 000 1 スタートバイト[2]
0000 001 X CBUS アドレス[3]
0000 010 X 異なるバスフォーマット用に予約[4]
0000 011 X 将来の使用のため予約
0000 1XX X Hs-mod マスタコード
1111 1XX X デバイスID
1111 0XX X 10 ビットスレーブアドレス指定
かなりこれで悩まれたと思い恐縮ですが、なかなか深い落とし穴でした。
予約済みアドレス表を掲載いただいてありがとうございます。これはWikiネタですね。
いえいえ助かりました。
スケッチリファレンスにはスレーブの事が書いていないので未対応なのかと思ってました。
# 16〜239でした…