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