cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 Discovery and accelerometer

simoneformichella
Associate
Posted on September 10, 2016 at 20:32

Hi everybody,

I'm writing this post to ask if someone, please, can help me resolving a problem with the datas-reading from the accelerometer integrated in the STM32F4 Evaluation Board.

What I want to do it's simply to read the accelerations datas from the sensor, using the SPI interface. I've had a look at a lot of examples but I still don't know why my code doesn't work.

Here the main functions:

void WriteAccelerometer(SPI_HandleTypeDef SPI, uint8_t address, uint8_t data)

{

       HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); //CS --> Low

           HAL_SPI_Transmit(&SPI,&address,1,50);

           HAL_SPI_Transmit(&SPI,&data,1,50);

           HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); //CS --> High

uint8_t ReadAccelerometer(SPI_HandleTypeDef SPI, uint8_t address, uint8_t data)

{

 address = address | 0x80;

 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); //CS --> Low

          HAL_SPI_Transmit(&SPI,&address,1,50);

 HAL_SPI_Receive(&SPI,&data,1,50);

          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); //CS --> High

 return data;

}

Here the SPI configuration function:

static void MX_SPI1_Init(void)

{

  

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 = 10;

  if (HAL_SPI_Init(&hspi1) != HAL_OK)

  {

    Error_Handler();

  }

//WriteAccelerometer(hspi1,0x23,0xC9); //reset

//WriteAccelerometer(hspi1,0x21,0x00);

}

I use the two functions reported in this post to configurate and read the accelerometer with this commands:

uint8_t config_address = 0x20;

uint8_t config_data = 0x27; 

uint8_t Address_ACCX = 0x29;

uint8_t Address_ACCY = 0x2B;

uint8_t Address_ACCZ = 0x2D;

WriteAccelerometer(hspi1,config_address,config_data); //config

// read data:

AccX = ReadAccelerometer(hspi1,Address_ACCX,AccX);

AccY = ReadAccelerometer(hspi1,Address_ACCY,AccY);

AccZ = ReadAccelerometer(hspi1,Address_ACCZ,AccZ);

Thank you in advance for the help..

Simone

28 REPLIES 28
Posted on October 31, 2017 at 22:11

What are the values of BW_RATE, POWER_CTL

and INT_SRC?

Posted on October 31, 2017 at 22:13

Also, what discovery board are you using? Have you verified that your CS pin is correct through the schematic?

Posted on October 31, 2017 at 22:23

Your ADXL CS pin will be different to the one required by the accelerometer on the board though, correct?

Zek_De
Senior
Posted on October 31, 2017 at 23:26

I see that is about adxl345 board companent arrays.Lis is working.

Zek_De
Senior
Posted on October 31, 2017 at 23:27

No ,it was on different pin

Zek_De
Senior
Posted on October 31, 2017 at 23:30

My opinion is pull-up resistor is making a trouble  or maybe R4 resistor(there is on the board)

Posted on October 31, 2017 at 22:59

Is 

ADXL345_CS_Pin GPIO PE3 on the STM32F4?

Posted on November 02, 2017 at 02:49

Just confirming, you are using the STM32F4DISCOVERY board with the LIS3DSH MEMS (and you are trying to use the LIS3DSH) ?

Datasheet:

http://www.st.com/content/ccc/resource/technical/document/user_manual/70/fe/4a/3f/e7/e1/4f/7d/DM00039084.pdf/files/DM00039084.pdf/jcr:content/translations/en.DM00039084.pdf

 

I don't see a pull-up resistor being used between the MEMS and STM32?

Zek_De
Senior
Posted on November 12, 2017 at 08:49

Hi Luke,

Sorry my late response,I only got a job and I was very busy.I used ADXL345(this is why failure).LIS3DSH is successful.