技術コラム(第19回)I2C通信でセンサーを動かしてみました
はじめに
実際に“技術コラム(第18回)I2Cについて”に基づいて、I2C通信でセンサーを動かしてみました。
マスターデバイスとして使用する評価ボードはSTMicroelectronics社製STM32 Nucleo Board STM32F303K8、スレーブデバイスとして使用するセンサーはSENSIRION社製のデジタル温度センサー「STS21」としました。
通信速度は標準モードの100kbps、測定モードはホールドマスター※1で動かしてみました。
※1ホールドマスター
測定プロセス実行中のSCLラインがセンサーによってブロックされます。つまりセンサーが測定中は他デバイスの通信が出来なくなります。測定実行中のセンサーがSCLラインをプルダウンする事によってマスターデバイスは強制的に待機状態に入れられます。センサーの内部処理が終了すると、センサーはSCLラインを解放して通信の継続が可能になった事を外部に通知します。デジタル温度センサー「STS21」ではホールドマスターという名称であるが、I2Cでは一般的に“クロックストレッチ”と言われております。
デジタル温度センサー「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](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_01-1024x206.png)
コントロールバイトの送信
スタートコンディション発生後、マスターデバイスからスレーブデバイスにコントロールバイトを送信します。マスターデバイス側からデバイスアドレス”1001010”が送信されている事がわかります。 またコントロールバイト送信後、”Write”つまり”0”が送信されています。
![I2Cロジアナ02](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_02-1024x206.png)
ACK受信
R/Wビット送信後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。
![I2Cロジアナ03](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_03-1024x204.png)
データ送信
マスターデバイスがACKを受信後、次にデータ(コマンド)を送信します。 送信したデータは”11100011”であり、ホールドマスター設定をする為のデータ(コマンド)を送っています。
![I2Cロジアナ04](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_04-1024x206.png)
ACK受信
マスターデバイスがデータを全ビット送信完了後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。
![I2Cロジアナ05](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_05-1024x202.png)
リピートスタートコンディション発行
SCL信号が”H”レベル時にSDA信号が”H”→”L”レベルへ変化した時、通信開始を示すリピートスタートコンディションが発行されます。リピートスタートコンディションが発行された為、バスを解放せずに指定したスレーブデバイスと連続通信する事が可能です。
![I2Cロジアナ06](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_06-1024x207.png)
コントロールバイトの送信
リピートスタートコンディション発行後、マスターデバイスからスレーブデバイスにコントロールバイトを送信します。マスターデバイス側からデバイスアドレス”1001010”が送信されている事がわかります。またコントロールバイト送信後、”Read”つまり”1”が送信されています。
![I2Cロジアナ07](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_07-1024x208.png)
ACK受信
R/Wビット送信後、ACKがスレーブデバイスから出ています。これより、マスターデバイスからスレーブデバイスへの送信が正常に完了している事がわかります。ここでACKが長い時間続きます。これはホールドマスター(クロックストレッチ)が発生しており、スレーブデバイス側がSCLラインをLOWにする事でマスターデバイスを強制的に待機状態にしています。
![I2Cロジアナ08](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_08-1024x204.png)
データ受信
受信データは下記表の様に構成されています。
![STS21 データテーブル](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_table_01.png)
スレーブデバイスからACKを受信後、スレーブデバイス側からマスターデバイス側へデータが送信されます。ここではデータ01101001を受信後、ACKを受信していることがわかります。
![I2Cロジアナ09](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_09-1024x206.png)
![I2Cロジアナ10](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_10-1024x207.png)
データ11100000を受信後ACKを受信していることがわかります。
![I2Cロジアナ11](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_11-1024x210.png)
![I2Cロジアナ12](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_12-1024x207.png)
データ01010111を受信後、NOACKを受信しており、ラストデータの為、スレーブデバイスからのデータ受信はここで終了となります。
![I2Cロジアナ13](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_13-1024x207.png)
![I2Cロジアナ14](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_14-1024x205.png)
ここでスレーブデバイスから受信したデータの内容について説明します。温度Tは温度信号出力STと下記式を用いて算出する事が出来ます。
![STS21 温度算出式](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_formula_01.png)
温度出力信号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](https://www.kumikomi-kaihatu.com/wp-content/uploads/2020/12/column_019_i2c_15-1024x204.png)
終わりに
本ページで扱ったデバイス以外にも世の中にはたくさんのI2C通信デバイスがございます。組込開発.comでもI2Cを使った開発実績が御座います。また、その他様々なデバイスを扱ってきました。これまでの開発実績については以下リンクをご覧ください。
投稿者プロフィール
![M](https://www.kumikomi-kaihatu.com/wp-content/uploads/2021/10/bear-150x150.png)
- ソフトウェアの担当をしております。プログラミング言語はC言語を主としております。
最新の投稿
技術コラム2020年12月8日技術コラム(第19回)I2C通信でセンサーを動かしてみました