RXI2CLIB 1.0
easy RX63N I2C LIBrary by I.N. 2018/09/05


更新履歴
2018/09/05 e2studioで使う場合の説明を追加
2015/11/12 動作確認デバイスの追加
2015/03/11 動作確認デバイスの追加
2015/03/03 rxi2clcd.hの追加
2014/12/10 ver.1.0 初版


1.はじめに

 マイコンボード GR-SAKURA + 開発環境(RXduinoまたはWebコンパイラまたはe2studio) で
I2C通信プログラムを作成するための関数ライブラリです.
 RX63NのSCIが持っている簡易I2C機能を使用したハードウェアI2Cです.

 開発環境はrxduino-free-v120csとWebコンパイラ(v1.08)とe2studio(v.5.4.0)で確認しました.

 ※SCIを簡易I2Cモードで利用する場合,そのSCIのチャンネルはシリアル通信ポートとしては
使用できなくなります.シリアル通信は空いているSCIのチャンネルで行うことになります.
 ※RXRSLIBとの併用も可能です.


2.特長

 GR-SAKURAボードで簡易I2Cポートを最大8チャンネル(SCI 0,1,2,3,5,6,8,12)まで使えます.
正常に動作するかどうかは別として速度設定は,5859〜1.5M[Hz](BRR値=255〜0)まで可能です.
チャンネル0と2では使用するI/Oポートを2箇所から選択できます.


3.動作確認デバイス

 GR-SAKURAに接続して動作確認したデバイスは,
 □ LCDモジュール(AQM0802A-RN-GBW):スレーブアドレス=0x3e,3.3V,プルアップ抵抗10kΩ
 □ LCDモジュール(SB1602BW):スレーブアドレス=0x3e,3.3V,プルアップ抵抗8.2kΩ
 □ 9軸センサ(MPU-9150, MPU-9250):スレーブアドレス=0x68および0x0c,3.3V,プルアップ抵抗4.7kΩ
 □ 温度・湿度センサモジュール(SHT-21, SHT-25):スレーブアドレス=0x40,3.3V,プルアップ抵抗8.2kΩ
 □ 気圧センサモジュール(LPS331AP):スレーブアドレス=0x5c,3.3V,プルアップ抵抗8.2kΩ
 です.(いずれのデバイスも1つのポートに1個だけ接続する条件)

 ※LCDモジュールの制御のために,本ページ末に補助ライブラリ rxi2clcd.h があります.


4.使用方法とサンプル

4.1 使用方法
4.1.1 RXduinoまたはWebコンパイラの場合
 開発環境の準備が済んだら,割り込みベクタ記述ファイル intvect.c を開き,
以下のように214〜252番のうち,使用するSCIチャンネルに対応する割り込み関数の
名前を書き換えてください.また,割り込み関数のプロトタイプ宣言を追記して下さい.
これらを忘れるとコンパイルでエラーが出なくても,データの送受信はできません.
ただし,使わないSCIチャンネルについては,書き換えを省略して構いません.

 まず,RX63N用の214〜252番のうち,使用する割り込み関数の名前を書き換えます.
(intvect.cの1113行〜1151行あたり)

使用するチャンネル番号をnとすると,
Excep_SCIn_RXIn,
Excep_SCIn_TXIn,
Excep_SCIn_TEIn,

の箇所を
RXI2C_SCIn_RXIn,
RXI2C_SCIn_TXIn,
RXI2C_SCIn_TEIn,

と書き換えます.

