Web制作、Web開発の歩き方

STM32入門(組み込み開発)

■第5話:実践的な周辺機能2 -I2C、SPI-

(最終更新日:2025.01.22)

C言語のイメージ
この記事は6分で読めます!
(絵が小さい場合はスマホを横に)

「センサーから効率的にデータを取得しよう!」

SPI(Serial Peripheral Interface)とI2C(Inter-Integrated Circuit)は、 マイコンと外部デバイス間のシリアル通信を実現する基本的かつ重要なプロトコルだ。 SPIは高速かつシンプルな構造を持ち、ディスプレイやメモリなどで利用される。 一方、I2Cは少ないピン数で複数のデバイスと通信可能で、センサーや小型デバイスに適している。 両プロトコルの理解と適切な活用は、組み込みシステムの設計において不可欠だ。


1.I2Cの基本

I2C(Inter-Integrated Circuit)は、マスターデバイスと複数のスレーブデバイス間でデータ通信を行うためのシリアル通信プロトコルだ。 2本の信号線(SCL: クロックライン、SDA: データライン)を使い、短距離での低速通信に適している。 I2Cを使った外部デバイス(例えば温度センサー)との通信について詳しく説明する。

■I2Cの特徴
I2Cの特徴として、マスターとスレーブの関係がある。 マスターデバイスが通信を制御し(マイコン側)、スレーブデバイスはマスターからの指令に従う(例:センサー)。 また、I2Cは2本の信号線からなり、マスターが制御してクロック信号を送るSCL(Serial Clock Line)と、 双方向からデータ通信できるSDA(Serial Data Line)からなる。

この時、スレーブデバイスは一意のアドレスを持ち、マスターは通信時にこのアドレスを指定して、スレーブを選択する。 そして、SDAとSCLはプルアップ抵抗でVccに接続され、ラインは共有される。

■通信の流れ
スタートの条件としては、マスターがSCLをHighに保ちながらSDAをHigh→Lowに遷移させることで通信を開始する。 そして、マスターがスレーブの7ビットアドレスと1ビットの読み取り/書き込みフラグ(R/Wビット)を送信する。 それから、スレーブがアドレスを認識すると、ACK(Acknowledge)信号を送る。この時、SDAラインをLowにして応答する。

そして、マスターまたはスレーブがデータを送信し、1バイトごとにACKを確認する。 マスターからスレーブの送信が書き込み、スレーブからマスターへの送信が読み込みにあたる。 最後に、マスターがSCLをHighに保ちながらSDAをLow→Highに遷移させることで通信を終了する。

通信を行う

2.外部デバイスとの通信

■必要な準備
マイコン(マスター)のI2Cピン(SCL, SDA)をセンサー(スレーブ)に接続し、 各ラインに適切なプルアップ抵抗(一般的に4.7kΩ)を追加し、電源とGNDを接続する。 また、センサーのアドレス(例: 0x48)を確認し、動作モード、コマンドセット、データ形式を理解したうえで使う。

■ファームウェアの記述
ファームウェア上では、STM32のHALライブラリを使用し、I2C通信を有効化する(例:HAL_I2C_Init(&hi2c1);)。 センサーにコマンドを送り、書き込み操作をする。例えば、温度取得を要求する(例:HAL_I2C_Master_Transmit)。 センサーからデータを受信し、読み取り操作を行う。例えば、温度の値を取得する(例:HAL_I2C_Master_Receive)。 通信エラーやタイムアウトに対応した、エラーハンドリングを行う。

■実例(温度センサー)
実例として、温度センサー(LM75)を用いた場合を取り上げる。 アドレスは0x48とする。読み取り手順としては、以下の通りとなる。

    読み取り手順
  1. マスターがスタート条件を発生
  2. センサーのアドレス(0x48)+ 読み取りビットを送信
  3. センサーから温度データ(2バイト)を受信
  4. ストップ条件を発生

HALを用いたコードの例

■トラブルシューティング
通信ができないなどのトラブルでは、配線ミスやプルアップ抵抗の有無を確認し、 データが正しくない場合は、データシートのレジスタ設定やデータフォーマットを再確認することが重要である。 また、エラー発生時はHALライブラリの戻り値を確認する(HAL_ERROR)。

I2C通信はシンプルだが、デバイスの仕様理解が重要になる。 センサーごとに異なる設定や手順があるため、データシートの活用が不可欠だ。

3.SPIの動作原理

SPI(Serial Peripheral Interface)は、マスターとスレーブ間で高速データ通信を行うためのシリアル通信プロトコルだ。 シンプルな構造と柔軟性により、ディスプレイ、フラッシュメモリ、センサーなど多くのデバイスで利用されている。 ここでは、SPI通信の動作原理やディスプレイ、フラッシュメモリとの接続例について詳しく説明する。

