STM32 + LLでI2C通信を使用してICM20602と通信してみる

こんにちは。以前LLライブラリを使用してI2Cに挑戦しましたが全然動かないため諦めました。先日、いろいろとあってI2Cの通信について少し勉強したので今ならいける!という謎の自信をもって再挑戦しました。実装方法を書いていきたいと思います。

今回は、STM32F303K8+ICM20602で通信を行いました。ただし、データシートはF3,F4を両方見ながら行ったこと等あるためF4でも多分動くと思います。F4では環境がなかったため確認をすることができていません。この記事では基本的にSTM32F3のリファレンスマニュアルを読み解いていきたいと思います。

データシートを見る限りでは送信、受信のフラグ確認まちループの確認用フラグを一部追加(変更)することでなんとかなりそうです。




データシートを確認する

マイコン編

今回はマイコンがマスタになるためマスタトランスミッタとレシーブの確認をしていきます

 

RM0316より引用

RM0316より引用

I2C_CR2レジスタにスレーブデバイスのアドレス(左詰め7bit)、書き込みか読み込みか、モード設定等をしてスタートをすればよし!ということがわかりました。
また、今回は割り込み処理を使用しないため監視すべきフラグはTXEフラグとRENEフラグとSTOPフラグ、BSYフラグだけでよさそうということが読み取れました。

また、I2CのデバイスアドレスにおけるR/Wバイトも設定してくれるみたいです。したがって、スレーブアドレスは左1bitシフトしていれてあげるだけでOKということが読み取れました。

また、ACKやNACKはハードウェアが自動で処理をしてくれるそうです。I2Cの面倒なところはハードウェアがやってくれるようなので楽ですね!

今回のデータシートをみるにあたって感じたことですが、STM32F4のI2CとSTM32F3のI2Cのドキュメントにわかりやすさの差が天と地ほどあるのに驚きました(是非見比べてみていただきたいです)。1

デバイス編

ICM20602のI2C設定を確認してみます。

ICM20602データシートより引用ICM20602データシートより引用

I2Cの設定に必要なところのデータシートの部分を一部引用させていただきました。

マイコンの設定に必要なのは、通信速度、立ち上がり・立下り時間、通信bit数などです。必要に応じて確認をしましょう。

続いてデバイスID,SPI通信で使用するCSピンをどのように処理すればいいのかの確認をしましょう。下のデータシートよりCS=0のときにSPIモードになると表に書いてあるためCS = High, SD0はスレーブアドレスの一番下のビットを1/0に変化させるビットだということがわかりました。今回はSD0はLow(GND接続)にしてしまおうと思います。したがって、スレーブアドレスは(0x68)<<1より0xD0であるということが読み取れます。

STM32CubeMXの設定

今回は、I2Cの設定と同時にTIM割り込みの設定、USARTの設定をしました。センサの表示は10msecに一回割り込みで行っていきます。

TIMの設定

TIMのNVIC設定

USARTの設定

I2Cの設定
使用ライブラリの設定

ここまで設定をしたらプロジェクト名を適当に設定して、各自使い慣れたIDEやgccに対応するプロジェクトを作成してもらいましょう。

 

実装

ソースコードを以下に示します。

こんなかんじです。LL_I2C_HandleTransfer関数でなんとかなりました!関数内で行っている動作は設定をリセットするでリセットしている点をセットしているだけです。レジスタ直打ちのほうがわかりやすいかもしれないです。

printf,TIM割り込みの設定等に関しては下記の記事を参考にしていただければ幸いです。

ICM20602等のデバイスのデータシートの読み方等(概要)が書いてある記事。

 

さいごに

LLライブラリを使用したI2Cの通信はいろいろとはまりました。また、I2C通信の際にプルアップ抵抗をつけますがプルアップ抵抗の値をしっかりと気にすることの大切さもオシロスコープで確認することで学ぶことができました。デバッグするときにオシロスコープはとても有用ですね。

STM32マイコンのLLAPIを使用して周辺機能でまだいじっていないCAN通信やDAC周りを次はいじってみたいと考えています。

最後まで読んでいただきありがとうございます。何か問題等ございましたらご指摘していただけると幸いです。

 

参考文献

RM0316 (STM32F3 リファレンスマニュアル)

ICM20602データシート

  1. 私の理解力がないのか、ドキュメントがわかりづらいのか・・・