下記の例は,SCIの全チャンネルを簡易I2C用に書き換えた例です.
(この例だとシリアル通信ができなくなります.あくまで例です.)
        /*
        Excep_SCI0_RXI0,     
        Excep_SCI0_TXI0,     
        Excep_SCI0_TEI0,     
        Excep_SCI1_RXI1,     
        Excep_SCI1_TXI1,     
        Excep_SCI1_TEI1,     
        Excep_SCI2_RXI2,     
        Excep_SCI2_TXI2,     
        Excep_SCI2_TEI2,     
        Excep_SCI3_RXI3,     
        Excep_SCI3_TXI3,     
        Excep_SCI3_TEI3,     
        */
        RXI2C_SCI0_RXI0, //--- for RXI2CLIB
        RXI2C_SCI0_TXI0,     
        RXI2C_SCI0_TEI0,     
        RXI2C_SCI1_RXI1, //--- for RXI2CLIB
        RXI2C_SCI1_TXI1,     
        RXI2C_SCI1_TEI1,     
        RXI2C_SCI2_RXI2, //--- for RXI2CLIB
        RXI2C_SCI2_TXI2,     
        RXI2C_SCI2_TEI2,     
        RXI2C_SCI3_RXI3, //--- for RXI2CLIB
        RXI2C_SCI3_TXI3,     
        RXI2C_SCI3_TEI3,     

        Excep_SCI4_RXI4,     
        Excep_SCI4_TXI4,     
        Excep_SCI4_TEI4,     

        /*      
        Excep_SCI5_RXI5,     
        Excep_SCI5_TXI5,     
        Excep_SCI5_TEI5,     
        Excep_SCI6_RXI6,     
        Excep_SCI6_TXI6,     
        Excep_SCI6_TEI6,     
        */
        RXI2C_SCI5_RXI5, //--- for RXI2CLIB
        RXI2C_SCI5_TXI5,     
        RXI2C_SCI5_TEI5,     
        RXI2C_SCI6_RXI6, //--- for RXI2CLIB
        RXI2C_SCI6_TXI6,     
        RXI2C_SCI6_TEI6,     

        Excep_SCI7_RXI7,     
        Excep_SCI7_TXI7,     
        Excep_SCI7_TEI7,     

        /*
        Excep_SCI8_RXI8,     
        Excep_SCI8_TXI8,     
        Excep_SCI8_TEI8,     
        */
        RXI2C_SCI8_RXI8, //--- for RXI2CLIB
        RXI2C_SCI8_TXI8,     
        RXI2C_SCI8_TEI8,     

        Excep_SCI9_RXI9,     
        Excep_SCI9_TXI9,     
        Excep_SCI9_TEI9,     
        Excep_SCI10_RXI10,   
        Excep_SCI10_TXI10,   
        Excep_SCI10_TEI10,   
        Excep_SCI11_RXI11,   
        Excep_SCI11_TXI11,   
        Excep_SCI11_TEI11,
        
        /*
        Excep_SCI12_RXI12,   
        Excep_SCI12_TXI12,   
        Excep_SCI12_TEI12,   
        */
        RXI2C_SCI12_RXI12,       //--- for RXI2CLIB
        RXI2C_SCI12_TXI12,     
        RXI2C_SCI12_TEI12,     

 また,同じ intvect.c において,#include "intvect.h"の下(28行)あたりに次のプロトタイプ宣言を追加します.
void __attribute__ ((interrupt)) RXI2C_SCI0_RXI0(void);
void __attribute__ ((interrupt)) RXI2C_SCI0_TXI0(void);
void __attribute__ ((interrupt)) RXI2C_SCI0_TEI0(void);

void __attribute__ ((interrupt)) RXI2C_SCI1_RXI1(void);
void __attribute__ ((interrupt)) RXI2C_SCI1_TXI1(void);
void __attribute__ ((interrupt)) RXI2C_SCI1_TEI1(void);

void __attribute__ ((interrupt)) RXI2C_SCI2_RXI2(void);
void __attribute__ ((interrupt)) RXI2C_SCI2_TXI2(void);
void __attribute__ ((interrupt)) RXI2C_SCI2_TEI2(void);

void __attribute__ ((interrupt)) RXI2C_SCI3_RXI3(void);
void __attribute__ ((interrupt)) RXI2C_SCI3_TXI3(void);
void __attribute__ ((interrupt)) RXI2C_SCI3_TEI3(void);

void __attribute__ ((interrupt)) RXI2C_SCI5_RXI5(void);
void __attribute__ ((interrupt)) RXI2C_SCI5_TXI5(void);
void __attribute__ ((interrupt)) RXI2C_SCI5_TEI5(void);

void __attribute__ ((interrupt)) RXI2C_SCI6_RXI6(void);
void __attribute__ ((interrupt)) RXI2C_SCI6_TXI6(void);
void __attribute__ ((interrupt)) RXI2C_SCI6_TEI6(void);

void __attribute__ ((interrupt)) RXI2C_SCI8_RXI8(void);
void __attribute__ ((interrupt)) RXI2C_SCI8_TXI8(void);
void __attribute__ ((interrupt)) RXI2C_SCI8_TEI8(void);

void __attribute__ ((interrupt)) RXI2C_SCI12_RXI12(void);
void __attribute__ ((interrupt)) RXI2C_SCI12_TXI12(void);
void __attribute__ ((interrupt)) RXI2C_SCI12_TEI12(void);

 あとは自分のソースファイルで次のようにインクルードするだけです.
