Skip to main content
malehakim
Associate III
September 17, 2019
Question

Can't seem to start SPI1 on Nucleo-F401RE

  • September 17, 2019
  • 2 replies
  • 1619 views

I've been struggling for a while now to start the SPI1 protocol on the Nucleo-401RE. According to the datasheet, SPI1 is connected as follows,

0690X00000ARHqoQAH.png

I generated the code in CubeMX and without adding a single line of code, compiled it without any failures and uploaded it on the board.

What i expected is at-least the SCK pin to generate some clock pulse when connected to a Logic analyzer or an oscilloscope. Instead i get no response. As in a straight line on both indicating 0 volts.

my generated code looks as follows.

main.h

#ifndef __MAIN_H
#define __MAIN_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include "stm32f4xx_hal.h"
 
void Error_Handler(void);
 
#ifdef __cplusplus
}
#endif
 
#endif
 

main.c

#include "main.h"
 
SPI_HandleTypeDef hspi1;
 
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
 
int main(void)
{
 HAL_Init();
 
 SystemClock_Config();
 
 MX_GPIO_Init();
 MX_SPI1_Init();
 
 while (1)
 {
 
 }
}
 
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
 
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
 {
 Error_Handler();
 }
}
 
static void MX_SPI1_Init(void)
{
 hspi1.Instance = SPI1;
 hspi1.Init.Mode = SPI_MODE_MASTER;
 hspi1.Init.Direction = SPI_DIRECTION_2LINES;
 hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
 hspi1.Init.NSS = SPI_NSS_SOFT;
 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
 hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 hspi1.Init.CRCPolynomial = 10;
 if (HAL_SPI_Init(&hspi1) != HAL_OK)
 {
 Error_Handler();
 }
}
 
static void MX_GPIO_Init(void)
{
 __HAL_RCC_GPIOA_CLK_ENABLE();
}
 
void Error_Handler(void)
{
 
}
 

and the stm32f4xx_hal_msp.c

#include "main.h"
 
void HAL_MspInit(void)
{
 __HAL_RCC_SYSCFG_CLK_ENABLE();
 __HAL_RCC_PWR_CLK_ENABLE();
}
 
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 if(hspi->Instance==SPI1)
 {
 __HAL_RCC_SPI1_CLK_ENABLE();
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 /**SPI1 GPIO Configuration 
 PA5 ------> SPI1_SCK
 PA6 ------> SPI1_MISO
 PA7 ------> SPI1_MOSI 
 */
 GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 }
 
}
 
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{
 if(hspi->Instance==SPI1)
 {
 __HAL_RCC_SPI1_CLK_DISABLE();
 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
 }
 
}

What exactly am i missing? I checked several times that my pin connections coincide with what the datasheet says. But i still can't see anything either on the oscilloscope or logic analyzer.

2 replies

waclawek.jan
Super User
September 17, 2019

Try setting the given pins as GPIO, toggle them and observe.

Read out content of relevant GPIO and SPI registers and check/post.

JW

malehakim
malehakimAuthor
Associate III
September 19, 2019

I did check out the toggling functionality on the individual GPIO pins and it worked well. Still cant seem to activate SPI. looked around on some similar implementations and they do have the same configuration as i do. I tried out with a Nucleo-F303k8 and still the same negative effect. This thing is driving me nuts for sure

Associate
January 3, 2025

I recently start using a NUCLEOF401RE and have the same problem.

padawan
Senior
January 7, 2025

Hi

have a look at the schematic at https://github.com/Nastrawww/STM32F401RE/blob/main/NUCLEO-F401RE_Schematic.pdf

Look at sheet 4 there are some solderbridges (SB44) Take a look at the manual to see what the

bridges do. I has had an ssue with the L412 there are solderbridges they are closed by default and shorted

I²C and SPI.

hth

padwan