高度なアプリケーションで I2C を使用する
Azure Sphere では、マスター モード Inter-Integrated 回線 (I2C) がサポートされています。 I2Cは、低速周辺機器をマイクロコントローラに接続するシリアルバスです。 I2C は、マスター デバイスが一連の下位デバイスを制御するマルチマスター/マルチ下位モデルを使用します。 I2C は、多くの場合、制御、電源スイッチ、センサーの設定など、マイクロコントローラーとの単純な軽量通信のみを必要とする周辺機器で使用されます。
アプリケーションは、Applibs I2C API を呼び出して I2C マスター インターフェイスで操作を実行することで、I2C 経由で周辺機器にアクセスできます。 LSM6DS3 I2C サンプルでは、MT3620 デバイスで I2C 用のハードウェアを構成し、アプリケーションで I2C を使用する方法について説明します。
I2C 要件
I2C を使用するアプリケーションには、I2C 用の適切なヘッダー ファイルを含め、I2C 設定を アプリケーション マニフェストに追加する必要があります。
すべてのアプリケーションで ターゲット ハードウェアを設定 し、対応するハードウェア定義ヘッダー ファイルを含める必要があります。
ヘッダー ファイル
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
ヘッダー ファイルを I2C_STRUCTS_VERSION
含む前にプリプロセッサ定義を宣言します。 これは、アプリケーションで使用される構造体のバージョンを指定します。
"path-to-your-target-hardware.h" をハードウェアのヘッダー ファイルへのパスに置き換えます。
アプリケーション マニフェストの設定
I2C API を使用するには、アプリケーション マニフェストに機能を I2cMaster
追加し、各 I2C マスター インターフェイスを機能に追加する必要があります。 これにより、アプリケーションはインターフェイスにアクセスできます。
Azure Sphere アプリケーション マニフェストには、アプリケーション マニフェスト の詳細が記載されています。
コードで、ハードウェア用に定義されている定数を使用して、I2C インターフェイスを識別します。 コンパイラは、アプリをビルドするときに、これらの値を生の値に変換します。
たとえば、 MT3620 リファレンス開発ボード (RDB) を対象とし、2 つの I2C マスター インターフェイスを構成するアプリケーション マニフェストからの抜粋を次に示します。
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
次の抜粋は、 Avnet MT3620 Starter Kit を対象とするアプリケーションで同じ I2C マスター インターフェイスを指定する方法を示しています。
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
I2C マスター インターフェイスを開く
I2C マスター インターフェイスで操作を実行する前に、 I2CMaster_Open 関数を呼び出して開く必要があります。
I2C マスター インターフェイスの設定を更新する
マスター インターフェイスを開いた後、設定を変更できます。
- マスター インターフェイスでの操作のバス速度を変更するには、I2CMaster_SetBusSpeedを呼び出します。
- 操作のタイムアウトを変更するには、I2CMaster_SetTimeoutを呼び出します
I2C マスター インターフェイスで読み取りおよび書き込み操作を実行する
Azure Sphere では、I2C で読み取りおよび書き込み操作を実行するためのいくつかのオプションがサポートされています。 これらのオプションはすべてブロック、同期操作です。
一方向の書き込み操作または読み取り操作では、 I2CMaster_Write または I2CMaster_Readを呼び出すことができます。 これは、I2C マスター インターフェイスで操作を実行する最も簡単な方法です。これは、1 つの操作のみを指定し、関数呼び出しに下位デバイスのアドレスが含まれているためです。
I2CMaster_WriteThenReadを呼び出して、別のトランザクションから中断することなく、単一のバス トランザクションで書き込み操作と読み取り操作を組み合わせて実行できます。
一部の POSIX インターフェイスとの相互運用性のために、POSIX read(2) 関数と write(2) 関数を呼び出して一方向トランザクションを実行できます。 read(2) または write(2) を呼び出す前に、 I2CMaster_SetDefaultTargetAddress を呼び出して下位デバイスのアドレスを設定する必要があります。
これらの関数を呼び出して、下位デバイスの存在を確認するために、0 バイトの書き込み操作を実行できます。 読み取りまたは書き込み操作が失敗した場合、アプリケーションは要求の再発行を処理する必要があります。
I2C インターフェイスを閉じる
インターフェイスを閉じるには、標準の POSIX 関数 close() を呼び出す必要があります。
MT3620 のサポート
このセクションでは、MT3620 で Azure Sphere を実行する場合にのみ適用される I2C オプションについて説明します。
MT3620チップのI2C仕様は MT3620サポートステータスに記載されています。 MT3620開発ボードのユーザーガイドでは、配線用のピンレイアウトと機能について説明しています。
Microsoft Azure Sphere SDK インストール ディレクトリの HardwareDefinitions フォルダーには、一般的な Azure Sphere 開発ボード、モジュール、チップの定義が含まれています。 これには、MT3620、MT3620 RDB、およびその他の MT3620 ハードウェアのマスター インターフェイスを定義するヘッダーファイルと JSON ファイルが含まれています。 HardwareDefinitions フォルダーの既定の場所は、 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows と /opt/azurespheresdk/HardwareDefinitions
Linux 上にあります。
- MT3620 開発ボードを構成する場合、I2C マスター インターフェイスとして任意の ISU ポートを使用できます。 I2C マスター インターフェイスとして ISU ポートを使用する場合、SPI または UART インターフェイスと同じポートを使用することはできません。
- MT3620 では、10 ビットの下位デバイス アドレスはサポートされていません。サポートされているのは 7 ビット アドレスのみです。
- MT3620 は、100 KHz、400 KHz、1 MHz のバス速度をサポートしますが、3.4 Mhz はサポートしていません。
- MT3620 では、0 バイトの I2C 読み取りはサポートされていません。
- 高レベルアプリケーションで I2C を使用する場合、I2C 周辺機器では ISU 周辺機器ブロックの SCL ピンと SDA ピンのみが使用され、他のピンは同じハイレベル アプリケーションで GPO として使用できます。 GPIO で再利用できる未使用の ISU ピンの一覧については、「 I/O 周辺機器 」を参照してください。