(rxi2clib.h は適切なディレクトリに事前に置いて,インクルードできるようにしてください)
#include "rxi2clib.h"

4.1.2 e2studioの場合
 開発環境の準備とGR-SAKURA用プロジェクトのインポートが済んだら,
割り込みベクタ記述ファイル vector_table.c を開き,以下のように割り込みベクタの
関数名を書き換えてください.
また,RXI2CLIBが使用する割り込み関数のプロトタイプ宣言を追記して下さい.
これらを忘れるとコンパイルでエラーが出なくても,データの送受信はできません.
ただし,使わないSCIチャンネルについては,書き換えを省略して構いません.

 まず,チャンネルごとに割り込みベクタ(SCIn_RXIn,SCIn_TXIn,SCIn_TEIn)を書き換えます.
(n には使用するSCIのチャンネル番号が入ります.[0〜3, 5, 6, 8, 12]のいずれか.)
(SCI0はvector_table.cの564行あたり)
下記はSCI0(n=0)の例です.複数のチャンネルを使用する場合は,該当する箇所を
すべて修正します.
//;0x0358 SCI0_RXI0
    //(fp)INT_Excep_SCI0_RXI0,
    (fp)RXI2C_SCI0_RXI0,
//;0x035C SCI0_TXI0
    //(fp)INT_Excep_SCI0_TXI0,
    (fp)RXI2C_SCI0_TXI0,
//;0x0360 SCI0_TEI0
    //(fp)INT_Excep_SCI0_TEI0,
    (fp)RXI2C_SCI0_TEI0, 

 次に,同じ vector_table.c において,#include "interrupt_handlers.h"の下(21行)あたりに次のプロトタイプ宣言を追加します.
void __attribute__ ((interrupt)) RXI2C_SCI0_RXI0(void);
void __attribute__ ((interrupt)) RXI2C_SCI0_TXI0(void);
void __attribute__ ((interrupt)) RXI2C_SCI0_TEI0(void);

void __attribute__ ((interrupt)) RXI2C_SCI1_RXI1(void);
void __attribute__ ((interrupt)) RXI2C_SCI1_TXI1(void);
void __attribute__ ((interrupt)) RXI2C_SCI1_TEI1(void);

void __attribute__ ((interrupt)) RXI2C_SCI2_RXI2(void);
void __attribute__ ((interrupt)) RXI2C_SCI2_TXI2(void);
void __attribute__ ((interrupt)) RXI2C_SCI2_TEI2(void);

void __attribute__ ((interrupt)) RXI2C_SCI3_RXI3(void);
void __attribute__ ((interrupt)) RXI2C_SCI3_TXI3(void);
void __attribute__ ((interrupt)) RXI2C_SCI3_TEI3(void);

void __attribute__ ((interrupt)) RXI2C_SCI5_RXI5(void);
void __attribute__ ((interrupt)) RXI2C_SCI5_TXI5(void);
void __attribute__ ((interrupt)) RXI2C_SCI5_TEI5(void);

void __attribute__ ((interrupt)) RXI2C_SCI6_RXI6(void);
void __attribute__ ((interrupt)) RXI2C_SCI6_TXI6(void);
void __attribute__ ((interrupt)) RXI2C_SCI6_TEI6(void);

void __attribute__ ((interrupt)) RXI2C_SCI8_RXI8(void);
void __attribute__ ((interrupt)) RXI2C_SCI8_TXI8(void);
void __attribute__ ((interrupt)) RXI2C_SCI8_TEI8(void);

void __attribute__ ((interrupt)) RXI2C_SCI12_RXI12(void);
void __attribute__ ((interrupt)) RXI2C_SCI12_TXI12(void);
void __attribute__ ((interrupt)) RXI2C_SCI12_TEI12(void);

 あとは自分のソースファイルで次のようにインクルードするだけです.
(rxi2clib.h は適切なディレクトリに事前に置いて,インクルードできるようにしてください)
#include "rxi2clib.h"

4.2 サンプルプログラム(1)
 チャンネルはSCI12を使用します.(ni2cの値)
 SCI12が使用するI/Oピンは,IO46(PIN_PE1)=SCL,IO45(PIN_PE2)=SDA です.
 速度設定は 375000 Hzです.(BRR値は3)
 プログラムが開始して,SCI12のオープンに成功すると,1個目のLEDが点灯します.
 青ボタンが押されると,デバイス(0x68)にAG_WHO_AM_I(0x75)を送った後,
 同じデバイスから1バイト読み込みます.読み込んだ値が0x68であれば,2個目のLED
 が点灯します.(9軸センサMPU-9150が接続されていたら2個目は点灯します)
//Sample program of RXI2CLIB
#include <rxduino.h>
// e2studioの場合は #include <Arduino.h>

#include "rxi2clib.h"

int ni2c=12;

#define AG_I2C_ADR      0x68
#define AG_WHO_AM_I     0x75

void setup()
{
    pinMode(PIN_SW,INPUT);       //青ボタン使用
    pinMode(PIN_LED0,OUTPUT);    //LED0使用
    pinMode(PIN_LED1,OUTPUT);    //LED1使用

    int r= RXI2C_Open(ni2c, 3);  //簡易I2Cオープン
    if(!r) digitalWrite(PIN_LED0,1);
}

void loop()
{
    if(!digitalRead(PIN_SW)){    //青ボタン処理
        unsigned char c;
        RXI2C_Send1(ni2c, AG_I2C_ADR, AG_WHO_AM_I);
        RXI2C_Recv1(ni2c, AG_I2C_ADR, &c);
        if(c==0x68) digitalWrite(PIN_LED1,1);
    }
}

4.3 サンプルプログラム(2)
 チャンネルSCI12に接続された9軸センサMPU-9150の初期化と読み込みを行います.
 読み込んだ値はチャンネルSCI0からシリアル通信で出力します.(RXRSLIBも併用しています)
 intvect.cの修正は事前に済ませておいてください.(SCI0:RXRSLIBで使用, SCI12:RXI2CLIBで使用)
//MPU-9150 読み出し&出力サンプル
#include <rxduino.h>
// e2studioの場合は #include <Arduino.h>

int ncom=  0;
int ni2c= 12;

#define RXRS_SENDBUFFERSIZE0 256
#include "rxrslib.h"

#include "rxi2clib.h"

#define delayms(t) delay(t)
unsigned int t0;

//加速度&ジャイロ
#define AG_I2C_ADR      0x68
#define AG_GYRO_CONFIG  0x1B
#define AG_INT_PIN_CFG  0x37
#define AG_PWR_MGMT1    0x6B
#define AG_ACCEL_XOUT_H 0x3B

//コンパス
#define M_I2C_ADR       0x0C
#define M_HXL           0x03
#define M_CNTL          0x0A

void setup(){
    //シリアル通信ポート開始
    RXRS_Open(ncom, 12);    //brr=12->230769bps
    //I2C開始
    RXI2C_Open(ni2c, 3);    //brr=3->375000bps

    //加速度&ジャイロ初期設定
    RXI2C_Send2(ni2c, AG_I2C_ADR, AG_PWR_MGMT1, 0x00);
    RXI2C_Send2(ni2c, AG_I2C_ADR, AG_INT_PIN_CFG, 0x02);
    RXI2C_Send2(ni2c, AG_I2C_ADR, AG_GYRO_CONFIG, 0x08);
     //00h:+/- 250deg/s(default)
     //08h:+/- 500deg/s
     //10h:+/-1000deg/s
     //18h:+/-2000deg/s

    //コンパス初期設定
    RXI2C_Send2(ni2c, M_I2C_ADR, M_CNTL, 0x01);    //変換開始

    delayms(10);
    t0=micros();
}

void loop(){
    unsigned char dat[22];
    int d[9];

    //加速度&ジャイロ読み出し
    RXI2C_Send1(ni2c, AG_I2C_ADR, AG_ACCEL_XOUT_H);
    RXI2C_Recv(ni2c, AG_I2C_ADR, &dat[2], 14);

    d[0]=(dat[2]*0x100)|dat[3];
    d[1]=(dat[4]*0x100)|dat[5];
    d[2]=(dat[6]*0x100)|dat[7];
    d[3]=(dat[10]*0x100)|dat[11];
    d[4]=(dat[12]*0x100)|dat[13];
    d[5]=(dat[14]*0x100)|dat[15];

    //コンパス読み出し
    RXI2C_Send1(ni2c, M_I2C_ADR, M_HXL);
    RXI2C_Recv(ni2c, M_I2C_ADR, &dat[16], 6);

    d[6]=(dat[17]*0x100)|dat[16];
    d[7]=(dat[19]*0x100)|dat[18];
    d[8]=(dat[21]*0x100)|dat[20];

    //コンパスは次の変換を開始しておく
    RXI2C_Send2(ni2c, M_I2C_ADR, M_CNTL, 0x01);    //変換開始

    //データ出力(テキスト形式)
    char s[256];

    //ここまでで約0.77ms(@375kbps)
    sprintf(s,"dt=%4d ",(int)(micros()-t0));
    while(RXRS_CheckSend(ncom)<(int)strlen(s));
    RXRS_Sends(ncom,s);

    sprintf(s,"%6d %6d %6d/%6d %6d %6d/%6d %6d %6d\r\n"
        ,d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8]);
    while(RXRS_CheckSend(ncom)<(int)strlen(s));
    RXRS_Sends(ncom,s);

    //時間待ち(10msになるまで)
    while(micros()-t0<10000);
    t0= micros();
}


5.設定の変更


5.1 速度設定
 通信速度の指定は,RXI2C_Open()の第2引数で行います.
SCIのチャンネル毎に異なる値を設定できます.
主なBRR値とボーレートの関係は以下のとおりです.
brr -> 通信速度  [Hz]
  0 -> 1500000.0 [Hz]
  1 ->  750000.0 [Hz]
  2 ->  500000.0 [Hz]
  3 ->  375000.0 [Hz]
  4 ->  300000.0 [Hz]
 14 ->  100000.0 [Hz]

また,brr値から通信速度への換算は次式となります.
 speed = 48M/(32*(brr+1)) [Hz]

5.2 使用ポートの変更
 デフォルトでは,SCIの各チャンネルは次のポートを使用します.
SCI0:  P21(IO0)  =SCL, P20(IO1)  =SDA
SCI1:  P30(CN6-6)=SCL, P26(CN6-3)=SDA ※
SCI2:  P12(IO30) =SCL, P13(IO31) =SDA
SCI3:  P25(IO5)  =SCL, P23(IO3)  =SDA
SCI5:  PC2(IO8)  =SCL, PC3(IO9)  =SDA
SCI6:  P33(IO7)  =SCL, P32(IO6)  =SDA
SCI8:  PC6(IO11) =SCL, PC7(IO12) =SDA
SCI12: PE2(IO46) =SCL, PE1(IO45) =SDA

※SCI1で使うP30, P26の位置を下図に示します.


このうち,SCI0とSCI2においては,次のポートへ変更できます.
以下の中から必要なものを#include "rxi2clib.h"より前に記述します.

// SCI0で P33(IO7)=SCL, P32(IO6)=SDAを使うとき
#define SCI0_SCLSDA_P33P32

// SCI2で P52(IO26)=SCL, P50(IO24)=SDAを使うとき
#define SCI2_SCLSDA_P52P50


6.関数リファレンス

================全体に関するもの================

--------------------------------------------------------
int RXI2C_Open(int n, int brr);
--------------------------------------------------------
説明
 指定されたSCIのチャンネルを簡易I2Cモードで使用開始します.最初に必要です.
 正常終了した後,RXI2CLIB の各関数が使用可能となります.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 brr:通信速度に対応するBRR値 [0〜255] ※詳しくは4.1を参照
   brr -> 通信速度 [Hz]
   0 -> 1500000.0 [Hz]
   1 -> 750000.0 [Hz]
   2 -> 500000.0 [Hz]
   3 -> 375000.0 [Hz]
   4 -> 300000.0 [Hz]
   14 -> 100000.0 [Hz]
戻り値
 0 正常終了(オープンできた)
 1 エラー(すでにオープンされている)
 2 エラー(使えないチャンネル番号が指定された)
使用例
 RXI2C_Open(8, 3); //SCI8を375kHz(brr=3)で使用する


================送信に関するもの================

--------------------------------------------------------
int RXI2C_Send(int n, int adr, void *buf, int size);
--------------------------------------------------------
説明
 sizeバイトのデータをデバイスへ送信します.
 すべてのデータの送信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 buf:送信データが格納されている領域の先頭アドレス(ポインタ)
 size:送信データのサイズ(単位:バイト)
戻り値
 送信できたデータのバイト数(単位:バイト)
使用例
 unsigned char buf[2];
 buf[0]= 0x6B;
 buf[1]= 0x00;
 RXI2C_Send(8, 0x68, buf, 2);


