トップページ > 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は差し替えなくても正常動作しますね・・・(汗)




前へ   戻る