MPLAB Harmonyで一般的なSPI信号の送信

Send a standard SPI signal with MPLAB Harmony
 
PIC32のHarmonyフレームワークで一般的なSPIスレーブ機器にデータを送りたい場合は「DRV_SPI_BufferAddWriteRead」の関数を呼び出すだけで事足ります。もうそれしか言うことがない(とはいうものの、資料が少なく、ここまでたどり着くのは難しかったです……)ので、とっととフレームワークの作成について解説します。

前回紹介した「MCP23S17の制御プログラム」をHarmonyフレームワークに移植してみます。SPIドライバーは次のように設定します。タイマードライバーは前回の設定例と同じ値にしてください。
「Clock mode」はArduinoにおける「SPI Mode」に相当しており、標準設定ではMode0と同じ動作をします。

DRV_SPI_CLOCK_MODE_IDLE_LOW_EDGE_RISEMode0
DRV_SPI_CLOCK_MODE_IDLE_LOW_EDGE_FALLMode1
DRV_SPI_CLOCK_MODE_IDLE_HIGH_EDGE_FALLMode2
DRV_SPI_CLOCK_MODE_IDLE_HIGH_EDGE_RISEMode3


SPI2を各ピンに割り当てる例です。3バイト単位でスレーブ選択信号を切り替えたいので、RB0をSS2(OUT)ではなく、GPIO_OUTにしています。
サンプルコードを見ると、初期化設定がまるごと隠蔽されているため、とてもすっきりしたコードになっています。
app.c
#include "app.h"
#include <p32xxxx.h>

typedef unsigned char byte;

void send(byte addr, byte data)
{  
    SS2Off();  // RB0をオフにしてデータの送信を開始

    byte buffer[3], dummy[3];
    buffer[0] = 0x40;
    buffer[1] = addr;
    buffer[2] = data;
    // buffer - 送信するデータ
    // dummy  - 受信するデータ
    // 3      - 送受信するデータのサイズ(ビットモードに関わらず1バイト単位)
    DRV_SPI0_BufferAddWriteRead(buffer, dummy, 3);
    
    SS2On();   // RB0をオンにしてデータの送信を終了
}


void APP_Initialize ( void )
{ 
    SS2On();   // RB0をオンにして待機状態にさせる
    
    send(0x0A, 0x20); // IOCON[0x0A]、シーケンシャルモードを無効[SEQOP = 1]
    send(0x00, 0x00); // IODIRA[0x00]、ポートAのすべてのピンを出力モードに
    send(0x12, 0xFF); // GPIOA[0x12]、すべてのピンをオン(1)にする
    
    DRV_TMR0_Start(); // タイマーの始動。タイマードライバーは設定しましたか?
}

void APP_Tasks ( void )
{
}

int spistate = 0xFF, tcount = 0;

void OnTimer1()
{
    tcount++;
    if(tcount == 10){
        send(0x12, spistate);  // GPIOA[0x12]
        spistate = ~spistate;  // すべてのピンのオン(1)・オフ(0)を切り替える
        tcount = 0;
    }
}
2018/10/08