MSP430G2553 - SPI

提供:MochiuWiki : SUSE, EC, PCB
2024年6月5日 (水) 01:04時点におけるWiki (トーク | 投稿記録)による版 (→‎SPI通信の設定手順)
ナビゲーションに移動 検索に移動

概要

SPI (Serial Peripheral Interface) は、マスター・スレーブ方式を採用するシリアル通信インターフェースの一種であり、主にマイコンとペリフェラル (周辺機器) 間の通信に使用される。

同期式通信で、マスターがクロック信号を生成する。
全二重 (双方向) 通信が可能であり、少ないピン数で高速なデータ通信を実現することができる。

SPIの主な特徴を以下に示す。

  • マスター・スレーブ方式
    マスター・スレーブ方式を採用しており、通常1つのマスターデバイスが1つ以上のスレーブデバイスを制御する。

  • 全二重通信
    全二重通信が可能であり、マスターとスレーブが同時にデータを送受信できる。

    3本以上の信号線
    SPIは、以下に示す信号線を使用する。
    • SCLK (Serial Clock)
      マスターが生成するクロック信号
    • MOSI (Master Output, Slave Input)
      マスターからスレーブへのデータ送信線
    • MISO (Master Input, Slave Output)
      スレーブからマスターへのデータ送信線
    • SS (Slave Select)
      マスターがスレーブを選択するための信号線
  • デイジーチェーン接続
    複数のスレーブを接続する場合、デイジーチェーン接続が可能である。
    これにより、マスターは最小限の信号線でスレーブを制御することができる。

  • 高速通信
    SPIは比較的高速な通信が可能であり、一般的にはMHz単位のクロック周波数で動作する。

  • 柔軟性
    SPIはクロック極性(CPOL)とクロック位相(CPHA)を設定できるため、様々なデバイスに対応可能です。


SPIは、EEPROM、フラッシュメモリ、センサ、ディスプレイ等、多様なペリフェラルとの通信に広く使用されている。

ただし、シンプルな構成と高速性が特徴であるが、デバイス数の増加に伴い信号線が増えるため、大規模なシステムには不向きな場合がある。


MSP430G2553のSPI通信

MSP430G2553のSPIモジュール

MSP430G2553におけるSPIモジュールは、USCI_A0レジスタ (Universal Serial Communication Interface) を使用することにより、実現することができる。
MSP430マイコンでは、マスターおよびスレーブとして動作可能である。

7つの動作モードが選択できる。 (3線式SPI、4線式SPI、I2C等)

データ長は7ビット、または、8ビットが選択可能である。

MSP430G2553のSPIは、センサ、メモリ、ディスプレイ等の外部デバイスとの高速なデータ通信に適している。
適切な設定と通信プログラムにより、効率的なデータ交換が可能である。

SPI通信で使用する信号線

  • SCLK (Serial Clock)
    マスターが生成するクロック信号
  • MOSI (Master Out, Slave In)
    マスターからスレーブへのデータ送信線
  • MISO (Master In, Slave Out)
    スレーブからマスターへのデータ送信線
  • CS (Chip Select)
    スレーブを選択するための信号線


SPI通信の動作概要 =

まず、マスターがクロック信号を生成し、通信を開始する。
マスターとスレーブは、MOSIとMISOを介して同時にデータを送受信する。

次に、マスターはCSを使用して通信するスレーブを選択する。
クロックの極性 (CPOL) とフェーズ (CPHA) は設定可能である。

SPI通信の設定手順

  1. SPIに使用するピンの機能を選択する。 (UCA0SIMO、UCA0SOMI、UCA0CLK)
  2. クロック源の選択とボーレートを設定する。
  3. SPIモード (マスター / スレーブ) を選択する。
  4. データ長、クロックの極性とフェーズを設定する。
  5. 必要に応じて、割り込みを設定する。
  6. マスターの場合は、CSピンを制御する。


サンプルコード

以下の例では、MSP430G2553がマスターとしてSPI通信を行い、スレーブデバイスにデータ (0x55) を繰り返し送信している。
以下に示す手順により、SPI通信を行っている。

  1. まず、spi_init関数でSPIの初期化を行う。
    spi_init関数では、SPIに使用するピンの機能選択、クロック源の選択、ボーレートの設定、SPIモードの設定等を行う。
  2. メインループ内で、以下の処理を繰り返す。
    1. CSピンをLowにしてスレーブを選択する。
    2. spi_send_byte関数を実行して、データ (例: 0x55) をスレーブに送信する。
      spi_send_byte関数では、送信バッファが空になるまで待機して、データを送信バッファに書き込む。
    3. CSピンをHighにしてスレーブを解放する。
    4. 100[ms]の遅延を入れる。


スレーブデバイスの種類や接続方法に応じて、サンプルコードを適宜変更すること。

 #include <msp430.h>
 
 #define SPI_SCLK_PIN   BIT5  // P1.5 (UCB0CLK)
 #define SPI_MOSI_PIN   BIT7  // P1.7 (UCB0SIMO)
 #define SPI_MISO_PIN   BIT6  // P1.6 (UCB0SOMI)
 #define SPI_CS_PIN     BIT4  // P1.4 (CS)
 
 void spi_init(void);
 void spi_send_byte(unsigned char data);
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;    // ウォッチドッグタイマを停止
 
    spi_init();                  // SPIの初期化
 
    while (1) {
        P1OUT &= ~SPI_CS_PIN;    // CSをLowにしてスレーブを選択
        spi_send_byte(0x55);     // データ (例: 0x55) を送信
        P1OUT |= SPI_CS_PIN;     // CSをHighにしてスレーブを解放
        __delay_cycles(100000);  // 100[ms]の遅延
    }
 }
 
 void spi_init(void)
 {
    P1SEL  |= SPI_SCLK_PIN | SPI_MOSI_PIN | SPI_MISO_PIN;  // SPI用のピンを選択
    P1SEL2 |= SPI_SCLK_PIN | SPI_MOSI_PIN | SPI_MISO_PIN;
    P1DIR  |= SPI_CS_PIN;                                  // CSピンを出力に設定
    P1OUT  |= SPI_CS_PIN;                                  // CSをHighに設定
 
    UCB0CTL1 |= UCSWRST;                                   // UCB0をリセット
    UCB0CTL0 |= UCCKPH | UCMSB | UCMST | UCSYNC;           // MSBファースト, マスターモード, 同期モード
    UCB0CTL1 |= UCSSEL_2;                                  // SMCLK
    UCB0BR0   = 0x02;                                      // ボーレートを設定 (SMCLK / 2)
    UCB0BR1   = 0;
    UCB0CTL1 &= ~UCSWRST;                                  // UCB0をリセット解除
 }
 
 void spi_send_byte(unsigned char data)
 {
    while (!(IFG2 & UCB0TXIFG));   // 送信バッファが空になるまで待機
    UCB0TXBUF = data;              // データを送信バッファに書き込む
 }