SPI
SPIバスはセンサーやメモリデバイス等の読み書きに利用されます。I2C に比べ使用するピン数が多いものの、高速な転送が必要なデバイスによく使用されます。
Samp_SPI サンプルを参考にしてください。
SPIバスを利用する場合、SPI セレクトピンを必要なデバイス分だけ確保されます。ピンは SEISEL0 のピンから順に割り当てられます。
以下に初期化と読み書きの例を挙げます。SPIでは、書き込みと読み出しを同時に行うこともできます。
センサーでのデータ取得時に一般的な例として、コマンド送信して続いて結果を得るという手続きを挙げます。
SPIの初期化(デバイス使用開始)
SPI のセレクトピンの有効化
SPI 転送1 (8ビット)、送信を目的とします。
SPI 転送2 (16ビット)、受信を目的とします。
各転送で必ずポーリング待ち(while(bAHI_SpiPollBusy());
)を行う必要があります。
主要関数
vAHI_SpiConfigure()
本関数は SPI デバイスの初期化を行い利用可能にします。SPIデバイスを解放する場合は vAHI_SpiDisable()
を呼びます。
セレクトピンは最低でも SPISEL0 がSPI専用として割り当てられます。つまり SPIを使用する場合 SPISEL0(DIO19) は他の用途には使用できません。
引数名
解説
u8SalveEnable
有効にするチップセレクトピンを指定する。0
を指定すると SPISEL0を予約、1
を指定すると SPISEL0,1 を予約し、2
を指定すると SPISEL0,1,2 を予約します。
bLsbFirst
TRUE
ならLSB(下位ビット)からデータが始まる
bPolarity
TRUE
ならクロックを反転する
bPhase
TRUE
なら立ち下がりエッジを用いる
u8ClockDiviser
クロック周波数の指定。0..63 を指定する。0 では 16MHz 駆動し、それ以外は 2*u8ClockDiviser
で分周する。
bInterruptEnable
SPI転送終了時に割り込みを発生させる。※ サンプル等では使用していません。
bAutoSlaveSelect
TRUE
の場合セレクトピンの制御をSPI転送中のみの自動制御とする。FALSE
の場合 vAHI_SpiSelect()
の呼び出しタイミングで設定されます。
bLsbFirst
, bPolarity
, bPhase
, u8ClockDiviser
は接続するデバイスのデータシートより値を決めてください。
SPI Mode と bPolarity
, bPhase
の関係
bPolarity
, bPhase
の関係SPI Mode
bPolarity
bPhase
0
FALSE
FALSE
1
FALSE
TRUE
2
TRUE
FALSE
3
TRUE
TRUE
vAHI_SpiSelect()
セレクトピンを有効化します。
引数名
解説
u8SalveMask
1
: SPISEL0, 2
:SPISEL1, 4
:SPISEL3, 0
: セレクトを解除します。
vAHI_SpiStop()
は vAHI_SpiSelect(0)
の呼び出しと同じです。
vAHI_SpiStartTransfer()
SPI転送を開始します。本関数呼び出し直後に転送を開始しますが、転送の終了を待たずに制御を返します。後述の bAHI_SpiPollBusy()
により転送終了を待ちます。
引数名
解説
u8CharLen
転送長を指定する。0..31
が指定でき、指定した数 + 1 ビットの転送を行う。例えば 16 ビットの転送であれば 15
を指定する。
u32Out
出力するビット列。32bitに満たない転送の場合、データは LSB 側に右詰めする。(8bit の場合、bit0 〜 bit7 に格納する)
bAHI_SpiPollBusy()
SPI 転送のポーリング待ちを行う。TRUE
の間は SPI の転送中を意味します。
u32AHI_SpiReadTransfer32()
SPI転送が終了した後に呼び出し、転送時の受信データ (SPIMISO) を読み出します。読み出したデータは LSB 側に右詰めされています。
最終更新