2021年1月15日金曜日

STM32CubeIDE: SPIをPollingで使う

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MX(Device Configuration Tool)の設定

今回は、Half-Duplex(半二重通信)とします。また、NucleoにはArduino互換のヘッダがあるので、Arduino UNOのSPIと同じ割り当てにしてみます。

MX(Device Configuration Tool)の設定

ピンの割り当て

SPI Pin Function Arduinoピン名
SCK PA5 SPI1_SCK D13
MOSI PA7 SPI1_MOSI D11
CS PB6 GPIO_OUTPUT D10

デフォルトではPB3がSWO(SYS_JTDO_SWO)に割り当てられていてSPI1が使えなくなっています。PB3を「Reset_State」します。

ハードウェア制御のNSS(CS)はうまく動作しないので、GPIOを割り当てソフトウェアで制御することにします。


STM32はピンごとに割り当て可能な機能が決まっていて、STM32CubeIDEのPinout Viewでピンをクリックすると選択可能な一覧が表示されます。

また、MCUのデータシート(例えば「STM32F446 Datesheet」でググると見つかります)の「Pinout and pin description」の「Alternate function」表で割り当て可能な機能が確認できます。

変更するパラメータ



Categories
  System Core
    GPIO
      PB6
        GPIO output level: High
        Maximum output speed: Very High
        User Label: SPI1_CS

SPIのCSはActive Lawなので初期値としてGPIO output levelをHighにします。わかりやすいように、SPI1_CSというUser Labelをつけます。


Categories
  Connectivity
    SPI1
      Mode: Half-Duplex Master
    Parameter Settings
      Clock Prameters
        Prescaler (for Baud Rate): 256

SPIのクロックは低速のほうが動作確認しやすいのでプリスケーラを256に設定します。

main.cにコードを追加

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

    /* USER CODE BEGIN 3 */
	  uint8_t data[2] = { 0x55, 0xAA };
	  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
	  if (HAL_SPI_Transmit(&hspi1, data, 2, 100) != HAL_OK) {
		  Error_Handler();
	  }
	  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
  }
  /* USER CODE END 3 */

出力信号の観測


Analog Discovery 2のLogic機能でSPI信号を観測しました。


 Analog Discovery 2はアナログ入力とデジタル入力が独立しているので、Scope機能とLogic機能を同時に利用することができます。



ウィンドウの上半分が波形をアナログ波形としてみたところ、下半分がデジタル信号として見たところです。

0 件のコメント:

コメントを投稿