Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

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();

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

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

    ソースで気になるのは、R_IICA0_Master_Sendは送信完了を割り込みで受け取ります。
    送信完了前にストップコンディションを生成していないでしょうか
    実際に波形を観測して確認してみてください
    以上、よろしくお願いします。
  • チョコです。
    鈴木さんもコメントしていますが,R_IICA0_Master_SendはI2Cでの送信を開始するとすぐに関数から戻ってきます。送信が完了したかどうかは,IICA0の割り込み処理で"r_iica0_callback_master_receiveend"が実行されたかどうかです。この関数に送信が完了したことを示すようなフラグをセットして,それを上位のプログラムで確認する必要があります。ここらあたりが,コード生成の不親切なところです。(これは,受信処理も同様です。)
    さらに,I2CのEEPROMは書き込みデータを受信後にストップコンディションを検出すると,そこから実際に書き込みを行います。書き込みは最大5msと規定されていますので,この間は待ってから読み出すようにしていますか?(又は,ACKのポーリングでの完了待ち)

    また,R_IICA0_Master_Receive_Restartがどのような処理を行っているかが気になります。

    鈴木さん,以前から言っているように,早く,シリアル系のAPIを改修してください。
  • In reply to 鈴木:

    チョコです。
    鈴木さん,MAX7219をCSIで制御してLED表示を行っていて,問題を見つけました。
    CSIの連続送信で最後のデータを書き込んだ後で,割り込みタイミングを書き換えてますが,転送速度とプログラムの実行速度の関係で,最後の割り込みが発生しない可能性があります。
  • In reply to チョコ:

    チョコ様
    返信ありがとうこざいます。

    r_iica0_callback_master_sendendあるいはr_iica0_callback_master_receiveendの実行

    ストップコンディションの生成

    書き込み待ち あるいはポーリングでの完了待ち

    この様な流れでよろしいでしょうか。


    R_IICA0_Master_Receive_Restartはこのような処理を行っています。
    japan.renesasrulz.com/.../6699
    MD_STATUS R_IICA0_Master_Receive_Restart(uint8_t adr, uint8_t * const rx_buf, uint16_t rx_num, uint8_t wait)
    {
    STT0 = 1U; /* set IICA0 start condition *

    /* Wait */
    while (wait--)
    {
    ;
    }

    /* Set parameter */
    g_iica0_rx_len = rx_num;
    g_iica0_rx_cnt = 0U;
    gp_iica0_rx_address = rx_buf;

    g_iica0_master_status_flag = _00_IICA_MASTER_FLAG_CLEAR;
    adr |= 0x01U; /* set receive mode */
    IICA0 = adr; /* receive address */

    return (MD_OK);
    }

  • In reply to 鈴木:

    鈴木様
    返信ありがとうございます。

    チョコ様の方法で割り込みを実行したか確認しましたが実行していないようなので
    送信完了及び受信完了前にストップコンディションを生成していることが原因だと思われます。
  • In reply to Taku:

    チョコです。
    >r_iica0_callback_master_sendendあるいはr_iica0_callback_master_receiveendの実行
    >
    >↓
    >
    >ストップコンディションの生成
    >
    >↓
    >
    >書き込み待ち あるいはポーリングでの完了待ち
    >
    >この様な流れでよろしいでしょうか。
    はい,そのような流れとなります。

    >R_IICA0_Master_Receive_Restartはこのような処理を行っています。

    このような処理であれば,同様にスレーブアドレスの送信を開始したところで関数から抜けてくるので,r_iica0_callback_master_receiveendの処理まで待ってからストップコンディションを生成することで通信は完了となります。その後で読みだしたデータを確認してください。
  • In reply to Taku:

    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の温度情報取得
    ///////////////////////////////////////////////////////////////////////

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page