Skip to main content
SGasp.1
Associate III
May 30, 2022
Question

Configuration of SPI for STM32F429 for writing/reading eprom AT25080/

  • May 30, 2022
  • 3 replies
  • 1708 views

Hi amazing community... I have a legacy project developed with STM32System workbench..

I am trying to configure the spi to working with a eprom memory..

I cannot use the cube generator so I have to implement the init of the HAL by myself.

I made a test but it is not working..

Can you please tell me what is wrong?

Thanks a lot

#include "stm32f4xx.h"
#include "stm32f429i_discovery.h"
			
 
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void GPIO_SP1_init(void);
 
SPI_HandleTypeDef hspi1;
 
int main(void)
{
 
	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();
 
	/* Configure the system clock */
	SystemClock_Config();
 
	/* Configure GPIO*/
	MX_GPIO_Init();
 
	/*Configure SPI*/
	MX_SPI1_Init();
	GPIO_SP1_init();
 
	for(;;)
	{
 
	}
}
 
 
 
/**
 * @brief System Clock Configuration
 * The system Clock is configured as follow :
 * System Clock source = PLL (HSE)
 * SYSCLK(Hz) = 168000000
 * HCLK(Hz) = 168000000
 * AHB Prescaler = 1
 * APB1 Prescaler = 4
 * APB2 Prescaler = 2
 * HSE Frequency(Hz) = HSE_VALUE
 * PLL_M = (HSE_VALUE/1000000u)
 * PLL_N = 336
 * PLL_P = 2
 * PLL_Q = 7
 * VDD(V) = 3.3
 * Main regulator output voltage = Scale1 mode
 * Flash Latency(WS) = 5
 * @param None
 * @retval None
 */
void SystemClock_Config(void)
{
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 RCC_OscInitTypeDef RCC_OscInitStruct;
 
 // Enable Power Control clock
 __PWR_CLK_ENABLE();
 
 // The voltage scaling allows optimizing the power consumption when the
 // device is clocked below the maximum system frequency, to update the
 // voltage scaling value regarding system frequency refer to product
 // datasheet.
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 
 // Enable HSE Oscillator and activate PLL with HSE as source
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 
 // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
 // your case, you have to recompute these PLL constants.
 RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
 RCC_OscInitStruct.PLL.PLLN = 336;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ = 7;
 HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
 // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
 // clocks dividers
 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
 
static void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 
 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 
 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3 , GPIO_PIN_RESET);
 
 /*Configure GPIO pins LED : */
 GPIO_InitStruct.Pin = GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 
 /*Configure GPIO pins CS Chip select : */
 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
}
 
static void GPIO_SP1_init(void)
{
 
	GPIO_InitTypeDef GPIO_InitStruct = {0};
 
	// initialize CK alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_5;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
	// initialize SI alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_7;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
	// initialize S0 alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_4;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
}
 
 
static void MX_SPI1_Init(void)
{
 
 /* USER CODE BEGIN SPI1_Init 0 */
 
 /* USER CODE END SPI1_Init 0 */
 
 /* USER CODE BEGIN SPI1_Init 1 */
 
 /* USER CODE END SPI1_Init 1 */
 /* SPI1 parameter configuration*/
 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_HARD_OUTPUT;
 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();
 }
 /* USER CODE BEGIN SPI1_Init 2 */
 
 /* USER CODE END SPI1_Init 2 */
 
}

This topic has been closed for replies.

3 replies

waclawek.jan
Super User
May 30, 2022

> I have a legacy project developed with STM32System workbench..

> I am trying to configure the spi to working with a eprom memory..

> I cannot use the cube generator so I have to implement the init of the HAL by myself.

Why? What's wrong with the legacy project and whatever code that uses?

Debug as usually. Cube functions you've used are now your own so treat them so. Observe activity on the SPI pins. Observe SPI and GPIO registers content, compare them to the working project.

JW

SGasp.1
SGasp.1Author
Associate III
May 30, 2022

Yes.. thanks .. but from your point of you can you check the code if the setting is right according the hal usage and the pinout of the eprom? Do you see something wrong?

Thanks a lot

Tesla DeLorean
Guru
May 30, 2022

Need to associate the SPI1 AF setting for the pin

PB4, PA5 PA7 should be AF5, pull the Data Sheet for the part

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
SGasp.1
SGasp.1Author
Associate III
May 30, 2022

Hi Tesla.. thanks for reply.. what do you mean for AF5 ?

I have changed in this way.... Can you check?

Thanks a lot

static void GPIO_SP1_init(void)
{
 
	GPIO_InitTypeDef GPIO_InitStruct = {0};
 
	__HAL_RCC_SPI1_CLK_ENABLE();
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
 
	// initialize CK alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_5;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
	// initialize SI alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_7;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
	// initialize S0 alternate function push-pull
	GPIO_InitStruct.Pin = GPIO_PIN_4;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
}