セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2025-08-08 現在

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()を明示的に呼び出すようにしてください。