| [NXP MCX ペリフェラルガイド 2] | [NXP MCX ペリフェラルガイド 4] 準備中... | ||
| NXP マイコン初心者ガイド まとめサイト |
目次
- はじめに
- 1. I3C サンプルプロジェクトの種類に関して
- 2. FRDM-MCXN947 と P3T1755 の回路情報
- 3. i3c_master_read_sensor_p3t1755_cm33_core0 の構成
- 4. サンプル 初期化処理
- 5. I3C Transfer 処理関数 I3C_WriteSensor/I3C_ReadSensor
- 6. SETDASA(Set Dynamic Address from Static Address)の処理内容
- 7. [実機検証] ロジックアナライザーを使用した I3C 波形取得
- 8. [おまけ] IBI 機能の追加方法
- まとめ - IBI サンプルソフトウェア
はじめに
マイコンと周辺デバイス間でよく使用される通信規格 I2C の次世代規格である I3C は 「I2C」 と 「SPI」 の良いところを兼ね備えたシリアル通信規格です。
FRDM-MCXN947 には I3C に対応した温度センサー P3T1755 が搭載しており、サンプルソフトウェアの構造を解説しながら、I3C の特徴を紹介します。
今回は MCUXpresso SDK に付属している frdmmcxn947_i3c_master_read_sensor_p3t1755_cm33_core0 を使用して使い方を解説していきます。
IBI 機能を追加したサンプルソフトウェアも下部に添付していますので、是非参考ください
対象デバイス、この記事で使用する評価ボードとバージョンは下記のとおりです
対象デバイス:MCX、LPC、i.MXRT ファミリー
I3C の概要はぜひこちらをご覧ください。日本語セミナーではプロトコルの解説もされております。
参考:I3Cバスの概要 ~次のシリアルバス~ (日本語ブログ)
参考:I3C動作サンプルコード:「i3c-temperature-sensor」の動かし方 (日本語ブログ)
参考:【今知っておくべき】次世代インターフェース「I3C」の基礎(日本語セミナー)
1. I3C サンプルプロジェクトの種類に関して
MCUXpresso IDE には2種類のサンプルプロジェクトがございます。
- MCUXPresso SDK に付属しているサンプル
- Application Code Hub で公開されているサンプル
どちらも MCUXpresso IDE でインポートすることができます。
Application Code Hub は NXP が公開しているアプリケーション・サンプル・プロジェクトです。
MCUXpresso SDK に付属しているサンプルが「機能の使い方」に特化しているのに対し、Application Code Hub では、特定のユースケースを想定した「実際のアプリケーションに近い形」のサンプルが公開されています。
注記:今回は I3C IP の解説にフォーカスする為 1番の MCUXPresso SDK に付属しているサンプル を使用します。Application Code Hub は使用していません。
Application Code Hub の P3T1755: I3C temperature sensor demo の詳細解説は下記をご覧ください。
参考:I3C動作サンプルコード:「i3c-temperature-sensor」の動かし方 (日本語ブログ)
1-1. MCUXPresso SDK に付属しているサンプルをインポートする方法
frdmmcxn947_i3c_master_read_sensor_p3t1755_cm33_core0 をインポート手順をご紹介します。
Quickstart Panel > Import SDK example をクリックします
使用する評価ボードを選択します。
検索窓に I3C をタイピングして使用するサンプルを選択し、Finish をクリックするとインポート完了です。
1-2. Application Code Hub からサンプルをインポートする方法
Quickstart Panel > Import from Application Code Hub をクリックします
検索窓で I3C を選択し、P3T1755: I3C temperature sensor demo を選択します。
Github link をクリックして、Next を押し、Finish が表示されるまで Next を押していきます。
注記:何度もインストールする場合、パス競合のエラーが出ますので適当な文字に変更ください。
Project SDK management が出た場合 OK を押してください。
インポート完了です。
2. FRDM-MCXN947 と P3T1755 の回路情報
FRDM-MCXN947 は I3C1 が下記 Pin 番号に割り振られています。
- P1_16:F6:I3C1_SDA
- P1_17:F4:I3C1_SCL
ME_FC5 は MikroBus ヘッダー と EZH_LCD は Camera ヘッダーへ接続されていますので、信号を取り出して波形を取得するのが容易です。今回は ME_FC5 の MikroBus ヘッダーから取得しています。
また、I3C デバイスの接続を増やすことも容易になります。
温度センサー P3T1755 との接続はこのようになっています。
基本的に I3C は プルアップ抵抗は必要ありません。
I2C デバイスと通信する場合、SDA ラインだけプルアップする必要があり、P1_11/I3C1_PUR でマイコンからプルアップを制御できるようになっています。
I2C スレーブアドレスは 1001000b = 0x48 になります。I3C の動的アドレス割り当てで使用します。
参考:FRDM-MCXN947 の回路図は こちらからダウンロードください
3. i3c_master_read_sensor_p3t1755_cm33_core0 の構成
i3c_master_read_sensor_p3t1755_cm33_core0 に搭載されている機能は下記になります。
IBI 機能や ENTDAA(Enter Dynamic Address Assignment)機能は追加する必要があります。
- I3C Master として Read/Write 処理
- I3C CCC コマンドの発行
- SETDASA(Set Dynamic Address from Static Address)CCC コマンドによる
既にある静的アドレス(I2C スレーブアドレス)に対して別の動的アドレスを割り当て
(サンプルでは、 0x48 の静的アドレス に対して 0x08 の動的アドレスを割り当て) - P3T1755 の Register へのアクセス
- P3T1755 から温度データを取得してデコード
- 温度データを Printf 出力
プロジェクト構成はこのようになっております。
サンプルを実行すると実施の温度を表示するサンプルになります。
I3C master read sensor data example.
Temperature:27.000000
Temperature:27.0000004. サンプル 初期化処理
main code である i3c_master_read_sensor_p3t1755.c の初期化処理について解説します。
| 関数 | 処理内容 |
| BOARD_InitHardware |
Pin と Clock の初期設定を行います。 サンプル動作に最低限必要な処理が記述されています。 |
| I3C_MasterGetDefaultConfig | main() 内で定義した変数に初期設定を格納します i3c_master_config_t masterConfig; |
| I3C_MasterInit |
変更した masterConfig の設定の応じて I3C を初期化します EXAMPLE_MASTER 0x40022000u (I3C1 Base Address ) |
| I3C_MasterTransferCreateHandle |
Global 変数に定義したハンドラとコールバック関数を登録します コールバック関数は転送が完了した際に呼ばれます i3c_master_transfer_callback_t masterCallback |
| p3t1755_set_dynamic_address | SETDASA(Set Dynamic Address from Static Address)にて Slave Address 0x48 である P3T1755 に 0x8 の Dynamic Address を割り当てます。6章で解説してます。 |
| P3T1755_Init |
main() 内で定義した p3t1755Config の設定値をGlobal 変数に定義した p3t1755Handle に設定します。 p3t1755_config_t p3t1755Config; p3t1755_handle_t p3t1755Handle; I3C_WriteSensor/I3C_ReadSensor は I3C Transfer 処理関数です。 実際に ターゲットデバイスの Regsiter にアクセスする際に実行される関数です。5章で解説してます。 |
i3c_master_handle_t g_i3c_m_handle;
i3c_master_transfer_callback_t masterCallback
に関して補足致します。
i3c_master_handle_t は このような構造になっており I3C Driver の処理時に使用されます。
ユーザーがグローバル変数で定義しておき、どの関数からもアクセスできるようにしておきます。
masterCallback は 使用するコールバック関数を複数用意可能です。
デフォルトでは、transfercomplete として i3c_master_callback 関数が登録されています。転送が完了するたびに呼ばれます。i3c_master_callback の中身を カスタマイズする事で転送完了後の処理を追加可能です。
他によく使用されるのが ibicallback です。デバイスから IBI 割込みが発生した時に呼ばれます。
IBI に関しては 8 章で解説しています。
5. I3C Transfer 処理関数 I3C_WriteSensor/I3C_ReadSensor
I3C Transfer 処理とは I3C_MasterTransferNonBlocking() に 3つの引数を渡すだけで I3C の送受信を実施する転送方式です。Callback 関数を登録していた場合、転送完了後 Callback 関数を呼び出します。
- EXAMPLE_MASTER 0x40022000u などの I3C1 Base Address
- グローバル変数に定義した i3c_master_handle_t g_i3c_m_handle
- i3c_master_transfer_t masterXfer に格納した Transfer 設定
i3c_master_transfer_t masterXfer に設定する項目は下記のとおりです。
- ターゲットデバイスのアドレス
- Write/Read 設定
- I3C 転送モード (SDR mode / HDR-DDR / Standard i2c protocol)
- ターゲットデバイスのレジスターアドレスとサイズ
- 送信データ とサイズ
- 処理シーケンス Flag
Write or Read を設定値で変更可能であるため、どちらも I3C_MasterTransferNonBlocking() を使用しています。
処理シーケンス Flag は下記のように決まっており、動作させたい処理に合わせて変更します。
サンプルでは、kI3C_TransferDefaultFlag と kI3C_TransferNoStopFlag のみ使用しています。
| フラグ名 | 値 | 説明/使用シナリオ |
| kI3C_TransferDefaultFlag | 0x00U |
デフォルト動作。Start 条件 → データ転送 → Stop 条件。 基本的な単発の I²C/I3C 転送。 |
| kI3C_TransferNoStartFlag | 0x01U |
Start 条件、アドレス、サブアドレスを送信しない。 すでに転送が開始されていて、その続きとしてデータだけ送りたいとき。 |
| kI3C_TransferRepeatedStartFlag | 0x02U |
Repeated Start 条件を送信する。Stop を挟まず連続転送。 レジスタ読み出しの典型シーケンス(書き込み後すぐ読み出すなど)。 |
| kI3C_TransferNoStopFlag | 0x04U |
転送終了時に Stop 条件を送らない。 後続の転送に続けたいとき、バス保持をしたい場合。 |
| kI3C_TransferWordsFlag | 0x08U |
データをバイトではなくワード(2バイト)単位で扱う。 ワード転送が必要な周辺機器やプロトコルに対応するとき。 |
| kI3C_TransferDisableRxTermFlag | 0x10U |
Rx 終端(Termination)を無効化。 主に CCC(Common Command Code)転送で、受信終了を通知せず続けたいとき。 |
| kI3C_TransferRxAutoTermFlag | 0x20U |
Rx 自動終端を有効化。受信サイズに応じて転送を自動終了(255バイト以下)。 ※ I3C_MasterReceive では除外。 受信バイト数が事前に決まっている短い転送。 |
| kI3C_TransferStartWithBroadcastAddr | 0x40U |
ブロードキャストアドレス 0x7E で開始し、その後デバイスアドレスに切替。 複数デバイスへ一斉に CCC コマンドを送る場合。 |
6. SETDASA(Set Dynamic Address from Static Address)の処理内容
p3t1755_set_dynamic_address() では、I3C の CCC コマンドである SETDASA(Set Dynamic Address from Static Address)を使用して、静的アドレス 0x48 (P3T1755 の Slave Address ) を 動的アドレス 0x08 (SENSOR_ADDR) に変更して、ターゲットデバイスのアドレス管理を SW で実施しています。
6-1. I3C Common Command Codes(CCC)の仕様
Common Command Codes(CCC)は このように 0x7E アドレスに対して Command Code とオプションの Payload を送信するとこで、I3C 独自の処理を実施できます。
P3T1755 のデーターシートに記載されている CCC を表にまとめました。
| 分類 | コマンド名 | コード | 説明 |
|
ブロードキャスト 0x00~0x7F |
ENEC | 0x00 | Enable Events。ターゲットのイベント駆動割り込みを有効化する。 |
| RSTDAA | 0x06 | Reset Dynamic Address。すべてのスレーブがアドレスをリセットし、I3C の初期状態に戻る。 | |
| ENTDAA | 0x07 | Dynamic Address Assignment。バスに接続されたすべてのスレーブに一意の動的アドレスを割り当てる。 | |
|
ダイレクト 0x80~0xFF |
ENEC | 0x80 | Enable Events。対象スレーブのイベント駆動割り込みを有効化する。 |
| DISEC | 0x81 | Disable Events。対象スレーブのイベント駆動割り込みを無効化する。 | |
| SETDASA | 0x87 | Set Dynamic Address from Static Address。特定のスレーブに動的アドレスを割り当てる。 | |
| SETNEWDA | 0x88 | Set New Dynamic Address。任意のスレーブに新しい Dynamic Address を割り当てる。 | |
| GETPID | 0x8D | Get Provisional ID。対象スレーブの Provisional ID を取得する。 | |
| GETBCR | 0x8E | Get Bus Characteristic Register (BCR)。対象スレーブのバス特性を取得する。 | |
| GETDCR | 0x8F | Get Device Characteristic Register (DCR)。対象スレーブのデバイス特性を取得する。 | |
| GETSTATUS | 0x90 | Get Device Status。対象スレーブの現在の動作ステータスを取得する。 | |
| RSTACT | 0x9A | Target Reset Action。スレーブのリセット動作やタイミングを設定・問い合わせる。 |
6-2. SETDASA(Set Dynamic Address from Static Address)の送信方法
SETDASA は3つのステップで設定ができます。
- 0x7E に対して RSTDAA 0x06 (Reset Dynamic Address Assignment) を送付
flags = kI3C_TransferDefaultFlag で Stop を最後に送付 - 0x7E に対して SETDASA 0x87 (Set Dynamic Address from Static Address)を送付
flags = kI3C_TransferNoStopFlag で Stop を送付しない - 続けて 0x48 (P3T1755 Slave Address)、0x08 (Dynamic Address) を送付
flags = kI3C_TransferDefaultFlag で Stop を最後に送付
実際に p3t1755_set_dynamic_address() のコードに落とし込むと下記のようになります。
5章でご紹介した I3C_MasterTransferNonBlocking() の使い方を少し工夫することで実現できます。
7. [実機検証] ロジックアナライザーを使用した I3C 波形取得
実際にサンプルを動作させて I3C の波形を取得してみます。
Saleae Logic Pro8 を使用して波形を取得しています。
MikroBus に SDA SCL と GND を接続してください。
IBI 割込みを測定できるように LED Red の点灯を制御している GPIO も一緒に接続します。
7-1. 温度データ取得波形 SDR 4MHz
サンプルソフトウェアのデフォルト設定では、Open-Drain 1.5MHz、Push Pull 4MHz になっています。実際に波形を見ると、オープンドレインはデバイスアドレスの送付で使用し、プッシュプルはデータ通信で使用していることが分かります。
実際に読み出せた温度データも Printf で表示されているデータと同じになっています。
I3C は Open-Drain 4.0 MHz、Push Pull 12.5MHz まで高速化できるため、設定を変更して再度波形を取得してみます。
7-2. 温度データ取得波形 SDR 12.5MHz
Open-Drain 4.0 MHz、Push Pull 12.5MHz に変更する為に、I3C Driver 初期化処理で設定していた masterConfig の設定値を変更します。
再度波形を取得してみると、実際に周波数が高速になっているのが見て取れます。
実際に読み出せた温度データも Printf で表示されているデータと同じになっています。
I3C のメリットである高速通信が実現できていることが波形から測定できました。
7-3. SETDASA(Set Dynamic Address from Static Address)の波形
6章で説明した SETDASA の波形を確認してみると、CCC の特定アドレスである 0x7E を送付する時はオープンドレイン、コマンドや設定を送付する時はプッシュプルで送信していることが分かります。
I3C のメリットである動的アドレスをソフトウェアから自由に設定できることを確認できました。
8. [おまけ] IBI 機能の追加方法
frdmmcxn947_i3c_master_read_sensor_p3t1755_cm33_core0 には IBI 機能が含まれていません。従来のI2C の場合ターゲットデバイスから割り込み要求をする際、信号線を増やす必要がありました。一方で、I3C の場合 SCL SDA 2線で割り込み要求することができます。
IBI 機能を付与したサンプルソフトウェア i3c_master_read_sensor_p3t1755_IBI.c をコンテンツ下部に添付しております。source フォルダーの i3c_master_read_sensor_p3t1755.c と差し替えて Build ください。
8-1. IBI 機能を追加するための変更点
サンプルソフトウェアからの変更点は下記7点です。
- IBI Call Back 関数を新規作成し、masterCallback の .ibiCallback に設定
初期化処理で、I3C_MasterTransferCreateHandle() を使用して初期化します。
割込みハンドラ内では、s_ibiRequest フラグと LED の点灯を実施してます。 - IBI Call Back を発行するターゲットデバイスの情報をルールとしてI3C_MasterRegisterIBI() で登録
初期化処理で実行するようにします。 - P3T1755 の IBI 発生条件として、現在の温度を取得して +1 +2 度を閾値として設定します。
p3t1755_set_thresholds_relative() を初期化処理で実行するようにします。
- P3T1755 の Configuration Register で TM=1 に設定して Interrupt を有効にします。
初期化処理で実行するようにします。 - CCC ENEC 0x80 を使用して P3T1755 が IBI を使用すること許可します。
初期化処理で実行するようにします。 - 初期化処理で LED の点灯ができるよう設定実施します。
- ループ処理で、IBI の割り込み応答の処理を追加
8-2. IBI 発生時の波形
IBI は SCL が High の期間にターゲット側が SDA をLow に下げることで,割り込み要求を通知します。検出したコントローラが SCL を Low にして正式なSTARTを開始します。
コントローラがターゲットにアクセスする時と見分けがつきにくいですが下記2つの特徴があります。
- SDA が Low になった後、コントローラ検出時間を経て SCL が Low になるため、通常より SCL は遅れて Low になります
- ターゲットから Dynamic Address + Read を送付する為 コントローラからの通常アクセスである Dynamic Address + Write と異なる波形になります
波形を見て頂くとわかる通り、IBI 要求後、時間が空いてから IBI の検出がなされ SCL が Low になっています。コントローラーからの通常アクセスではここまで時間はかかりません。
SCL が Low になった後 Dynamic Address が見えますが、Write ではなく Read になっており IBI と分かります。
実行ログ
High の設定値を超えた時と Low の設定値を下回った時に IBI が発生しています。
I3C master read sensor data example.
Thresholds set: Low=30.06°C, High=31.06°C
Temperature:29.062500
Temperature:31.062500
[IBI] from 0x08
Temperature after :31.375000
Temperature:30.312500
[IBI] from 0x08
Temperature after IBI:29.875000
Temperature:29.687500I3C のメリットである IBI 割込みが SCL SDA の2線で実施できていることが確認できました。
まとめ - IBI サンプルソフトウェア
I3C は SCL/SDA の2線だけで、
- 最大 33.3Mbpsのデータレートを実現可能
- IBI 割込みでコントローラに通知が可能
- I3C 独自の CCC コマンドを使って動的アドレスを ソフトウェアで割り振り可能
NXP の I3C 評価環境 FRDM-MCXN947 と MCUXpresso IDE を使用することで I3C の評価や規格の深堀を早期にスタート可能ですので、是非こちらのコンテンツとサンプルソフトウェアを参考に試してみてください。
| [NXP MCX ペリフェラルガイド 2] | [NXP MCX ペリフェラルガイド 4] 準備中... | ||
| NXP マイコン初心者ガイド まとめサイト |