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 件のコメント:
コメントを投稿