トップページ > dsPIC入門 > dsPICでSPI通信(4)
//********************************************************************
//SPIテスト(スレーブ) @dsPIC30F4012
//********************************************************************
//********************************************************************
//ヘッダファイル
#include "p30f4012.h"
#include "uart.h"
#include "i2c.h"
#include "spi.h"
//********************************************************************
//コンフィギュレーション
_FOSC(CSW_FSCM_OFF & XT_PLL8); //10MHzセラロックを使っているのでクロックは80MHz。
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);
//********************************************************************
//UART用のコンフィグ
unsigned int UARTconfig1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT
& UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD ;
unsigned int UARTconfig2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR
& UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
//********************************************************************
//SPIの設定パラメータ(スレーブ、送信有り、クロックは最も遅く設定)
unsigned int spi_config1 = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & ENABLE_SDO_PIN &
SPI_MODE16_OFF & SPI_SMP_ON & SPI_CKE_OFF & MASTER_ENABLE_OFF &
CLK_POL_ACTIVE_LOW & PRI_PRESCAL_64_1 & SEC_PRESCAL_8_1 ;
unsigned int spi_config2 = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR;
//********************************************************************
//メイン関数
int main(void)
{
//for文用変数
unsigned long i;
//受信データを格納する変数
unsigned char temp;
//UART初期設定
//速度は115kbpsとします(80MHzクロックでは実用的に最も速い設定)
OpenUART1(UARTconfig1,UARTconfig2,10);
//SPI初期設定
OpenSPI1(spi_config1,spi_config2);
//-------------------------------------------------------------------
//最初に、UARTの動作確認のために文字列送信
putsUART1("START\n\r");
while(BusyUART1());
//受信した文字をそのままUARTで送信するループ
while(1)
{
//データ受信まで待つ
while(!DataRdySPI1());
//データが来たら、tempに保存。
temp = ReadSPI1();
//受信した1文字をそのままUARTで送信
WriteUART1(temp);
while(BusyUART1());
//もしcが来たならば・・・
if(temp == 'c')
{
//UARTでメッセージを送信
putsUART1("\n\r");
putsUART1(" received 'c'...\n\r");
//while(1)ループを抜ける
break;
}
}
//-------------------------------------------------------------------
//相手基板の準備が整うまで、十分待つ。
for(i=0;i<10000;i++);
//'d'を送信します。
WriteSPI1('d');
wait();
//UARTでメッセージを送信
putsUART1("'d' data sended...\n\r");
while(BusyUART1());
//ここでストップ
while(1);
}
//********************************************************************
//送信待ち関数(ただの時間稼ぎ・・・)
void wait(void)
{
unsigned long t;
for(t=0;t<10000;t++)
{
}
}
//********************************************************************
初期設定やSPI用の関数については、ほとんど前ページで解説した通りです。ただし、初期設定のコンフィグで違うところが1箇所だけあります。 スレーブなので、“MASTER_ENABLE_ON”を“MASTER_ENABLE_OFF”にします。・・・これだけ。
それでは、マスターとスレーブのプログラムをコンパイルしてdsPICへ書き込み、回路側の準備を整えます。 デバッグにはハイパーターミナルを使用するので、そっちの設定もしておきます。例のごとく通信速度は 115200bpsです。
上のように表示されて、マスター側のLEDが全て点灯すれば成功です。 上のものは自作のハイパーターミナルですが、普通のものでも同様です。
右側のマスター側の緑色LEDが全て光っています。PICkit2は差し替えなくても正常動作しますね・・・(汗)