「MSP430G2553 - SPI」の版間の差分

73行目: 73行目:
# 必要に応じて、割り込みを設定する。
# 必要に応じて、割り込みを設定する。
# マスターの場合は、CSピンを制御する。
# マスターの場合は、CSピンを制御する。
<br>
==== サンプルコード ====
以下の例では、MSP430G2553がマスターとしてSPI通信を行い、スレーブデバイスにデータ (0x55) を繰り返し送信している。<br>
以下に示す手順により、SPI通信を行っている。<br>
<br>
# まず、spi_init関数でSPIの初期化を行う。
#: spi_init関数では、SPIに使用するピンの機能選択、クロック源の選択、ボーレートの設定、SPIモードの設定等を行う。
# メインループ内で、以下の処理を繰り返す。
## CSピンをLowにしてスレーブを選択する。
## spi_send_byte関数を実行して、データ (例: 0x55) をスレーブに送信する。
##: spi_send_byte関数では、送信バッファが空になるまで待機して、データを送信バッファに書き込む。
## CSピンをHighにしてスレーブを解放する。
## 100[ms]の遅延を入れる。
<br>
スレーブデバイスの種類や接続方法に応じて、サンプルコードを適宜変更すること。<br>
<br>
<syntaxhighlight lang="c">
#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;              // データを送信バッファに書き込む
}
</syntaxhighlight>
<br><br>
<br><br>