2021年1月24日日曜日

STM32CubeIDE: SPIをInterruptで使う

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

SPI通信の終了時に割り込みを発生させる方法です。

非同期なのでSPI通信中はペリフェラルに仕事を任せてその間MPUは他のことができます。今回は、割り込みでSPI通信を行い、メインループではLチカを行います。


Nucleo-F446REのPin機能の割り当て

MX(Device Configuration Tool)の設定


今回はSPI2を使い、MXのデフォルトのピンアサインにしてみます。Hardware NSSは使っていませんが同じピン割り当てにしました。

Pinout


ピン割り当て


ピン名 機能
PB10 SPI2_SCK
PC1 SPI2_MOSI
PB12 SPI2_CS (Software)
PA5 LD2(LED)

SPIの設定

Prameter Settingsで基本的なパラメータを設定します。


NVIC Settingsで割り込みベクタを設定します。


変更点


Connectivity
  SPI2
    Parameter Settings
      Prescaler (for Bud Rate) 256
    NVIC Settings
      SPI2 global interrupt Enabled ✓

GPIOの設定

CS(PB12)をSoftware制御するためにGPIOを設定します。



LD2(ボード上のLED)はMXでBoardを指定して初期化すれば、自動的に設定されます。

変更点

System Core
  GPIO
    PB12
      GPIO output level: High  // CSはActive Lowのため初期値はHigh
      Maximum output speed: Very High
      User Label: SPI2_CS

main.cにコードを追加

初期化


/* USER CODE BEGIN PV */
uint8_t data[2] = { 0x55, 0xAA };
/* USER CODE END PV */

送信するデータを定義します。

  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);  // CS線をLowに
  if (HAL_SPI_Transmit_IT(&hspi2, data, 2) != HAL_OK) {
	Error_Handler();
  }
  // SPI通信が終わっていないのでここではCS線をHighにしない
  /* USER CODE END 2 */

割り込みを発生させるにはHAL_SPI_Transmit_IT()を使います。

メインループ


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  // SPI通信と非同期にLチカ
	  HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	  HAL_Delay(100);
  }
  /* USER CODE END 3 */

メインループ内ではGPIOを100msごとにH/Lさせます。これによってSPI通信が非同期に行われていることが確認できます。

割り込み処理ルーチン


/* USER CODE BEGIN 4 */
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET);    // SPI通信が完了したのでCS線をHighに
	HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);  // 次のSPI通信のためにCS線をLowに
	if (HAL_SPI_Transmit_IT(&hspi2, (uint8_t*)data, 2) != HAL_OK) {
		Error_Handler();
	}
	// SPI通信が終わっていのでここではCS線をHighにしない
}
/* USER CODE END 4 */

割り込み処理ルーチン内で再度SPI通信を開始します。繰り返しSPI通信が行われることになります。

出力信号の観測


Analog Discovery 2のScope機能でLチカの波形、Logic機能でSPI信号とLチカの様子を見ています。

メモ:


STM32CubeIDEのTextEditorではコメントの日本語が文字化けするようです。日本語は使わないほうが無難だと思います。

0 件のコメント:

コメントを投稿