Skip to content

6. SPI

SPI通信の解説についてはこちらをご覧ください

目標

  • SPI通信の使い方を習得する

CubeMXの設定

ConnectivityからSPI2を選択し,Masterとする場合はFull-Duplex Masterとし,Slaveとする場合はFull-Duplex Slaveとする.

期待される動作

マイコンが動作開始すると同時にLEDが1秒間点灯する.その後,書き込まれているプログラムがMasterかSlaveかをシリアルで送信する.
Masterモードではuint16_t型の変数をカウントアップしながらSPIで送信する.また,シリアルでも値が送信される.
SlaveモードではSPIで受信した値をシリアルで送信する.
シリアルモニタで値を確認し,送信側と受信側で同じ値が表示されていれば正常である.

サンプルコード書き込み時の注意

#define MASTERもしくは#define SLAVEのどちらかをコメントアウトしてください.
#define SLAVEをコメントアウトした場合はSPIがMasterモードでデータを送信します.
#define MASTERをコメントアウトした場合はSPIがSlaveモードでデータを受信します.

コード解説

今回はサンプルコードで使用していないものであっても,知っているべき関数は示している.

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

SPI通信でデータを送信するために使用する.

HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

SPI通信でデータを受信するために使用する.

Source Code

#include <string>
#include <spi.h>
#include <usart.h>
#include "WRAPPER.hpp"

#define MASTER
//#define SLAVE

uint16_t number = 0;

void init(void){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    HAL_Delay(1000);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
#ifdef MASTER
    std::string str = "this is master\n";
#endif
#ifdef SLAVE
    std::string str = "this is slave\n";
#endif
    HAL_UART_Transmit(&huart2, (uint8_t *)str.c_str(), str.length(), 100);
}

void loop(void){
#ifdef MASTER
    std::string str = "transmit : " + std::to_string(number) + "\n";
    HAL_SPI_Transmit(&hspi2, (uint8_t*)&number, sizeof(number), 100);
    HAL_Delay(500);
    number += 1;
#endif
#ifdef SLAVE
    HAL_SPI_Receive(&hspi2, (uint8_t*)&number, sizeof(number), 100);
    std::string str = "receive : " + std::to_string(number) + "\n";
#endif
    HAL_UART_Transmit(&huart2, (uint8_t *)str.c_str(), str.length(), 100);

}