質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

Q&A

解決済

3回答

1813閲覧

Nucleo-F446RE mbedでI2C LCD動作せず

yukenai

総合スコア16

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

0グッド

0クリップ

投稿2018/04/20 12:03

AQM1602(I2C LCD)をNucleo-F446REで動作させようとmbedに以下のソースコードを作成。
ビルド後、書き込んでも、LCDが全然反応しません。
SCL,SDAの端子をモニタしたら、L => H => Lと一回だけ変化し、それ以降、変化しません。
なお、LCDはPICマイコンで正常に動作しています。
原因を教えてください。

ソースコード
#include "mbed.h"

//I2C i2c(I2C_SDA, I2C_SCL);
//I2CSlave slave(PB_9,PB_8);
I2C i2c(PB_9,PB_8);
//Serial pc(USBTX, USBRX); // tx, rx
DigitalOut myled(LED1);
DigitalOut LED(PA_1);

const int addr = 0x73; // define the I2C Address
//const int addr = 0x3E; // define the I2C Address

int main() {

// spi.format(8,3);
// spi.frequency(100000);

char cmd[4]; cmd[0] = 0x00;//制御コード

//Init Start
wait_ms(200);
cmd[1] = 0x38;i2c.write(addr, cmd, 2); //8bitバス 2行表示 5*7フォント
wait_us(50);
cmd[1] = 0x39;i2c.write(addr, cmd, 2); //IS=1(拡張コマンドを許可)
wait_us(50);
cmd[1] = 0x14;i2c.write(addr, cmd, 2); //拡張コマンドで内部周波数設定
wait_us(50);
cmd[1] = 0x73;i2c.write(addr, cmd, 2); //拡張コマンドでコントラスト設定
wait_us(50);
cmd[1] = 0x56;i2c.write(addr, cmd, 2); //拡張コマンドで電源,コントラスト設定
wait_us(50);
cmd[1] = 0x6C;i2c.write(addr, cmd, 2); //拡張コマンドでフォロアをON
wait_ms(300);
cmd[1] = 0x38;i2c.write(addr, cmd, 2);//IS=0 (拡張コマンドの処理を終了)
wait_us(50);
cmd[1] = 0x01;i2c.write(addr, cmd, 2);// Display clear
wait_us(50);
cmd[1] = 0x0C;i2c.write(addr, cmd, 2);// Display on

// end Init wait_ms(100); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ cmd[1]=0x02;i2c.write(addr, cmd, 2); //カーソルHome wait_us(50); cmd[0]=0x40;cmd[1]=0x31;i2c.write(addr, cmd, 2); //"1"表示

while(1) {
myled = 1;LED=0;
wait(1);
myled = 0;LED=1;
wait(1);

} // end while
} //end main

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2018/04/22 00:23

LCDモジュールのURLください
ozwk

2018/04/22 02:17

L => H => Lと変化して、最終的にはHですか?
guest

回答3

0

まずは、そのI2C-LCDを外しておいて、I2C出力に1バイト分以上のパルス出力が出るのを目標としましょう。

I2Cクラスの使い方が正しいのか、ソースがあるならそのクラスにバグがないかをチェックすることですねー

んで、I2Cクラスがダメ、というときには、SCL、SDAをポート出力としといて、自力でバタバタさせてI2Cを実装してみることですね


まさか、プルアップ抵抗付けてないってことはないでしょうな。

投稿2018/04/20 12:57

編集2018/04/20 13:04
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukenai

2018/04/21 13:12

プルアップ抵抗はLCDのモジュールに実装されています。 ソースは全部、質問に張り付けてアップしていますが、ほとんどは、参考サイトから、 持ってきたもので、あんまり変更しておらず、基本はこれで動くものと思っていました。  でも、原因不明で質問しました。 Nucleo特有のなにかあるのか、知っていたら、教えて頂きたく、お願いします。
y_waiwai

2018/04/21 14:33

I2C通信ができないというのはどうしようもありません Nucreoを外して、プルアップ抵抗を繋いどいて最低1バイト分のパルスが出るのを確認しましょう I2Cでは1バイト送った後に相手方のACKを確認して次のバイトの転送に入ります。 つまり、外しておいても1バイト分はパルスが出るということになります それができないと、繋いだところでもどーにもなりません
yukenai

2018/04/21 15:19

おっしゃっていることは理解しています。 ネット等でmbedのI2Cのマスターの設定を調べると ① I2C xxx(PB_9,PB_8); // xxxは任意の名前、SDAとSCLのピン指定 ② xxx.write(addr, cmd, 2) ;// マスター側の書き込みでスレーブのアドレスと2は2byte でこの部分を記述すれば、指定の端子から信号が出力されるとあります。 ところが現在、出力されません。 Nucleo-F446REでI2Cマスターとして、I2C信号を出力させるために抜けている 記述はあるのでしょうか? そのことについて教えて頂きたいと思っています。
y_waiwai

2018/04/21 22:36

まず、あなたの使っているI2Cライブラリがどこで公開されているものか、また果たしてNucleo-F446REに対応しているものか、はこちらからは推し量ることは出来ません ですんで、ライブラリの使用法に関しては、こちらからはアドバイスできません そのライブラリは、そのCPUにおいて実績のあるものなのでしょうか。 で、そのライブラリが使えない、という場合は、ソフトでI2Cを実装する、というテが使えます SCLを出力ポート、SDAをLowでは出力、Highでは入力ポートとして切り替え、自前でクロック、データを出力していくことです。 おそらくAQM1602のデータシートに通信シーケンスが載ってると思いますんで、オシロを見ながらそのとおりに信号出力するように組んでいけばいいです
yukenai

2018/04/22 10:02

今回、参考にしているサイトのソースは各ボードごとにソースが分かれていて、私が使用しているソースはこのボードに限定されて、デバック完了されているソースがアップされていると認識しています。 また、その他のmbedのI2Cのソースもほぼ同じ記述です。それで出力されないので問い合わせしています。 mbedに詳しい方、教えていただけませんか?  ソフトでI2Cを実装とありますが、そのようなことをしたくないなく、mbedで簡単にコントロールできるのでとおもい、mbedを選択しています。
y_waiwai

2018/04/22 13:02

ということなら、その作者に問い合わせる、というのが筋だと思われます こちらとしては、標準でもなく、どこで公開されてるのかもわからない、誰が作ったものかもわからないライブラリのサポートは出来ません
guest

0

NUCLEOシリーズのI2C通信は不安定なので、LCD初期設定時のwait時間をもう少し伸ばしてみてはいかがでしょうか。
NUCLEO-F302R8で秋月のAQM1602Aを試したところ、LCD初期設定はwait_us(50)からwait_us(500)に変更したら安定して使えています。

投稿2018/05/28 12:00

St.Mao

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Every second i2c.read fail on Nucleo F446RE

block write/read にバグがあるとのことです

リンク先によればmbed.lib をアップデートすればいいらしいですが、実機持ってないので試してません

投稿2018/04/22 13:53

編集2018/04/22 13:56
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukenai

2018/04/22 14:08

すいません。回答に気づかずにいました。mbed.lib をアップデートするとは、どのようなことをやればいいのでしょうか?具体的に教えてください。
ozwk

2018/04/22 14:20 編集

リンク先に書いてあります Right click on mbed.lib in you project and select ''update''.
yukenai

2018/04/24 00:58

承知しました。updateしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問