Comment on page
SPI
SPIバスはセンサーやメモリデバイス等の読み書きに利用されます。I2C に比べ使用するピン数が多いものの、高速な転送が必要なデバイスによく使用されます。
Samp_SPI サンプルを参考にしてください。
SPIバスを利用する場合、SPI セレクトピンを必要なデバイス分だけ確保されます。ピンは SEISEL0 のピンから順に割り当てられます。
以下に初期化と読み書きの例を挙げます。SPIでは、書き込みと読み出しを同時に行うこともできます。
センサーでのデータ取得時に一般的な例として、コマンド送信して続いて結果を得るという手続きを挙げます。
- 1.SPIの初期化(デバイス使用開始)
- 2.SPI のセレクトピンの有効化
- 3.SPI 転送1 (8ビット)、送信を目的とします。
- 4.SPI 転送2 (16ビット)、受信を目的とします。
各転送で必ずポーリング待ち(
while(bAHI_SpiPollBusy());
)を行う必要があります。#define SLAVE_ENABLE2 (1) // DIO19とDIO0を用いる
#define CS_DIO19 (0x01) // SPISEL0:DIO19に接続したものを使う
#define CS_DIO0 (0x02) // SPISEL1:DIO0に接続したものを使う
...
// SPI の初期化
vAHI_SpiConfigure(SLAVE_ENABLE2, // SPISEL0,1 の2つを利用する
E_AHI_SPIM_MSB_FIRST,
TRUE,
TRUE,
1,
E_AHI_SPIM_INT_DISABLE,
E_AHI_SPIM_AUTOSLAVE_DSABL);
...
// 転送1(8bitの書き出し)
vAHI_SpiSelect(CS_DIO0); // SPISEL1 を有効にする
vAHI_SpiStartTransfer(
7, // 7+1=8 bit の転送
0x00000012L ); // 0x12 を送信
while(bAHI_SpiPollBusy()); // 読み書きのポーリング待ち
//uint8 u8val = u8AHI_SpiReadTransfer8();
// SPIMISO の入力データを読み出しは可能。
// この例では、u8val は使用しない。
// 必要なら少し時間を置く。
vWait(100);
// 転送2 (16bitの読み込み)
vAHI_SpiStartTransfer(
15, // 15+1=16 bit の転送
0x00000000L ); // ダミーの送信データ。
while(bAHI_SpiPollBusy()); // 読み書きのポーリング待ち。
uint16 u16val = u16AHI_SpiReadTransfer16();
// 読み出した 16bit データ。
// セレクトを解除する
vAHI_SpiStop();
...
// SPIデバイスの利用を中止する。
vAHI_SpiDisable();