--------------------------------------------------------
int RXI2C_Send1(int n, int adr, unsigned char d1);
--------------------------------------------------------
説明
 1バイトのデータをデバイスへ送信します.
 すべてのデータの送信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 d1:1個目の送信データ(1バイト)
戻り値
 送信できたデータのバイト数(単位:バイト)
使用例
 RXI2C_Send1(8, 0x68, 0x01);


--------------------------------------------------------
int RXI2C_Send2(int n, int adr, unsigned char d1, unsigned char d2);
--------------------------------------------------------
説明
 2バイトのデータをデバイスへ送信します.
 すべてのデータの送信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 d1:1個目の送信データ(1バイト)
 d2:2個目の送信データ(1バイト)
戻り値
 送信できたデータのバイト数(単位:バイト)
使用例
 RXI2C_Send2(8, 0x68, 0x6B, 0x00);


--------------------------------------------------------
int RXI2C_Send3(int n, int adr, unsigned char d1, unsigned char d2, unsigned char d3);
--------------------------------------------------------
説明
 3バイトのデータをデバイスへ送信します.
 すべてのデータの送信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 d1:1個目の送信データ(1バイト)
 d2:2個目の送信データ(1バイト)
 d3:3個目の送信データ(1バイト)
戻り値
 送信できたデータのバイト数(単位:バイト)
使用例
 RXI2C_Send3(8, 0x68, 0x01, 0x02, 0x03);


================受信に関わるもの================

--------------------------------------------------------
int RXI2C_Recv(int n, int adr, void *buf, int size);
--------------------------------------------------------
説明
 デバイスからデータをsizeバイト受信します.
 すべてのデータの受信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 buf:受信データを格納する領域の先頭アドレス(ポインタ)
 size:読み込みたいデータ数(単位:バイト)
戻り値
 実際に読み込めたデータ数(単位:バイト)
使用例
 unsigned char buf[14];
 RXI2C_Send1(8, 0x68, 0x3B);
 RXI2C_Recv(8, 0x68, buf, 14);


--------------------------------------------------------
int RXI2C_Recv1(int n, int adr, unsigned char *pd1);
--------------------------------------------------------
説明
 デバイスからデータを1バイト受信します.
 すべてのデータの受信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 pd1:1個目の受信データを格納する領域の先頭アドレス(ポインタ)
戻り値
 実際に読み込めたデータ数(単位:バイト)
使用例
 unsigned char c1;
 RXI2C_Recv1(8, 0x68, &c1);


--------------------------------------------------------
int RXI2C_Recv2(int n, int adr, unsigned char *pd1, unsigned char *pd2);
--------------------------------------------------------
説明
 デバイスからデータを2バイト受信します.
 すべてのデータの受信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 pd1:1個目の受信データを格納する領域の先頭アドレス(ポインタ)
 pd2:2個目の受信データを格納する領域の先頭アドレス(ポインタ)
戻り値
 実際に読み込めたデータ数(単位:バイト)
使用例
 unsigned char c1, c2;
 RXI2C_Recv2(8, 0x68, &c1, &c2);


--------------------------------------------------------
int RXI2C_Recv3(int n, int adr, unsigned char *pd1, unsigned char *pd2, unsigned char *pd3);
--------------------------------------------------------
説明
 デバイスからデータを3バイト受信します.
 すべてのデータの受信が完了するまで制御は戻ってきません.
引数
 n:チャンネル番号 [0〜3, 5, 6, 8, 12]
 adr:スレーブのアドレス(下位7ビットが有効)
    注)R/Wビットを含まない,左ビットシフトする前のアドレスです.
 pd1:1個目の受信データを格納する領域の先頭アドレス(ポインタ)
 pd2:2個目の受信データを格納する領域の先頭アドレス(ポインタ)
 pd3:3個目の受信データを格納する領域の先頭アドレス(ポインタ)
戻り値
 実際に読み込めたデータ数(単位:バイト)
使用例
 unsigned char c1, c2, c3;
 RXI2C_Recv3(8, 0x68, &c1, &c2, &c3);


7.オシロ波形







ダウンロード

 rxi2clib10.zip ファイル rxi2clib.h がZIP圧縮してあります.

 rxi2clcd.zip I2C接続LCDモジュールを使うための補助ライブラリ rxi2clcd.h です.
         詳しい説明は割愛いたします.なお,ソース冒頭に簡単なサンプルがあります.


1つ上へ戻る