2016-09-10 11:32 AM
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..Simone2016-09-12 05:40 AM
I suggest to download the firmware package for the F4 discovery, as found here:
It contains examples for the MEMS devices, for example in the demo application. You can adapt or extend it (using the ''old'' SPL), or trying to port the SPL-based MEMS code to Cube. I would expect the latter to be rather painful... Not gonna wade through Cube code, perhaps someone else does ...2016-09-12 02:19 PM
Hello AvaTar,
thank you for your reply.I've already had a look at the examples, but what I want to understand it's why my code doesn't work, just to understand if I'm doing something wrong because I've controlled that code a lot of times watching also the accelerometer's datasheet and I really can't find the problem.Simone2016-09-13 01:18 AM
> I've already had a look at the examples, ...
So you have at least a working ''fallback'' code you could build on.>... but what I want to understand it's why my code doesn't work, just to understand if I'm doing something wrong because I've controlled that code a lot of times watching also the accelerometer's datasheet and I really can't find the problem.
Have you had a ''working'' minimal version, or have you never got that far ? In the latter case (I guess a Cube application build from scratch), I strongly suggest a scope (to view the actual bus communication) and the debugger. If you don't have a scope at hand, I strongly suggest to revert back to a known-and-working project - like the firmware example. Not sure if there exists a cube-based equivalent. Some way back I decided not to stain myself with this Cube stuff (it doesn't need you to insert bugs, the code generator can do so all alone - just check out this forum ...). I'm having some F3 and F4 discovery projects using the MEMS sensors, all based on the SPL code and examples. Have you been able to debug your code ?
2017-10-28 12:42 AM
Hi Simone,
Did you end up getting it working? I have very similar code to you and I can see the SPI lines on my oscilloscope working as expected, just no reply.Thanks,Luke2017-10-29 03:19 AM
Most of ST Mems, when configured in SPI mode (NSS=low) starts in SPI 4 wire mode.
You need first to write the control register bit of the mem to switch to 3 wire mode to read back data from the sensor.
2017-10-30 01:43 PM
Is this problem proceding?I have same problem.
2017-10-30 05:32 PM
Ahh dang it! I don't initialise the MEMS at register 0x20. Sorry, my first time using SPI, I thought I could just send a request for the WHO_AM_I ID (0x0F) to test if it was working.
I'm at work at the moment, I'll try when I get home and reply here.2017-10-31 02:20 AM
Hi
Dempsey.Luke
, if you send here your simple example,I will be so glad.2017-10-31 04:30 AM
As much as I see I m doing it right but I think my mistake is about CPHA ,adxl345 settings says CPOL=1 and CPHA=1 and I did CPOL = 0 and CPHA = 1 edge ,point I dont know what it '1 edge' is .You can see it in CubeMX .Actually you probably already know it.Also other option is 2 edge