cancel
Showing results for 
Search instead for 
Did you mean: 

HASL:SPI_Receive not working

SGasp.1
Senior

Hi I am working with HAL_SPI for writing and reading an Atmel eeprom..

I have issue during the reading.

Here there is the code

uint8_t EEPROM_ReadByte(uint8_t address, uint8_t* ret)
{
	uint8_t buffer_rx[3] = {READ_EEPROM, address, address};
 
	SS_Select();
 
	if(HAL_SPI_Transmit(EEPROM_SPI, &buffer_rx[0], 1, 10) != HAL_OK)
	{
		return EEPROM_ERROR;
	}
 
	while(HAL_SPI_GetState(EEPROM_SPI) != HAL_SPI_STATE_READY);
 
	if(HAL_SPI_Transmit(EEPROM_SPI, &buffer_rx[1], 1, 10) != HAL_OK)
	{
		return EEPROM_ERROR;
	}
 
	while(HAL_SPI_GetState(EEPROM_SPI) != HAL_SPI_STATE_READY);
 
	if(HAL_SPI_Transmit(EEPROM_SPI, &buffer_rx[2], 1, 10) != HAL_OK)
	{
		return EEPROM_ERROR;
	}
 
	while(HAL_SPI_GetState(EEPROM_SPI) != HAL_SPI_STATE_READY);
 
	/* Wait write cycle time 5ms */
	while(HAL_SPI_GetState(EEPROM_SPI) != HAL_SPI_STATE_READY);
 
	if(HAL_SPI_Receive(EEPROM_SPI, ret, 1, 3000) != HAL_OK)
	{
		return EEPROM_ERROR;     //always here
	}
	SS_Deselect();
 
	return EEPROM_OK;
}

I always get tge eeprom error also if the timeout is very high..

Can you tell me why?

Thanks a lot

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();
  __HAL_RCC_GPIOE_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_HIGH;
  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_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
}
 
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);
 
}
 
 
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_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  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 */
 
}

3 REPLIES 3
Andrew Neil
Evangelist III

Have you used an oscilloscope, logic analyser, or similar to see what's actually happening on the wires?

Anil3
Associate III

Hi@SGasp.1 

Please try to check and confirm once with following things:

1) The baud-rate prescaler you are using is diving the peripheral clock (APB1) by 8 times so the frequency(MHz) you are using to communicate might me wrong. what is the max frequency that your slave can communicate? check once and try to decrease or increase the prescaler.

2) The clock timing...check at what edges the sampling is done by MISO and MOSI.

3) Try to use oscilloscope and check the values that you are transmitting and receiving of those pins.

4) Try to configure another SPI pins and check once.

5) check is there any pull-up/pull-down need to be added.

6) If you connected the slave by using any jumper's then check once in oscilloscope, after transmitting remove the MISO wire and probe on the slave side what it is sending actually.

Also check that the slave is correctly powered and all connections are correct & good.

Post a schematic of your connections.