技術コラム(第19回)I2C通信でセンサーを動かしてみました

はじめに

実際に“技術コラム(第18回)I2Cについて”に基づいて、I2C通信でセンサーを動かしてみました。
マスターデバイスとして使用する評価ボードはSTMicroelectronics社製STM32 Nucleo Board STM32F303K8、スレーブデバイスとして使用するセンサーはSENSIRION社製のデジタル温度センサー「STS21」としました。
通信速度は標準モードの100kbps、測定モードはホールドマスター※1で動かしてみました。

※1ホールドマスター
測定プロセス実行中のSCLラインがセンサーによってブロックされます。つまりセンサーが測定中は他デバイスの通信が出来なくなります。測定実行中のセンサーがSCLラインをプルダウンする事によってマスターデバイスは強制的に待機状態に入れられます。センサーの内部処理が終了すると、センサーはSCLラインを解放して通信の継続が可能になった事を外部に通知します。デジタル温度センサー「STS21」ではホールドマスターという名称であるが、I2Cでは一般的に“クロックストレッチ”と言われております。

STMicroelectronics社製 STM32 Nucleo Board STM32F303K8 評価ボード


STMicroelectronics社製 STM32 Nucleo Board STM32F303K8 評価ボード
SENSIRION社製 デジタル温度センサー STS21



SENSIRION社製 デジタル温度センサー STS21

デジタル温度センサー「STS21」の仕様は以下のようになっております。

電源電圧2.1V~3.6V
動作温度補償範囲-40℃~125℃
最大通信速度400kbps
I2Cデバイスアドレス1001010
SDA方向ビットWrite:0
Read:1

測定モードを設定する為の送信コマンドは下記のようになっております。

コマンド注記コード
T 測定トリガホールドマスター11100011
T 測定トリガ非ホールドマスター11110011

I2C通信解説

スタートコンディション発行

SCL信号が”H”レベル時にSDA信号が”H”→”L”レベルへ変化した時、通信開始を示すスタートコンディションが発行されます。

I2Cロジアナ01

コントロールバイトの送信

スタートコンディション発生後、マスターデバイスからスレーブデバイスにコントロールバイトを送信します。マスターデバイス側からデバイスアドレス”1001010”が送信されている事がわかります。 またコントロールバイト送信後、”Write”つまり”0”が送信されています。

I2Cロジアナ02

ACK受信

R/Wビット送信後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。

I2Cロジアナ03

データ送信

マスターデバイスがACKを受信後、次にデータ(コマンド)を送信します。 送信したデータは”11100011”であり、ホールドマスター設定をする為のデータ(コマンド)を送っています。

I2Cロジアナ04

ACK受信

マスターデバイスがデータを全ビット送信完了後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。 

I2Cロジアナ05

リピートスタートコンディション発行

SCL信号が”H”レベル時にSDA信号が”H”→”L”レベルへ変化した時、通信開始を示すリピートスタートコンディションが発行されます。リピートスタートコンディションが発行された為、バスを解放せずに指定したスレーブデバイスと連続通信する事が可能です。

I2Cロジアナ06

コントロールバイトの送信

リピートスタートコンディション発行後、マスターデバイスからスレーブデバイスにコントロールバイトを送信します。マスターデバイス側からデバイスアドレス”1001010”が送信されている事がわかります。またコントロールバイト送信後、”Read”つまり”1”が送信されています。

I2Cロジアナ07

ACK受信

R/Wビット送信後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。ここでACKが長い時間続きます。これはホールドマスター(クロックストレッチ)が発生しており、スレーブデバイス側がSCLラインをLOWにする事でマスターデバイスを強制的に待機状態にしています。

I2Cロジアナ08

データ受信

受信データは下記表の様に構成されています。

STS21 データテーブル

スレーブデバイスからACKを受信後、スレーブデバイス側からマスターデバイス側へデータが送信されます。ここではデータ01101001を受信後、ACKを受信していることがわかります。

I2Cロジアナ09
I2Cロジアナ10

データ11100000を受信後ACKを受信していることがわかります。

I2Cロジアナ11
I2Cロジアナ12

データ01010111を受信後、NOACKを受信しており、ラストデータの為、スレーブデバイスからのデータ受信はここで終了となります。

I2Cロジアナ13
I2Cロジアナ14

ここでスレーブデバイスから受信したデータの内容について説明します。温度Tは温度信号出力STと下記式を用いて算出する事が出来ます。

STS21 温度算出式

温度出力信号STは16ビットのデータとして扱われ、Data(MSB)の8ビットとData(LSB)6ビットと末尾2ビットは00をセットした16ビットです。上記式と、今回取得した温度信号出力STより、温度Tは約25.82℃と算出する事が出来ます。

※その他ビットの説明
Statusビットのbit1は測定タイプを示しており、0であれば温度である事を示しております。Statusビットのbit0は割り当てられておりません。 Checksumビットは信号エラー検出用のチェックサムデータ(CRC-8)が出力されます。

スタートコンディション発行

SCL信号が”H”レベル時にSDA信号が”L”→”H”レベルへ変化した時、通信終了を示すストップコンディションが発行されます。ストップコンディション発行により通信が終了して、バスが解放されます。

I2Cロジアナ15

終わりに

本ページで扱ったデバイス以外にも世の中にはたくさんのI2C通信デバイスがございます。組込開発.comでもI2Cを使った開発実績が御座います。また、その他様々なデバイスを扱ってきました。これまでの開発実績については以下リンクをご覧ください。

投稿者プロフィール

M
M
ソフトウェアの担当をしております。プログラミング言語はC言語を主としております。