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