12,796
回編集
74行目: | 74行目: | ||
# マスターの場合は、CSピンを制御する。 | # マスターの場合は、CSピンを制御する。 | ||
<br> | <br> | ||
==== サンプルコード ==== | ==== サンプルコード : データの送信 ==== | ||
以下の例では、MSP430G2553がマスターとしてSPI通信を行い、スレーブデバイスにデータ (0x55) を繰り返し送信している。<br> | 以下の例では、MSP430G2553がマスターとしてSPI通信を行い、スレーブデバイスにデータ (0x55) を繰り返し送信している。<br> | ||
以下に示す手順により、SPI通信を行っている。<br> | 以下に示す手順により、SPI通信を行っている。<br> | ||
133行目: | 133行目: | ||
while (!(IFG2 & UCB0TXIFG)); // 送信バッファが空になるまで待機 | while (!(IFG2 & UCB0TXIFG)); // 送信バッファが空になるまで待機 | ||
UCB0TXBUF = data; // データを送信バッファに書き込む | UCB0TXBUF = data; // データを送信バッファに書き込む | ||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== サンプルコード : データの受信 (マスターデバイス側) ==== | |||
以下の例では、MSP430G2553がマスターとしてSPI通信を行い、スレーブデバイスからデータを繰り返し受信している。<br> | |||
以下に示す手順により、SPI通信を行っている。<br> | |||
<br> | |||
# まず、spi_init関数でSPIの初期化を行う。 | |||
#: spi_init関数では、SPIに使用するピンの機能選択、クロック源の選択、ボーレートの設定、SPIモードの設定等を行う。 | |||
# メインループ内で、以下の処理を繰り返す。 | |||
## CSピンをLowにしてスレーブを選択する。 | |||
## spi_receive_byte関数を実行して、スレーブからデータを受信する。 | |||
##: 受信バッファ (1[byte]) にデータが受信されるまで待機する。 | |||
##: 受信したデータを変数received_dataに格納する。 | |||
## CSピンをHighにしてスレーブを解放する。 | |||
## 100[mS]の遅延を入れる。 | |||
<br> | |||
スレーブデバイスの種類や接続方法に応じて、サンプルコードを適宜変更すること。<br> | |||
<br> | |||
<syntaxhighlight lang="c"> | |||
#include <msp430.h> | |||
// マクロは、データ送信の場合と同様のため省略 | |||
void spi_init(void); | |||
unsigned char spi_receive_byte(void); | |||
int main(void) | |||
{ | |||
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止 | |||
spi_init(); // SPIの初期化 | |||
unsigned char received_data; | |||
while (1) { | |||
P1OUT &= ~SPI_CS_PIN; // CSをLowにしてスレーブを選択 | |||
received_data = spi_receive_byte(); // データを受信 | |||
P1OUT |= SPI_CS_PIN; // CSをHighにしてスレーブを解放 | |||
// 受信したデータを処理 | |||
// ...略 | |||
__delay_cycles(100000); // 100[mS]の遅延 | |||
} | |||
} | |||
void spi_init(void) | |||
{ | |||
// データ送信の場合と同様のため省略 | |||
} | |||
unsigned char spi_receive_byte(void) | |||
{ | |||
while (!(IFG2 & UCB0RXIFG)); // 受信バッファ (1[byte]) にデータが入るまで待機 | |||
return UCB0RXBUF; // 受信バッファからデータを読み込む | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |