RL78/G14とLCDのi2c通信について

お世話になっております。

現在、RL78/G14と、LCD(型番AQM1602XA-RN-GBW)で、i2c通信を行おうとしておりますが、

初期化と文字表示の段階にて苦労しております。

ブレークをかけると、下記の★印をつけた、『while (i2c_flag == 0) ;     /* 送信完了待ち */』から先へ進みません。

(LCDデータシート)akizukidenshi.com/.../AQM1602_rev2.pdf

↑のURLによると、このLCDで初期化をするには、下記の

『0x38, 0x39, 0x14, 0x73, 0x56, 0x6C, 0x38, 0x01, 0x0C』

という数値をそれぞれ表記される時間を挟んで送信する必要があるとのことです。

絵解きマイコンCのDVD-ROMのサンプルコード↓

(D:\03_サンプル・プログラム\第12章\リスト13-16_c08-i2c1)を参考に、下記のコードを組みました。

メインファイル内以外、ファイルの中は変更していません。

お聞きしたいことは

 ①考え方や使用する関数等、前提の考え方や方針は正しいか。

 ②配列から一つずつ文字を取り出すにはどう改良するべきか。

 ③フラグが1を通らない原因について(そもそもブラックボックスになっているので特定が難しい?)

です。

【作成関数(mainファイル)】--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void sendInitData(void) {
uint8_t lcd_init_data[] = {0x38, 0x39, 0x14, 0x73, 0x56, 0x6C, 0x38, 0x01, 0x0C};        /*初期化送信データ*/
int i;

for (i = 0; i < sizeof(lcd_init_data); i++) {                                                                                     /*一つずつ取り出し*/
while(0 == delay_flag);                                                                                                               /*割り込み(インターバルタイマ)で200ms経過で立つフラグ*/
delay_flag = 0;                                                                                                                            /*通ったらフラグを0に戻す*/
R_IICA0_Master_Send(0x3e, &lcd_init_data[i], 9, 1);                                                                /* 1つのデータをI2C送信実行 */
}
★while (i2c_flag == 0) ;                                                                                                             /* 送信完了待ち */                        
R_IICA0_StopCondition();                                                                                                          /* I2C通信終了 */
while (SPD0 == 0) ;                                                                                                                    /* ストップ・コンディション検出待ち */
i2c_flag = 0;
}

【mainファイルend】-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

お聞きしたいことは

 ①考え方や使用する関数等、前提の考え方や方針は正しいか。

 ②配列から一つずつ文字を取り出すにはどう改良するべきか。

 ③フラグが1を通らない原因について

についてです。

長々と申し訳ございません。

お手数ですが、どうぞ、よろしくお願いいたします。

Parents
  • すみません、この段階は解決いたしました。

    続いて文字表示についてですが、

    akizukidenshi.com/.../AQM1602_rev2.pdf

    を参考に、ADDRアドレスと、表示したい文字コードを

    R_IICA0_Master_Send(0x00 << 1, lcd_init_data, 1, 1); という風に入力しました。

    0x00は液晶の一番恥じっこで、cd_init_data変数の中身は、'A'を表示させる"0x41"です。

    【コーディング内容】---------------------------------------------------------------------------------------

    void i2c_send_byte(void) {
    uint8_t lcd_init_data[] = {0x41};
    i2c_flag = 0;
    R_IICA0_Master_Send(0x00 << 1, lcd_init_data, 1, 1); // I2C送信
    ★while (i2c_flag == 0) ; // 送信完了待ち
    R_IICA0_StopCondition(); // I2C通信終了
    while (SPD0 == 0) ; // ストップ・コンディション検出待ち
    }

    【コーディング内容】---------------------------------------------------------------------------------------

    という関数をつくりましたが、★while (i2c_flag == 0) ; // 送信完了待ち

    で止まっています。

    第一引数のビットシフトを外しても同様の結果でした。

  • チョコです。

    R_IICA0_Master_Sendの第1引数は、スレーブ・アドレスなので、0x00はあり得ません。

    ここは、0x3E<<1にしないといけません。また、LCDの制御は、以下のようにPDFに書かれています。

    スレーブ・アドレスに続けて、単一データか複数データの書き込みビット(Co)、コマンドかデータの判別用のビットを指定するビット(RS)を指定するバイトを送信します。その後に実際のデータを送信します。

    以下のような2バイトのデータが基本です。

    ここらは、以下の表に書かれています。これが基本です。

    ここで、下に示す上側の赤く囲んだSet DDRAMaddressで書き込みたい位置(アドレス)を指定します。このときRSは0にしてコマンドにします。(Coは0にしておきます。)

    その後、下側の赤で囲んだWrite data to RAMで書き込みたいデータを書き込みます。この時Coは0,RSは1にします。

    2バイト目が表示したいデータになります。

    LCDの制御については、古いサンプルコードですが、以下に示すものが参考になります。

    https://community-ja.renesas.com/cafe_rene/m/sample_program/277

    このサンプルコードは、RL78/G10の簡易IICですが、ここには説明のPDFがあります。そこには、型名は異なりますが、LCDの制御方法もいかのように書かれています。

    以上

  • チョコ様

    ありがとうございます、確認しました。

    月曜日にオフィスにおいてあるボードで確認しますので、

    それまで手が付けられませんが、また進捗があったら報告します。

    どうもありがとうございます。

Reply
  • チョコ様

    ありがとうございます、確認しました。

    月曜日にオフィスにおいてあるボードで確認しますので、

    それまで手が付けられませんが、また進捗があったら報告します。

    どうもありがとうございます。

Children
No Data