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

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

    鈴木さん,以前から言っているように,早く,シリアル系のAPIを改修してください。
  • チョコ様
    返信ありがとうこざいます。

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

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

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

    このような処理であれば,同様にスレーブアドレスの送信を開始したところで関数から抜けてくるので,r_iica0_callback_master_receiveendの処理まで待ってからストップコンディションを生成することで通信は完了となります。その後で読みだしたデータを確認してください。
Reply
  • チョコです。
    >r_iica0_callback_master_sendendあるいはr_iica0_callback_master_receiveendの実行
    >
    >↓
    >
    >ストップコンディションの生成
    >
    >↓
    >
    >書き込み待ち あるいはポーリングでの完了待ち
    >
    >この様な流れでよろしいでしょうか。
    はい,そのような流れとなります。

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

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