■特徴
SPIはマスターと1つのスレーブ間でデータ通信を行うプロトコルである。 特徴としては、フルデュプレックス通信で、高速通信、最小4本の信号線を使用する。 複数スレーブにおいては、スレーブセレクト信号で、マスターが通信するスレーブを選択する。

■信号線
必須の信号線としてSCLK(Serial Clock:マスターが生成するクロック信号)、 MOSI(Master Out, Slave In:マスターがスレーブにデータを送るライン)、 MISO(Master In, Slave Out:スレーブがマスターにデータを送るライン)、 SS(Slave Select:対象スレーブを選択するための信号。Lowアクティブ)からなる。

その他の信号線として、GND(共通の基準電圧)、Vcc(スレーブデバイスに必要な電源供給)がある。

■動作モード(クロック設定)
SPIは4つのモード(Mode 0~3)を持ち、クロック極性(CPOL)と位相(CPHA)の組み合わせで決定される。 マスターとスレーブの設定が一致している必要がある。

表:動作モード

Mode CPOL CPHA 説明
Mode 0 0 0 クロックの立ち上がりでデータをサンプリング
Mode 1 0 1 クロックの立ち下がりでデータをサンプリング
Mode 2 1 0 クロックの立ち下がりでデータをサンプリング
Mode 3 1 1 クロックの立ち上がりでデータをサンプリング
4.ディスプレイやフラッシュメモリとの接続

ここでは、SPIの活用例として、ディスプレイやフラッシュメモリとの接続を挙げる。

LCDディスプレイ

■ディスプレイとの接続例
例として、OLEDディスプレイ(SSD1306)を取り上げる。 SPIを使ってOLEDディスプレイに画像やテキストを表示することができる。 まずは、準備としてデータシートでSPI設定(Mode、クロック速度)を確認する。 そして、ディスプレイのピン(SCLK, MOSI, SS, DC, RST)をマイコンに接続する。 DCはデータ/コマンド切り替えを意味し、RSTはリセット信号を意味する。

まずは、準備としてディスプレイの電源を投入し、RST(リセット)ピンを操作して初期状態に設定する。 次に、DC(データ/コマンド)ピンをLowにしてコマンドを送信を行う。 DCピンをHighにして画面データを送信する。これにより、ディスプレイに描画内容が反映される。 実装例は以下の通りになる。HALを使うことで、簡単に実装することが可能である。

複数チャネルのシーケンス動作

■フラッシュメモリとの接続例
フラッシュメモリを使ってデータの書き込みと読み取りを行う。 例として、W25Q32を挙げる。必要な準備としては、SPI設定(クロック速度、Mode)を確認し、 メモリのコマンドセット(例: 書き込み、読み取り)をデータシートで確認する。

フラッシュメモリ

動作手順として、まず、初期化してSPIを有効化する。 そして、書き込み、読み取り、消去などの操作をコマンドで指定する。 更に、メモリの特定のアドレスにデータを書き込み、書き込まれたデータをアドレスから読み取りを行う。 実装例を以下に挙げる。

Flash_WriteData関数の最初の部分で、書き込みを行うためのコマンド、アドレスを指定し、 Frash_WriteEnable関数の部分で、書き込みを許可する操作を行い、最後にHALを使って書き込みを行っている。 Flash_ReadData関数では、読み込みを行うためのコマンド、アドレスを指定し、HALを使って読み込みを行っている。 このようなプログラムを書くことで、フラッシュメモリの読み書きが可能になる。

フラッシュメモリへの書き込みと読み取り

まとめると、SPIは高速かつシンプルな通信プロトコルで、ディスプレイやフラッシュメモリなど多様なデバイスに対応可能である。 デバイスごとに異なるコマンドセットやタイミング仕様があるため、データシートの確認は必須である。 マイコン側では、HALライブラリやレジスタを使用して、効率的な制御を実現できる。 SPIを用いることで、ディスプレイやメモリデバイスなどの様々なペリフェラルを簡単に制御できるようになる。

5.まとめ

SPI(Serial Peripheral Interface)とI2C(Inter-Integrated Circuit)は、 マイコンと外部デバイス間で広く利用されるシリアル通信プロトコルだ。 SPIはクロック(SCLK)、データ(MOSI, MISO)、スレーブセレクト(SS)の4線式で、フルデュプレックス通信が可能で高速だ。 ディスプレイやフラッシュメモリで使用され、コマンド送信とデータ読み書きを制御する。 一方、I2Cはクロック(SCL)とデータ(SDA)の2線式で、複数スレーブと通信可能だ。 デバイスアドレス指定やACK応答を用い、センサーなどで活用する。 両者はクロック設定や通信モードが重要で、デバイスごとの仕様やコマンドセットを基に適切に初期化し制御することが成功の鍵だ。

▼参考図書、サイト

STM32マイコン公式日本語サイト  STマイクロエレクトロニクス
 「WindowsではじめるSTM32」 インプレスR&D 山本 小鉄