/      English

SPI関連のAHI関数と解説

TWENETライブラリ、SPI関連のAHI関数と解説
TWENETライブラリ、SPI関連のAHI関数と解説です。

SPI

SPI関連のAHI互換関数の実装です。

SPIの対応については、以下のピンを利用します。

信号名ピン名(PIO番号)解説
SCKSPLCLK=DIO11(PIO0)クロック信号
このピンはSPICLK, DIO11共用になっています
MOSIDIO18(PIO2)SPIMOSIです。TWELITE 側が出力、外部SPIデバイス側が入力です。
MISOSPIMISO(PIO5)SPIMISOです。TWELITE 側が入力、外部SPIデバイス側が出力です。
SEL0DIO19(PIO3)
SEL1DIO0(PIO16)
SEL2DIO1(PIO17)

副割り当てのピン (vAHI_SpiSetLocation_MW(FALSE)により設定)を用いた場合は、以下となります。

信号名ピン名(PIO番号)解説
SCKADC1(PIO15)クロック信号
MOSIDIO1(PIO17)SPIMOSIです。TWELITE 側が出力、外部SPIデバイス側が入力です。
MISODIO2(PIO18)SPIMISOです。TWELITE 側が入力、外部SPIデバイス側が出力です。
SEL0DIO0(PIO16)
SEL1DIO8=ADC2(PIO14)このピンはDIO8, ADC2共用になっています
SEL2DIO12(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()を明示的に呼び出すようにしてください。