- 目次
- はじめに
- 用意するもの
- セットアップ
- サンプルコード「P3T1755_FRDM_MCX*_demo」の動作
- 各プロジェクトについて (サンプルコードの内容)
- P3T1755DP-ARD基板を使ってみる
- 参考資料
1. はじめに
1.1 このブログ記事について
このブログ記事はNXPアプリケーションコード・ハブで公開されているサンプルコード:P3T1755: I3C 温度センサーデモのREADME.mdファイルの要約です.
マイコン評価基板のFRDM-MCXN947,またはFRDM-MCX-A153を用いて,I3Cバスの挙動を確認できるサンプルコードが, NXPアプリケーションコード・ハブ・サイトで公開[英語]されており,そのコードを動かしてみるまでの手順を説明しています.
このブログでは,サンプルコード公開ページで説明しているインポート方法に代わり,より簡単なGitHubから直接インポートする方法を紹介します.
さらにサンプルコード動作の解説も補足します.
1.2 P3T1755: I3C温度センサーデモ
このサンプルコードはMIPI I3Cバスのデモを,NXPのマイコン:MCXシリーズとP3T1755温度センサを使用して行います.
MIPI I3Cバスは,2つの信号線で高データレートのデータ転送を行う同期式シリアルバスです.プロトコルはI²Cに似ていますが,動的アドレス割り当て(DAA),インバンド割り込み(IBI)などの拡張機能を備えています.このサンプルコードを使って,これらの機能や信号の特性を確認できます.
MIPI I3Cバスの概要は, NXPコミュニティ・ブログ:「I3Cバスの概要 ~次のシリアルバス~」や, リーフレット:「NXP システム・マネジメントI2C, I3C, SPIセレクタ・ガイド」で解説されています.
このサンプルコードのI3Cターゲットデバイスとして使われるP3T1755は,-40°Cから+125°Cの範囲で動作するデジタル温度センサです.バンドギャップ温度センサ回路とADコンバータを内蔵し,測定した温度をデジタル出力します.このデバイスはソフトウェアからレジスタを介して動作モードなどの設定や,温度データの読み出しを行います.これらのレジスタ・アクセスは2線式シリアル・バスのI3C(最大12.5MHz),およびI2C(最大3.4MHz)インターフェースによる通信で行われます.P3T1755の詳細については,データシートを参照ください.
このサンプルコードでは,マイコンの機能を抽象化するライブラリ:r01libを使用しています.このライブラリによってシリアルバスやGPIOピンの操作を簡単なAPIとして提供,シンプルなサンプルコード記述を可能にしています.このAPIはArm Mbed SDKにヒントを得ています.
r01libは,サンプルコード中のライブラリ・プロジェクト:_r01lib_frdm_mcx*として含まれています.
- すべてのソースコードは
_r01lib_frdm_mcx*/source/フォルダにあります.
- APIに関するドキュメントは
_r01lib_frdm_mcx*/r01lib_docs/フォルダにあります.
- このライブラリの一部として
r01deviceも含んでいます.r01deviceは,周辺デバイス操作を抽象化するクラスドライバ・ライブラリ集です.サンプルコードでもこのデバイス操作APIを使用しています.

2. 用意するもの
2.1 ハードウェア
- 以下のいずれか
- パーソナルコンピュータ (MCUXpresso IDEが動作するもの)
- Type-C↔︎Type-A USBケーブル (マイコン・ボードに同梱)
- [オプション:波形の確認を行う場合] オシロスコープ
- [オプション:複数のI3Cターゲット・デバイス動作を確認する場合] P3T1755DP Arduino® シールド評価ボード


2.2 ソフトウェア
3. セットアップ
3.1 ステップ 1: ハードウェアを接続
- FRDM-MCXN947またはFRDM-MCXA153ボードをUSBケーブルでPCに接続
- [オプション:波形の確認を行う場合] I3C 信号をオシロスコープに接続
- FRDM-MCXN947: SDA=J5-3, SCL=J5-4
- FRDM-MCXA153: SDA=J20, SCL=J21


3.2 ステップ 2: 必要なソフトウェアをダウンロードしてインストール
MCUXpresso IDEとSDKのインストール方法はここでは解説しません. インストール方法は,NXPのYouTubeチャンネルで公開されている動画:「PCAL9722HN-ARDを動かしてみよう」の00:23〜03:30を参考にしてください.
3.3 ステップ 3: APP-CODE-HUBからコードをダウンロードしてインポート
MCUXpresso IDE を起動し,新しいワークスペースを作成.
起動後にワークスペース選択のダイアログ「MCUXpresso IDE Launcher」が表示されない場合は,「File」メニュー→「Switch workspace」→「Other...」を選択して作成

