Technical Information/GR-CITRUS
GR-CITRUS でI2Cスレーブ機能を使う方法
2020/1/27
GR-CITRUS は公式ではI2C Slave 機能が使えないようです。(公式のスケッチリファレンスからも説明が省かれています)
ここでは非公式となりますが、GR-CITRUSでも簡単にI2C Slave 機能を使用する方法を説明します。
方針
- Arduino言語を用いる
- 開発環境はライブラリのソースコードを直接変更できるIDE for GR 1.09を使用
- GR-SAKURA の公式スケッチリファレンスのサンプルプログラムを動作させる
ライブラリ変更内容
- IDE for GR のインストールフォルダ(ここではD:\UTY\で説明)の、下記のファイルを変更します。
D:\UTY\ide4gr-1.09\hardware\arduino\rx63\libraries\Wire\utility\twi_rx.cの74行目:
- 変更前
SCITABLE(0x10, &SYSTEM.MSTPCRB.LONG, 21, PIN_IO31, PIN_IO30), // RIIC0
- 変更後
SCITABLE(0x10, &SYSTEM.MSTPCRB.LONG, 21, PIN_IO19, PIN_IO18), // RIIC0
この変更で、GR-CITRUSでもWire8が使用できるようになります。
使用方法
- 今回の方法でWire8を使用する場合、オリジナルのWireと同じピンを使用することになりますが、SDAとSCLが入れ替わります。ピン配置は以下のようになります。
- Wire を使用する場合
Wire: 19(SCL), 18(SDA) (※ソフトウェアI2C)
- Wire8 を使用する場合
Wire8: 18(SCL), 19(SDA) (※ハードウェアI2C (RIIC0))
つまり、同一のGR-CITRUSではWireとWire8を同時に使用することはできません。
動作確認
- 配線は以下のようになります。今回はGR-SAKURAのサンプルコードをそのまま使用します。マスター側のシトラスがWire、スレーブ側のシトラスがWire8 を使用することになります。
- マスター側
アドレス0x40のスレーブデバイスから6バイトのデータを受信。
#include <Arduino.h>
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(0x40, 6); // request 6 bytes from slave device #2
while(Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}
- スレーブ側
アドレス0x40のスレーブとして動作し、マスターから送信要求を受けたときにhello を返す。
#include <Arduino.h>
#include <Wire.h>
void requestEvent();
void setup() {
Wire8.begin(0x40); // join i2c bus with address #0x40
Wire8.onRequest(requestEvent); // register event
}
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire8.write("hello "); // respond with message of 6 bytes
// as expected by master
}
実行結果
- マスターに接続されたシリアルモニタ(あるいはターミナルソフト)に、約0.5秒ごとに「hello」が表示されます。