M5StickCの内部INT割込通知を利用する その3 原理解説編

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

その1とその2で実際に利用方法を説明しましたが、実際の通知がどのように行われているのかを説明したいと思います。

MPU6886の通知設定

8.25 REGISTER 55 – INT/DRDY PIN / BYPASS ENABLE CONFIGURATION

Register Name: INT_PIN_CFG

Register Type: READ/WRITE

Register Address: 55 (Decimal); 37 (Hex)

BITNAMEFUNCTION設定値
[7]INT_LEVEL1 – The logic level for INT/DRDY pin is active low.
0 – The logic level for INT/DRDY pin is active high.
0
[6]INT_OPEN1 – INT/DRDY pin is configured as open drain.
0 – INT/DRDY pin is configured as push-pull.
0
[5]LATCH_INT_EN1 – INT/DRDY pin level held until interrupt status is cleared.
0 – INT/DRDY pin indicates interrupt pulse’s width is 50 µs.
1
[4]INT_RD_CLEAR1 – Interrupt status is cleared if any read operation is performed.
0 – Interrupt status is cleared only by reading INT_STATUS register.
0
[3]FSYNC_INT_LEVEL1 – The logic level for the FSYNC pin as an interrupt is active low.
0 – The logic level for the FSYNC pin as an interrupt is active high.
0
[2]FSYNC_INT_MODE_ENWhen this bit is equal to 1, the FSYNC pin will trigger an interrupt when it transitionsto the level specified by FSYNC_INT_LEVEL. When this bit is equal to 0, the FSYNC pin is disabled from causing an interrupt.0
[1:0]Reserved.10

上記がデータシートの該当部分抜粋です。MPU6886が比較的機能が充実していたので、設定項目から仕組みを説明したいと思います。

通知レベル – INT_LEVEL

M5StickCの設定値は0のactive highです。この設定は通常はLOWですが、通知が発生するとHIGHになります。1は反対のactive lowで、通常はHIGHですが、通知が発生するとLOWになります。

どちらでもいいのですが、歴史的経緯によりactive lowを採用することが多いです。たとえばSPI通信のセレクトであるCSもLOWに落とすことで選択になります。

active highの回路の場合には、通知は発生させる端末がHIGH出力ができる必要があります。しかしながらRTC(BM8563)はHIGH出力ができず、LOWにしかできません。通知をする可能性がある部品を確認して、どちらのモードにするかを選択してください。

通知オープン設定 – INT_OPEN

M5StickCの設定値は0のpush-pullです。これはHIGH出力をするということになります。1の場合にはopen drainですので出力ではなく、ハイインピーダンスになります。

LOW出力の場合にはどちらもGNDに落とすことになりますが、プルアップされている回路の場合にHIGH出力をするのは無駄になるので、オープンドレインが選択できます。

ラッチ通知 – LATCH_INT_EN

M5StickCの設定値は1のheldです。割込ステータスがクリアされるまで、信号レベルが保持されます。0の場合にはパルスで、50 µsだけ信号レベルが変わります。

どちらの場合もありますが、取りこぼしを考えるとホールドのほうが安全です。

通知読み込みクリア – INT_RD_CLEAR

M5StickCの設定値は0のINT_STATUS読み込み時のみクリアです。割込ステータスのレジスタを読みだした場合だけクリアされます。1の場合にはなにかの数値を読み込んだらクリアされます。

これも使い方の問題なのでどちらでも構いません。明示的にクリアしないといけない0の方が安全だと思います。

その他

FSYNCはM5StickCでは接続されていないと思われるので、今回は省略します。

M5StickCのINT割込通知回路

M5StickCのINT割込通知はESP32のGPIO35に割り当てられています。GPIO35なのでINPUT専用のPINであり、プルアップなどもできません。

起動直後にGPIO35の電圧を取得するとLOWですので、回路的にプルアップされてはいません。

そのため、Active HIGHの設計と思われるのですが、接続されている電源管理(AXP192)やRTC(BM8563)はpush-pullができません。

MPU6886はpush-pullが可能なため、通常はLOWで、通知が発生するとHIGHになるようにして通知を行っています。

RTC(BM8563)の例の場合には、MPU6886に常にHIGH出力をしてもらって、Active LOWの状態を無理やり実現しています。そのため、本質的にはあまりよくない利用方法となります。

MPU6886に常にHIGH出力をしてもらう方法ですが、M5StickCの標準ライブラリの場合何故かデータ送信が完了したことを表すFIFO通知が有効になっており、初期化をした瞬間に通知が発生し、その通知をクリアする処理がないために常にHIGH出力となっています。

初期値の設定ミスな気もしますが、現状がそのような動きになっていましたので、そのまま使っています。本来は回路的にプルアップしてもらい、Active LOWの設定で使うのが正しいと思います。

まとめ

原理だけの説明になってしまいました。RTCとIMUのデータシートをもう少し解説するのも後日書くかもしれません。

AXP192は通知が成功していませんが、現在のところほしい通知もないのでどこまで調査するのか悩んでいます。

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。