AnsweredAssumed Answered

SPI receive slave mode speed

Question asked by conn.bradley on Oct 1, 2014
Latest reply on Oct 7, 2014 by conn.bradley
Hello,

     I am trying to use an STM32f4 discovery board to receive data in slave mode over SPI. I am using HAL drivers generated from STMCube and using interrupts to receive the data. I can read all the data fine when the master ( NOT the discovery board) sends out data lower than 6 MHz. Anything over 6 MHz  the data cannot be read correctly. I am using SPI4 to read the data.   Below is my initialization code.

static 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;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
   
  if(HAL_PWREx_ActivateOverDrive() != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
   
  /* 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; 
  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
}
 




 
SPI4_Init->Instance = spi;
SPI4_Init->Init.Mode = mode;
SPI4_Init->Init.NSS = SPI_NSS_SOFT;
SPI4_Init->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPI4_Init->Init.FirstBit = bit_order;
SPI4_Init->Init.CRCPolynomial = 7; // No CRC
HAL_SPI_Init(SPI4_Init);
GPIO_InitTypeDef GPIO_Init;
GPIO_Init.Pin = (GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_5);
GPIO_Init.Mode = GPIO_MODE_AF_PP;
GPIO_Init.Speed = GPIO_SPEED_HIGH;
GPIO_Init.Alternate = GPIO_AF6_SPI4;
HAL_GPIO_Init(gpio_module, &GPIO_Init);
__GPIOE_CLK_ENABLE();




 
//initialize SPI4 interrupts
HAL_NVIC_EnableIRQ(SPI4_IRQn);






//Start receiving data!
HAL_SPI_Receive_IT(SPI4_Init, data, buffersize);
Thanks for the help!

Outcomes