This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

STM32L072 (B-L072Z-LRWAN1) - SPI2 not working

Hi,

I'm working with B-L072Z-LRWAN1 platform and struggle to see a signal on SPI2.

My SPI2 is connected on an accelerometer. It is configured as follow:

void HW_IMU_SPI_Init( void )
{
  /*##-1- Configure the SPI peripheral */
  /* Set the SPI parameters */

  hspi2.Instance = SPI2;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi2.Init.Direction      = SPI_DIRECTION_2LINES;
  hspi2.Init.Mode           = SPI_MODE_MASTER;
  hspi2.Init.CLKPolarity    = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase       = SPI_PHASE_1EDGE;
  hspi2.Init.DataSize       = SPI_DATASIZE_8BIT;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;  
  hspi2.Init.FirstBit       = SPI_FIRSTBIT_MSB;
  hspi2.Init.NSS            = SPI_NSS_SOFT;
  hspi2.Init.TIMode         = SPI_TIMODE_DISABLE;

  IMU_SPI_CLK_ENABLE(); 

  if(HAL_SPI_Init( &hspi2) != HAL_OK)
  {
    /* Initialization Error */
     Error_Handler();
  }

  /*##-2- Configure the SPI GPIOs */
  HW_IMU_SPI_IoInit(  );
}

void HW_IMU_SPI_IoInit( void )
{
  GPIO_InitTypeDef initStruct={0};
  
	IMU_GPIO_CLK_ENABLE();

  initStruct.Pin = IMU_SCLK_PIN | IMU_MISO_PIN | IMU_MOSI_PIN;
  initStruct.Mode =GPIO_MODE_AF_PP;
  initStruct.Pull =GPIO_NOPULL  ;
  initStruct.Speed = GPIO_SPEED_HIGH;
  initStruct.Alternate= IMU_SPI2_AF ;

  HAL_GPIO_Init(GPIOB, &initStruct);

  initStruct.Mode = GPIO_MODE_OUTPUT_PP;
  initStruct.Pull = GPIO_NOPULL;

  HW_GPIO_Init(  IMU_NSS_PORT, IMU_NSS_PIN, &initStruct );

  HW_GPIO_Write ( IMU_NSS_PORT, IMU_NSS_PIN, 1 );
}

Systemclock is configured as follow:

void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  /* Enable HSE Oscillator and Activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;
  RCC_OscInitStruct.HSIState            = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLLMUL_6;
  RCC_OscInitStruct.PLL.PLLDIV          = RCC_PLLDIV_3;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /* Set Voltage scale1 as MCU will run at 32MHz */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */
  while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};

  /* 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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}

Chip select is defined as GPIO. I can see it toggling.

I'm not quite sure what I'm missing here. Could anyone help?

Thank you

Parents
  • Hi Andy,

    Yes I had a look on ST forum as well but couldn't find the answer. I tried different things.

    Other SPI lines (PB15,PB14 and PB13) are defined as Alternate Function Push-Pull.

    I even checked with code generator and had a look at what is done for SPI1 (connected to transceiver).

Reply
  • Hi Andy,

    Yes I had a look on ST forum as well but couldn't find the answer. I tried different things.

    Other SPI lines (PB15,PB14 and PB13) are defined as Alternate Function Push-Pull.

    I even checked with code generator and had a look at what is done for SPI1 (connected to transceiver).

Children
No data