ワークスペースに指定するフォルダは任意.ただし指定するフォルダに至るフォルダ階層(パス)の名前に日本語を含まないこと.下は「Users/tedd/dev/mcuxpresso/i3c_sample_code」フォルダをワークスペースに指定している例.

MCUXpresso IDEが新しいワークスペースで起動すると,ウェルカム・ページが表示される.この中の「Import from Application Code Hub」をクリックして,サンプルコードのインポートを開始.

Application Code Hubページが表示されたら「i3c」を検索.
出てきた「P3T1755:I3C temperature sensor demo」をクリックして選択.

表示された解説ページ上部の「GitHub link」をクリックすると,下部の「Next >」ボタンが有効になるので,ここをクリック.

インポートするブランチを選択.このサンプルコードではmainしかないので,それを選択した状態で「Next >」をクリック.

インポート方法の選択.この例では既存のプロジェクトをインポートするので,デフォルトの選択肢のまま「Next >」をクリック.

インポート先のフォルダを選択.ここでは最初に作成したワークスペース・フォルダを指定して「Next >」をクリック.

インポートするプロジェクトを選択.ここでは全てを選択した状態で「Finish」をクリック.

プロジェクトを作成したSDKバージョンについての警告が出るが,互換性には問題はないので「OK」をクリック.
これはインポートするプロジェクトの数だけ警告が出るので,その都度「OK」を押してください(このサンプルコードの場合8回).

これでインポート完了です.

3.4 - ステップ 4: プロジェクトをビルドしてデバッグ
左上部に表示される"Project Explorer"パネル内で,使用する基板に合わせてP3T1755_FRDM_MCXN947_demoまたはP3T1755_FRDM_MCXA153_demoのいずれかのプロジェクトを選択して,アイコンツールバーの"Start debugging project"アイコン (青い虫のアイコン)をクリック.

実行対象となる基板を選択.マイコン基板が1台だけ接続されている場合は以下のように表示されるので「OK」をクリック.

MCUXpresso IDE v24.12ではターゲット・ミスマッチの警告が出る.これは問題ないので「Yes」をクリック.

FRDM-MCXN947基板の場合,マイコンには2個のコアが内蔵されているため,その選択を促される.この場合はコア0を選択して「OK」をクリック (FRDM-MCXA153基板では表示されない).

デバッグセッションが開始され,main()関数の最初の部分で実行停止状態になる.
ここで黄色の四角と緑の右向き三角が組み合わさったアイコン(Resume)をクリックすると,プログラムの実行が開始されます.

MCUXpresso IDE内の下側中央部のコンソール表示部に実行結果が表示されます.

4. サンプルコード「P3T1755_FRDM_MCX*_demo」の動作
1秒ごとに測定した温度の値がMCUXpresso IDEのコンソール(中央下ペイン)に表示されます.下の例では実行開始後に1秒ごとに読み出した温度を表示します.
また基板上の点滅しているLEDの色が温度によって変化します.最初は青で点滅.プログラム実行開始時の温度より1℃上昇で緑に.2℃上昇で赤になります.
P3T1755に指で触れて温めたり,ヘアドライヤーや冷却スプレーを使って値の変化を確認してください.





IBI(インバンド割込)が発生するとコンソールに表示されます.このサンプルコードではプログラム実行開始時の温度を基準とし,その温度よりも2℃上昇した際に割込を,その後,温度が下降し"基準温度+1℃"の状態になると再び割り込みが発生するよう設定しています.これらはT_HIGH,T_LOWレジスタで設定されています.
下のコンソール表示例では実行開始から2秒経過後と5秒経過後にIBIが発生しています.
P3T1755 (Temperature sensor) I3C operation sample: getting temperature data and IBI
T_LOW / T_HIGH registers updated: 23.6875˚C / 24.6875˚C
based on current temperature: 22.6875˚C
Register dump - I3C target address:7’h08 (0x10)
- Temp (0x0): 0x16A0 ( 22.6250˚C)
- Conf (0x1): 0x 2A
- T_LOW (0x2): 0x17B0 ( 23.6875˚C)
- T_HIGH (0x3): 0x18B0 ( 24.6875˚C)
* PID (CCC:Provisioned ID) : 0x 02 36 15 2A 00 90
* BCR (CCC:Bus Characteristics Register) : 0x03
* DCR (CCC:Device Characteristics Register): 0x63 (= Temperature sensor)
Read at 0 sec: Temperature: 22.6250˚C
Read at 1 sec: Temperature: 22.6250˚C
Read at 2 sec: Temperature: 22.7500˚C
*** IBI : Got IBI from target_address: 7’h08 (0x10)
Read at 3 sec: Temperature: 26.1250˚C
Read at 4 sec: Temperature: 26.7500˚C
Read at 5 sec: Temperature: 24.8750˚C
*** IBI : Got IBI from target_address: 7’h08 (0x10)
Read at 6 sec: Temperature: 23.5625˚C
Read at 7 sec: Temperature: 23.1875˚C
IBI波形をオシロスコープでモニタできるように,マイコンがIBIイベントを受け取るとGPIOピン(FRDM-MCXN947ではJ5-3, FRDM-MCXA153ではD2)にパルスを出力するようになっています.この信号の立ち下がりエッジを,オシロスコープのトリガとして使ってください.



