cancel
Showing results for 
Search instead for 
Did you mean: 

SPI communication with LSM6DSOX failure

sarath14
Associate

Hello 

Iam using STM32H562RGV6 for my project and iam using SPI6 on this MCU in order to communicate with LSM6DSOX which is an IMU from ST itself but i couldn’t get proper data from the IMU, as its giving random data sometimes and sometimes its zero.

Pin connections :

SPI6_SCK  -> PB3

SPI6_MOSI -> PB5

SPI6_MISO -> PB4

CS  -> PH0 (This is an external crystal oscillator pin but iam using it as GPIO, Will this be an issue as on this pin even if i set the GPIO to high its giving a maximum voltage of 1V)

I tried to change the CS pin instead of toggle before and after communication to ground always and used pull-up in cube ide also but nothing seems to work as i cant communicate and get proper data , chip id itself.

Here are my SPI6 configuration settings of my project, I changed the prescalar to different values but nothing is working. When I measure voltage on SPC and MOSI pins its giving 1.35V (If this would be an issue)

Screenshot 2024-10-21 183203.pngScreenshot 2024-10-21 183223.png

How to debug this issue i dont have print log iam just using Debug windows live expressions for checking change in values.

For your reference iam adding the code here like only transfer function using SPI: 

int32_t spi_read_reg_mtn_snsr(void *handle, uint8_t Reg, uint8_t *pdata, uint16_t Length)

{

uint8_t ret;

Reg = Reg|0x80;

HAL_GPIO_WritePin(GPIOH, GPIO_PIN_0, GPIO_PIN_RESET);

//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_13, GPIO_PIN_RESET);

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

ret=HAL_SPI_Transmit(&hspi6, &Reg, 1, HAL_MAX_DELAY);

if(ret != HAL_OK)

printf("\r\nSPI Read Error");

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

ret=HAL_SPI_Receive(&hspi6, pdata, Length, HAL_MAX_DELAY);

if(ret != HAL_OK)

printf("\r\nSPI Read Error");

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_13, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOH, GPIO_PIN_0, GPIO_PIN_SET);

return HAL_OK;

}

 

int32_t spi_write_reg_mtn_snsr(void *handle, uint8_t Reg, uint8_t *pdata, uint16_t Length)

{

uint8_t ret;

Reg = Reg & 0x7F;

HAL_GPIO_WritePin(GPIOH, GPIO_PIN_0, GPIO_PIN_RESET);

//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_13, GPIO_PIN_RESET);

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

ret=HAL_SPI_Transmit(&hspi6, &Reg, 1, HAL_MAX_DELAY);

if(ret != HAL_OK)

printf("\r\nSPI Write Error");

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

ret=HAL_SPI_Transmit(&hspi6, pdata, Length, HAL_MAX_DELAY);

if(ret != HAL_OK)

printf("\r\nSPI Write Error");

while (HAL_SPI_GetState(&hspi6) != HAL_SPI_STATE_READY){}

//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_13, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOH, GPIO_PIN_0, GPIO_PIN_SET);

return HAL_OK;

}

void read_chip(LSM6DSOX_Object_t *pobj)

{

LSM6DSOX_ReadID(pobj, &Chip_ID); //This is part of ST driver of lsm6dsox itself

printf("\n\rChip id is %X", Chip_ID);

}

 

For Reading chip_id iam using this instruction in while loop but not getting any thing:

spi_read_reg_mtn_snsr(&hspi6, LSM6DSOX_WHO_AM_I , &data1 , 1);

read_chip(pObj);

 

Any help is greatly appreciated and thanks in advance.

1 REPLY 1
Petr Sladecek
ST Employee

Hello,

I can't see neither your GPIO configuration nor the clock system setting. Are you sure your external clock source is disabled? I don't understand what does it mean CS->PH0 and how it is related to SPI as PH0 pin should not be dependent on any SPI configuration. Note if enabled, an additional function always prevails any alternate one.

It would be helpful to double check GPIO configuration registers of the problematic pin and  RCC_CR especially.

Your SPI configuration includes few contradictions evidently at least, too. You have enabled SS pulse mode which uses HW output by default while its control is set to SW mode. Anyway, to force interleaving pulses between the data frames you need to set data interleaving > 1. Applied setting it to zero makes no sense.

Rgds,

Petr