RL78/G14のEEPROMのI2C通信について

はじめまして、Takuと申します。

現在I2Cを利用してのEEPROMの書き込み、読み出しを行うプログラムを作成しているのですが

読み出しがうまく行かず困っています。そもそも書き込みができているのかが…

よろしければアドバイスをお願い致します。

 

使用統合開発環境 CS+ for CA,CX 

使用製品 MTK-RL78/G14

使用EEPROM型名 R1EX24512ASAAS0A

/*書き込み部*/
i2c_write_buf[0] = 0x00; /*アドレス上位8bit*/
i2c_write_buf[1] = 0x00; /*アドレス下位8bit*/
i2c_write_buf[2] = data; /*データ1byte*/
R_IICA0_Master_Send(WRITE_WAVE, i2c_write_buf, 3, 100);
R_IICA0_StopCondition();

/*読み出し部*/
i2c_write_buf[0] = 0x00;
i2c_write_buf[1] = 0x00;
R_IICA0_Master_Send(WRITE_WAVE, i2c_write_buf, 2, 100);
R_IICA0_Master_Receive_Restart(READ_WAVE, i2c_read_buf, 1, 100);
R_IICA0_StopCondition();

※マスタ送信/受信コールバック時にストップコンディションは生成していません。

Parents
  • Taku様、コード生成サポート担当の鈴木です。
    下記スレッドが参考になると思います
    japan.renesasrulz.com/.../eeprom

    ソースで気になるのは、R_IICA0_Master_Sendは送信完了を割り込みで受け取ります。
    送信完了前にストップコンディションを生成していないでしょうか
    実際に波形を観測して確認してみてください
    以上、よろしくお願いします。
  • 鈴木様
    返信ありがとうございます。

    チョコ様の方法で割り込みを実行したか確認しましたが実行していないようなので
    送信完了及び受信完了前にストップコンディションを生成していることが原因だと思われます。
  • Takuさん
    前にチョコさんに教わったことを思い出しました
    EEPROMではないですがご参考に
    ///////////////////////////////////////////////////////////////////////
    //MAX6626の温度情報取得
    ///////////////////////////////////////////////////////////////////////
    double get_max6626(void)
    {
    double ret;
    uint8_t data[2];
    IIC20_Master_Receive(0x91, data, 2);//レシーブ命令
    while( (SOE1 & _0001_SAU_CH0_OUTPUT_ENABLE ) !=0){}//実行中か?実行中であれば待機
    ret=(double)(((((int)data[0] <<8) | (int)data[1] & 0xFF) >>4) & 0x0FFF);//データを取り出す
    ret *=0.0625;
    return ret;
    }
    ///////////////////////////////////////////////////////////////////////
    //MAX6626の温度情報取得
    ///////////////////////////////////////////////////////////////////////
Reply
  • Takuさん
    前にチョコさんに教わったことを思い出しました
    EEPROMではないですがご参考に
    ///////////////////////////////////////////////////////////////////////
    //MAX6626の温度情報取得
    ///////////////////////////////////////////////////////////////////////
    double get_max6626(void)
    {
    double ret;
    uint8_t data[2];
    IIC20_Master_Receive(0x91, data, 2);//レシーブ命令
    while( (SOE1 & _0001_SAU_CH0_OUTPUT_ENABLE ) !=0){}//実行中か?実行中であれば待機
    ret=(double)(((((int)data[0] <<8) | (int)data[1] & 0xFF) >>4) & 0x0FFF);//データを取り出す
    ret *=0.0625;
    return ret;
    }
    ///////////////////////////////////////////////////////////////////////
    //MAX6626の温度情報取得
    ///////////////////////////////////////////////////////////////////////
Children
No Data