5. 各プロジェクトについて (サンプルコードの内容)
このサンプルには,I3Cをいくつかの方法でデモするプロジェクトが含まれています.次のリストは,プロジェクトとその機能を示しています.
2種類のマイコン基板,FRDM-MCXN947とFRDM-MCXA153のそれぞれで,同じ動作をするプロジェクトを用意しています.
どちらのマイコン用のプロジェクトも,ソースコードは同一です (IBIイベント検出出力のピン指定部分は除く).それぞれのマイコンに必要な設定とライブラリの指定は,個別のプロジェクト設定で行われています.
5.1 P3T1755_FRDM_MCX*_demo
上の第4節で解説したとおり,P3T1755から読み取った温度をコンソールに表示し,温度に応じて点滅するLEDの色を変化させます.また決められた温度に上昇,または下降した時にIBIを発生させます.I3Cターゲットのアドレス割当ては,あらかじめ指定された静的アドレスを用いて行われます(DAA_set_dynamic_address_from_static_address).
5.2 P3T1755_FRDM_MCX*_demo_DAA
複数のI3Cターゲットを扱う例です.基本的な動作は上記のプロジェクトと同じですが,I3Cターゲットのアドレス割当はDAA(Dynamic Address Assignment)で行われます.このサンプルでは最大3個までのP3T1755接続が可能です.これに加えてI²Cだけで動く(I3Cをサポートしていない)LM75B互換の温度センサ(LM75BやPCT2075など)のアドレスを0x4F(0b1001111)に設定して接続しておくと,同一バス上でのI3CとI2Cの通信のデモが可能です.
5.3 P3T1755_FRDM_MCX*_simple
上の2種類のサンプルのようなデモ的な動作を排して,I3Cの基本部分だけを示した例です.
5.4 P3T1755_FRDM_MCX*_basic_operation
P3T1755を抽象化したクラスを使わずに,I3Cの操作だけで温度を読み取る最も基本的な例です.ターゲット・デバイスへの実際の通信部分がそのまま書かれています.
int main( void )
{
PRINTF( "P3T1755 basic operation sample\r\n" );
i3c.ccc_broadcast( CCC::BROADCAST_RSTDAA, NULL, 0 ); // Reset DAA
i3c.ccc_set( CCC::DIRECT_SETDASA, static_address, dynamic_address << 1 ); // Set Dynamic Address from Static Address
while ( true )
{
i3c.write( dynamic_address, w_data, sizeof( w_data ), I3C::NO_STOP );
i3c.read( dynamic_address, r_data, sizeof( r_data ) );
PRINTF( "%f\r\n", (((int)r_data[ 0 ]) << 8 | r_data[ 1 ]) / 256.0 );
wait( 1 );
}
}
電源投入後のI3Cターゲット・デバイスはI²Cデバイスとして動作します.このコード例ではi3c.ccc_*で始まる2つのメソッド(関数)の呼び出しによって,新しいターゲット・アドレスが割り当てられます.この操作によってターゲットはI3C動作に切り替わります.
5.5 _r01lib_frdm_mcx*
これらは各マイコン向けに用意されたライブラリ・プロジェクトです.このためこのプロジェクトは単独で実行できません.
5.6 プロジェクトの機能一覧
| プロジェクト名 |
ターゲットボード |
目的 |
I3C操作 |
LED操作 |
IBI |
DAA |
| P3T1755_FRDM_MCXA153_demo |
FRDM-MCXA153 |
LED点滅色変更デモ |
◯ |
◯ |
◯ |
静的アドレスから割当 |
| P3T1755_FRDM_MCXA153_demo_DAA |
FRDM-MCXA153 |
LED点滅色変更デモ |
◯ |
◯ |
◯ |
動的割当 |
| P3T1755_FRDM_MCXA153_simple |
FRDM-MCXA153 |
P3T1755デバイスクラスの基本操作例 |
◯ |
- |
- |
静的アドレスから割当 |
| P3T1755_FRDM_MCXA153_basic_operation |
FRDM-MCXA153 |
I3C クラスの基本操作例 |
◯ |
- |
- |
静的アドレスから割当 |
| P3T1755_FRDM_MCXN947_demo |
FRDM-MCXN947 |
LED 点滅色変更のI3Cデモ |
◯ |
◯ |
◯ |
静的アドレスから割当 |
| P3T1755_FRDM_MCXN947_demo_DAA |
FRDM-MCXN947 |
LED 点滅色変更のI3Cデモ |
◯ |
◯ |
◯ |
動的割当 |
| P3T1755_FRDM_MCXN947_simple |
FRDM-MCXN947 |
P3T1755 デバイスクラスの基本操作例 |
◯ |
- |
- |
静的アドレスから割当 |
| P3T1755_FRDM_MCXN947_basic_operation |
FRDM-MCXN947 |
I3C クラスの基本操作例 |
◯ |
- |
- |
静的アドレスから割当 |
| _r01lib_frdm_mcxa153 |
FRDM-MCXA153 |
アプリケーションプロジェクトからリンクされるライブラリ |
- |
- |
- |
- |
| _r01lib_frdm_mcxn947 |
FRDM-MCXN947 |
アプリケーションプロジェクトからリンクされるライブラリ |
- |
- |
- |
- |
注意 _r01lib_* プロジェクトはライブラリです.これらのコードは単独では実行できません
6.1 FRDM-MCXN947に接続
FRDM-MCXN947にP3T1755DP-ARDを接続するには2つの方法があります.
ひとつ目の方法は,Arduinoシールドソケットを使って直接接続する方法です.これにはFRDM-MCXN947の基板裏面の半田ジャンパSJ14とSJ15を切り替えなければ(それぞれ2-3間をショート)なりません.これによりArduinoシールドソケットのD18,D19ピン(J2-18, J2-20)にI3C信号を接続できるようになります.

