Technical Information/GR-CITRUS

Edit  

GR-CITRUS でI2Cスレーブ機能を使う方法

2020/1/27

GR-CITRUS は公式ではI2C Slave 機能が使えないようです。(公式のスケッチリファレンスからも説明が省かれています)
ここでは非公式となりますが、GR-CITRUSでも簡単にI2C Slave 機能を使用する方法を説明します。

WS000620.jpg

 
Edit  

方針

  • Arduino言語を用いる
  • 開発環境はライブラリのソースコードを直接変更できるIDE for GR 1.09を使用
  • GR-SAKURA の公式スケッチリファレンスのサンプルプログラムを動作させる
 
Edit  

ライブラリ変更内容

  • 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が使用できるようになります。

 
Edit  

使用方法

  • 今回の方法でWire8を使用する場合、オリジナルのWireと同じピンを使用することになりますが、SDAとSCLが入れ替わります。ピン配置は以下のようになります。
    • Wire を使用する場合
      Wire:  19(SCL), 18(SDA) (※ソフトウェアI2C) 
    • Wire8 を使用する場合
      Wire8: 18(SCL), 19(SDA) (※ハードウェアI2C (RIIC0)) 
      つまり、同一のGR-CITRUSではWireとWire8を同時に使用することはできません。
 
Edit  

動作確認

  • 配線は以下のようになります。今回はGR-SAKURAのサンプルコードをそのまま使用します。マスター側のシトラスがWire、スレーブ側のシトラスがWire8 を使用することになります。
GR-CITRUS_I2C_SLAVE2.PNG
  • マスター側
    アドレス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
    }
 
Edit  

実行結果

  • マスターに接続されたシリアルモニタ(あるいはターミナルソフト)に、約0.5秒ごとに「hello」が表示されます。

    WS000621a.png


トップ   リロード   一覧 単語検索