SPI関連のAHI関数と解説
SPI
SPI関連のAHI互換関数の実装です。
- この実装は完全な互換性を保つことを目的とはしていません。
- 本書記述時点で判明している留意点などを記載します。
- 内部の実装は予告なく変更される場合があります。
- 解説中のパラメータについても、留意が必要な部分のみ記述しています。省略部分は、原典の AHI ライブラリマニュアルを参照ください。
SPIの対応については、以下のピンを利用します。
信号名 | ピン名(PIO番号) | 解説 |
---|---|---|
SCK | SPLCLK=DIO11(PIO0) | クロック信号 このピンはSPICLK, DIO11共用になっています |
MOSI | DIO18(PIO2) | SPIMOSIです。TWELITE 側が出力、外部SPIデバイス側が入力です。 |
MISO | SPIMISO(PIO5) | SPIMISOです。TWELITE 側が入力、外部SPIデバイス側が出力です。 |
SEL0 | DIO19(PIO3) | |
SEL1 | DIO0(PIO16) | |
SEL2 | DIO1(PIO17) |
副割り当てのピン (vAHI_SpiSetLocation_MW(FALSE)
により設定)を用いた場合は、以下となります。
信号名 | ピン名(PIO番号) | 解説 |
---|---|---|
SCK | ADC1(PIO15) | クロック信号 |
MOSI | DIO1(PIO17) | SPIMOSIです。TWELITE 側が出力、外部SPIデバイス側が入力です。 |
MISO | DIO2(PIO18) | SPIMISOです。TWELITE 側が入力、外部SPIデバイス側が出力です。 |
SEL0 | DIO0(PIO16) | |
SEL1 | DIO8=ADC2(PIO14) | このピンはDIO8, ADC2共用になっています |
SEL2 | DIO12(PIO13) |
SPIはハードウェアの機能を用い動作するため、ピンの振る舞い(特に転送していないときの HIGH/LOW の状態など)には一部違いが出ます。
- 実装は、ブロッキング転送を用いています。コードの互換性を維持するため、転送APIの直後にポーリング待ちコードを含めるようにしてください(
bAHI_SpiPollBusy()
,vAHI_SpiWaitBusy()
)。
vAHI_SpiConfigure()
void vAHI_SpiConfigure(
uint8 u8SlaveEnable,
bool_t bLsbFirst,
bool_t bPolarity,
bool_t bPhase,
uint8 u8ClockDivider,
bool_t bInterruptEnable,
bool_t bAutoSlaveSelect);
SPIの初期化を行います。
bInterruptEnable
には対応してません。パラメータは無視されます。
vAHI_SpiDisable()
void vAHI_SpiDisable(void);
SPIの利用停止をします。
vAHI_SpiSelect()
void vAHI_SpiSelect(
uint8 u8SlaveMask)
SPIのSELECTピンを選択します。
vAHI_SpiConfigure()
のbAutoSlaveSelect
がTRUE設定の場合は、制御対象のピンを指定します。この呼出時点ではピンの制御は行いません。vAHI_SpiConfigure()
のbAutoSlaveSelect
がFALSE設定の場合は、SELECTピンの制御(対象品のみをLOW,それ以外はHIGH) します。
vAHI_SpiStop()
PUBLIC void vAHI_SpiStop(void);
SELECTピンを解除します。vAHI_SpiSelect(0)
と同じ処理です。
vAHI_SpiStartTransfer()
void vAHI_SpiStartTransfer(
uint8 u8CharLen,
uint32 u32Out);
void vAHI_SpiStartTransfer32(uint32 u32Out)
void vAHI_SpiStartTransfer16(uint16 u16Out)
void vAHI_SpiStartTransfer8(uint8 u8Out)
SPI転送を実行します。
- この処理はブロッキングで実行されます。
- 8の倍数ビット数でない場合は、転送が2~3回に分割されます。
- 32bit指定時は、エンディアンの違いによるメモリ上のバイト配置にかかわらず、数値の上位のバイトから下位のバイトの順に送信されます。結果として、BLUEとGOLDでは転送波形が同じになります。
AHI_SpiReadTransfer
static inline uint32 u32AHI_SpiReadTransfer32(void);
static inline uint16 u16AHI_SpiReadTransfer16(void);
static inline uint8 u8AHI_SpiReadTransfer8(void);
転送完了後に呼び出し、読み出した値を返す。
bAHI_SpiPollBusy()
bool_t bAHI_SpiPollBusy(void);
inline void vAHI_SpiWaitBusy(void) { while(bAHI_SpiPollBusy()); }
常に FALSE を返します。転送APIがブロッキング転送を行うためです。
bAHI_SpiTransferBlocking_MW()
bool_t bAHI_SpiTransferBlocking_MW(
uint8 *au8tx,
uint8 *au8rx,
uint8 u8len);
バイト単位の転送を行います。au8tx
が送信データの配列、au8rx
が受信データの配列、u8len
が転送バイト数です。
- 配列の先頭から順に転送されるため、LSBから順に転送する場合は、バイト順も LSB 側のバイトを先に格納しておく必要があります。受信データも同様です。
vAHI_SpiWaitBusy()
void vAHI_SpiWaitBusy(void);
速やかに return します。
vAHI_SpiSetLocation_MW()
void vAHI_SpiSetLocation_MW(bool_t bLocation);
使用するピンの組み合わせを変更します。既定のピンを用いる場合は本関数の呼び出しは不要ですが、副割り当てピンを用いる場合はvAHI_SpiConfigure()
関数呼び出し前に本関数を呼び出します。
bLocation == FALSE
(デフォルト)→既定のピン割り当てを用います。bLocation == TRUE
→副割り当てピンを用います。
その他
転送の分割
vAHI_SpiStartTransfer()
では8bitの整数倍(8,16,24,32bit)以外の転送を行う場合は、内部的に転送を2分割して行います。そのため、1回目と2回目の転送の間、波形は一定時間保持されることになります。
スリープ復帰時の振る舞い
RAM保持スリープ直前にSPIバスが初期化済みである場合は、復帰時に初期化状態を復元します。RAM非保持スリープの場合は、通常の始動時のDIO初期化が行われます。
BLUE/REDとのコード互換性を高めたい場合はスリープ前に vAHI_SpiDisable()
を明示的に呼び出すようにしてください。