ふたつ目は,基板に変更は加えず基板間を4 本のワイヤで接続する方法です.

いずれの接続方法でも,ふたつの基板のP3T1755温度センサが同一I3Cバス上に接続されます.ArduinoシールドボードのP3T1755はI²Cの静的アドレス0x4Cが設定されているので,次の例のようにコードを修正して,Arduinoシールドボード上のP3T1755にアクセスできるようにします.例えば,P3T1755_FRDM_MCX*_demo/source/main.cppでは次のようにします.
#include "r01lib.h"
#include "pin_control.h"
#include "temp_sensor/P3T1755.h"
#include <time.h>
#undef P3T1755_ADDR_I2C // <-- この行を追加
#define P3T1755_ADDR_I2C 0x4C // <-- この行を追加
I3C i3c( I3C_SDA, I3C_SCL );
P3T1755 p3t1755( i3c, P3T1755_ADDR_I2C );
Arduinoシールドソケットを用いて直接接続する方法では観察できる信号波形が影響を受けるので注意が必要です.P3T1755DP-ARDのArduinoシールドピンD18,D19からP3T1755までの間に電圧レベル変換器NTS0304Eが接続されています.このため信号波形は,NTS0304Eのオープンドレイン信号の立ち上がり時間改善機能による影響を受けます.
6.2 FRDM-MCXA153に接続
FRDM-MCXN153では,P3T1755DP-ARDをArduinoシールドソケットにそのまま差し込むことができます.

次の例のようにコードを修正して,I3CをD18とD19(FRDM-MCXA153のJ2の18ピンと20ピン,P3T1755DP-ARDのJ5の9ピンと10ピン)に接続します.FRDM-MCXA153では,マイコン基板上の温度センサとP3T1755DP-ARD上の温度センサは同じバス上には接続されません.
//I3C i3c( I3C_SDA, I3C_SCL ); // この行を次の行のように変更
I3C i3c( I2C_SDA, I2C_SCL ); // 「3」を「2」に置き換える:I2C_SDA,I2C_SCL
P3T1755DP-ARD基板上では,ArduinoシールドピンD18,D19からP3T1755までの間に電圧レベル変換器NTS0304Eが接続されています.このため信号波形は,NTS0304Eのオープンドレイン信号の立ち上がり時間改善機能による影響を受けます.
7. 参考資料
変更履歴:
2025-02-17:初版
2025-02-26:日本語ウェビナー動画:『【今知っておくべき】次世代インターフェース「I3C」の基礎』のリンクを目次の前と「5. 参考資料」内に追加
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)