STM32L476 SPI incorrect readings
I am trying to communicate with a spectrometer sensor using SPI protocol. With SPI default settings, I am using both arduino and Stm32L476 nucleo boards. (8Bits, MSB First, CPOL Low, CPHA 1 Edge).
I read multiple registers from the sensor using both arduino and STM32 nulceo. Everytime the returned values from sensor using STM32 were half of what arduino received.
For example, Reading register 0x0E using arduino showed "12" but STM32 showed "6", Reading register 0x1A using arduino showed "84", but STM32 showed "42".
According to sensor datasheet, arduino values were correct.
STM32 Code:
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_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint8_t addr = 0x0E;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, RESET); //cs0
HAL_SPI_Transmit(&hspi1, (uint8_t *) &addr, 1, 100);
HAL_SPI_Receive(&hspi1,(uint8_t *) &spi_rec, 2, 100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, SET); //cs0
spi_rec1 = spi_rec[0] * 256 + spi_rec[1];
HAL_Delay(2000);
}
