お世話になっております。
現在、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を通らない原因について
についてです。
長々と申し訳ございません。
お手数ですが、どうぞ、よろしくお願いいたします。
すみません、この段階は解決いたしました。
続いて文字表示についてですが、
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) ; // 送信完了待ち
で止まっています。
第一引数のビットシフトを外しても同様の結果でした。
> ★while (i2c_flag == 0) ; // 送信完了待ち で止まっています。関数の外で書き換わる変数であれば volatile 付きで宣言されていなければなりませんが、そういう問題ではない?
ほや様
リプライありがとうございます。
試してみましたが、変わらずでした。
元々は完成されていたサンプルコードでしたし、他の関数ではクリアしていたら通っていたので、
恐らくvolatileではないかと考えています。