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_RISE | Mode0 |
DRV_SPI_CLOCK_MODE_IDLE_LOW_EDGE_FALL | Mode1 |
DRV_SPI_CLOCK_MODE_IDLE_HIGH_EDGE_FALL | Mode2 |
DRV_SPI_CLOCK_MODE_IDLE_HIGH_EDGE_RISE | Mode3 |
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