[NXP マイコン初心者ガイド 12] へ | [NXP マイコン初心者ガイド 14] | ||
NXP マイコン初心者ガイド まとめサイト |
目次
- はじめに
- 1. NXP マイコンに搭載している Flexcomm について
- 2. FRDM-MCXN947 の回路情報
- 3. Pin / Clock Configuraiton Tool を使った Pin と Clock の設定方法
- 4. LPI2C Driver の有効化
- 5. Peripheral Configuraiton Tool を使った LPI2C の設定方法
- 6. ポーリングマスター制御(割り込み未使用)
- 7. [実機検証] FRDM-MCXN947 と SHT45 (MIKROE-5301) の通信テスト
- まとめ
はじめに
マイコン開発でよく使用される I2C を NXP マイコンで制御する方法をご紹介します。
今回は Macnica で取り扱いのある Sensirion 温湿度センサー SHT45 を搭載した MIKROE-5301 を
FRDM-MCXN947 の Mikro Bus に接続し、温湿度センサー情報を取得するまでを解説いたします。
I2C を簡単に制御するサンプルソフトウェアも添付していますので、他のセンサーでもぜひ活用ください。
評価ボードとはこのように接続します。
対象デバイス、この記事で使用する評価ボードとバージョンは下記のとおりです
- 対象デバイス:MCX、LPC、Kinetis、i.MXRT ファミリー
- FRDM-MCXN947
- MCUXpresso SDK 2.16.000
Hello World サンプルプロジェクト をベースに作成していきます。
下記コンテンツを参考に、Hello World サンプルプロジェクトを作成しておきましょう。
参考:[NXP マイコン初心者ガイド 1] MCUXpresso IDE でサンプルプロジェクトを作成する方法
I2C の概要はぜひこちらをご覧ください。
ポイント:MIKROE-5301 などは Sensirion - MIKROE で検索し、欲しい拡張ボードを Macnica Mouser などの EC サイトでご購入下さい。
1. NXP マイコンに搭載している Flexcomm について
Flexcomm は Low-Power Flexible Communications Interface の略称になります。
LPI2C, LPSPI, LPUART など汎用通信インターフェースとして設定が可能で、内部に FIFO を持っていおり、割込み、送受信DMA要求、トリガー出力などの機能を持っています。
マイコンにより搭載数は異なりますが、MCXN947 は10個搭載しています。
ポイント:Flexcomm はアプリケーションに応じて自由に I2C, SPI, UART の数をカスタマイズすることが可能です。
図1:MCXN LP_FLEXCOMM ブロック図 (MCXNx4xRM.pdf 抜粋)
外部 PIN の設定は順番が決まっており、例えば Flexcomm0 で I2C の SDA SCL を設定する場合、Flexcomm0_P0 が SDA、Flexcomm0_P1 が SCL となります。
図2:MCXN LP_FLEXCOMM Pin アサイン (MCXNx4xRM.pdf 抜粋)
2. FRDM-MCXN947 の回路情報
FRDM-MCXN947 の Micro Bus の回路図を確認してみましょう。
P1_1 と P1_0 が I2C として設定されているのが分かります。
Flexcomm3 を使用する設定を行えば良さそうです。
図3 : FRDM-MCXN947 の回路情報(spf-90818_b2.pdf抜粋)
ポイント:回路図は 評価ボードの NXP HP からダウンロード可能です
3. Pin / Clock Configuraiton Tool を使った Pin と Clock の設定方法
図4 の赤枠で囲った部分をクリックし、Configuration Tool を立ち上げます。
Pin Configuraiton Tool が起動します。
図4:Configuration Tool の表示方法
3-1. Pin の設定
先ほど確認した、P1_1 と P1_0 を Flexcomm3 として設定していきます。
- Pins タブの中で、P1_1 と P1_0 を探します(ソートすると見つけやすいです)
- LP_FLEXCOMM を選択します(複数機能を設定できるため Flexcomm3 表示されてない点注意)
- Flexcomm3 P0 SDA の設定を有効にします
- Flexcomm3 P1 SCL も同様に有効にします
図5:Flexcomm3 P0 SDA、 P1 SCLの設定
Routing Detail タブにて細かい設定を行います。
- Label 列と Identifier 列に名前を設定します
- I2C の Pull Up 設定を行います(今回はボード上で Pull Up されるため OFF にしてます)
ボードの構成に合わせて有効にしてください - 他はデフォルトで問題ありませんが、必要に応じて変更ください
図6:Pin Assign 後の Routing Detail の設定項目
ポイント:Label 列と Identifier 列を設定しておくことで、board/pin_mux.h に定義を追加してくれます
3-2. Clock の設定
Clock Configuraiton Tool に切り替えます。
右上のボタンから、Pins と Clocks を切り替えてください
図7:Pins と Clocks の切り替え
Clock Diagram を表示します。
- FLEXCOMM3 clock の項目をスクロールして表示し該当箇所をクリック
- 右側に表示される Halt the Divider Counter の設定を Enable the Divider Counter に変更
- FCCLKSEL3 を FRO 12 MHz clock に変更
- FLEXCOMM3 clock を 12MHz に設定できれば有効化完了です
図8:Clock Diagram Flexcomm3 clock の設定変更
Update Code を一度押して Pin と Clock のコードを生成させます。
図9:Update Code
ポイント:この後行う Peripheral Configuraiton Tool の設定は Pin Clock の設定が反映される GUI 画面になっているため、ここで一旦 Update Code を実行してます
4. LPI2C Driver の有効化
Project Explorer 内で、下記箇所をクリックして、Manage SDK components を開きます。
LPI2C を検索し、有効化しておきます。
drivers フォルダーに、fsl_lpi2c.c と fsl_lpi2c.h が追加せれていれば完了です。
図10:Manage SDK components の起動
図11:LPI2C Driver の有効化
5. Peripheral Configuraiton Tool を使った LPI2C の設定方法
こちらのアイコンをクリックしてPeripheral Configuraiton Tool の画面を表示します。
有効化した後 + ボタンを押してペリフェラルの追加をしていきます。
ポップアップで LPI2C を検索して、選択し、OKを押します。
LP_FLEXCOMM の番号が異なっていると、最初エラーになりますので、合わせます。今回は LP_FLEXCOMM3 を選択します。自動的に Clock の設定も反映されます。
ボーレートの設定もこちらで変更可能です。
図12:Peripheral Configuraiton Tool の有効化
図13:LPI2C の選択
図14:LPI2C デフォルト時の画面
図15:LP_FLEXCOMM3 に変更後の画面
6. ポーリングマスター制御(割り込み未使用)
ポーリングマスター制御は Polling Mode を使用し、I2C のプロトコルに合うよう I2C Driver 関数を使用して自由に制御します。
図15の設定のまま、を押してコードを生成します。
board/peripheral.c が生成され、Peripheral Configuraiton Tool で設定した内容を初期化する関数BOARD_InitBootPeripherals() が生成されます。
設定内容は LP_FLEXCOMM3_masterConfig 構造体に格納されており、最終的に実行されるLPI2C_MasterInit() で引数に渡して、初期化処理が実行されるようになっています。
BOARD_InitBootPeripherals() を main() の冒頭で実行するようにすることで、初期化は完了です。
図16:Peripheral 設定の初期化
ポーリングマスター制御 で主に使用する fsl_lpi2c.h に用意されている関数はこちらです。
LPI2C 関数名 | 関数の概要 |
LPI2C_MasterStart | スタート信号とスレーブアドレスを送信します。この関数は新しいマスターモード転送を開始します。 |
LPI2C_MasterRepeatedStart |
LPI2C_MasterStart を再度実行します。この関数では通常、レジスターアドレスを送ります。 |
LPI2C_MasterReceive | I2Cバスからデータを受信します。この関数はバッファのデータを転送するまで待機します。 |
LPI2C_MasterSend | I2Cバスにデータを送信します。この関数はバッファのデータを送信するまで待機します。 |
LPI2C_MasterStop | I2Cバスにストップ信号を送信します。この関数はストップ信号が送信されるまで待機し、トランザクションが終了するまで待機します。 |
6-1 ポーリング Read 関数の作成
I2C の Read シーケンスは主に下記になります。
- Start コンディション + スレーブアドレス + ライトビット を送付
- ターゲットデバイスのレジスターアドレス を送付
- Start コンディション + スレーブアドレス + リードビットを送付
- ターゲットデバイスのデータを受信
- Stop コンディションを送付
ソースコードに置き換えると図17のようになります。
図17:ポーリング Read 関数のソースコード
注記:I2C のシーケンスはターゲットデバイスにより異なる可能性がありますので、デバイスの仕様やサンプルソフトウェアの仕様を確認の上ソフトウェアをカスタマイズください。
6-2 ポーリング Write 関数の作成
I2C の Write シーケンスは主に下記になります。
- Start コンディション + スレーブアドレス + ライトビット を送付
- ターゲットデバイスのレジスターアドレス を送付
- ターゲットデバイスにデータを送信
- Stop コンディションを送付
ソースコードに置き換えると図18のようになります。
図18:ポーリング Write 関数のソースコード
注記:I2C のシーケンスはターゲットデバイスにより異なる可能性がありますので、デバイスの仕様やサンプルソフトウェアの仕様を確認の上ソフトウェアをカスタマイズください。
7. [実機検証] FRDM-MCXN947 と SHT45 (MIKROE-5301) の通信テスト
Sensirion SHT45 の データーシートはこちらからダウンロード可能です。
参考:SHT45-±1.0% RH / ±0.1°C Digital humidity and temperature sensor
Sensirion サンプルソフトウェアはこちらからダウンロード可能です。
参考:GitHub - Sensirion/embedded-i2c-sht4x: Embedded driver for the SHT4x sensor family.
Sensirion サンプルソフトウェアから下記を source フォルダーに入れます
- sensirion_common.c / sensirion_common.h
- sensirion_config.h
- sensirion_i2c_hal.c / sensirion_i2c_hal.h
- sensirion_i2c.c / sensirion_i2c.h
- sht4x_i2c.c / sht4x_i2c.h
sensirion_i2c_hal.c の中に、6章で作成した関数を追加していきます。
図19:sensirion_i2c_hal.c 内へのソース記述追加
ポイント:Sensirion サンプルソフトウェア の構成上、Read / Write 関数では Register Address の送信は行っていません。Write 関数実行前に 送信 Buffer に Register Address を格納して送信しています。その都合上、6章で作成した lpi2c_polling_read() lpi2c_polling_write() で一部コメントアウトしており、使用しない引数には 0 を渡しています。
define 定義 for_sensrion_sample で切り替えられるようにしていますので、サンプルコードをご覧ください。
最後、SHT45 を動作させる main 処理を作成していきます。
example-usage/sht4x_i2c_example_usage.c のサンプルを参考に、温度と湿度を取得して、PRINTF に出力するサンプルはこのようになります。
- sht4x_soft_reset を実行し
- sht4x_serial_number にて デバイスのシリアルナンバーを取得
- sht4x_measure_lowest_precision_ticks にて温度湿度の TICK 値を取得
- TICK 値を補正式にて数値に変換
- 温湿度を表示
図20:SHT45 向けサンプル main 関数
実際にデバッグをすると下記ログが出力されます。
hello world. sht4x LPI2C Sample Test
INIT Sensirion sht4x .
serial_number: 252389075
******** Data Print ********
** temperature_ticks: 24476
** humidity_ticks : 26909
******** Data Convert ********
** temperature: 20 [C]
** humidity : 45 [%]
sample finish
添付ファイルに hello_world_sht4x.c, nxp_lpi2c_polling.c/h, sensirion_i2c_hal.c を格納していますので、ぜひ活用ください。
ポイント:GitHub - Sensirion/embedded-i2c-sht4x: Embedded driver for the SHT4x sensor family. からダウンロードした sensirion_i2c_hal.c を差し替えてご使用ください。
まとめ
センサーとの通信でよく使用される Flexcomm LPI2C の制御方法について解説しました。
使用するセンサー仕様やセンサーメーカーが用意しているサンプルソフトウェアの仕様に合わせてカスタマイズして活用いただければと思います。
[NXP マイコン初心者ガイド 12] へ | [NXP マイコン初心者ガイド 14] | ||
NXP マイコン初心者ガイド まとめサイト |