2012-12-09 05:41 AM
Hello,
I'm trying to get the MEMS Accelerometer on my STM32F4 Discovery Board to run with a simple code, but I don't make it. Heres my code: int main(void) { SystemInit(); GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //Init SPI-Pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //Init CS-Pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE, GPIO_Pin_3); //Set CS high GPIO_PinAFConfig (GPIOA, GPIO_PinSource5 |GPIO_PinSource6 |GPIO_PinSource7 , GPIO_AF_SPI1); SPI_I2S_DeInit(SPI1); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master ; SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High ; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 0; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); GPIO_ResetBits(GPIOE, GPIO_Pin_3); SPI_I2S_SendData(SPI1, 0x20C7); //Sensor Config while(1){ //Read Y-Axis SPI_I2S_SendData(SPI1, 0xAB00); SPI_I2S_ReceiveData(SPI1); } I'm running this in Debug-mode only (step by step), so there should not be any timing problems due to missing flag-status requests. After sending the data, RXNE bit in SPI SR Register is set but the SPI Data Register always contains 0x0000. I have also tried different modes changing CPOL and CPHA, no results. I am using CooCox IDE I hope somebody can help! Thanks, Alex. #accelerometer #stm32f4 #spi #metoo2012-12-09 08:18 AM
GPIO_PinAFConfig (GPIOA, GPIO_PinSource5 |GPIO_PinSource6 |GPIO_PinSource7 , GPIO_AF_SPI1);
Not going to work, PinSource is an index, not a bit vector. Break into multiple lines.2012-12-09 08:38 AM
Cool, thanks a lot! Works fine now
2013-07-17 06:11 AM
Hi
does this code work? I've been struggling for 2 days to read the accelerometer data and I keep just getting 0xFF in my out rexeived buffer. Am I doing something wrong?2013-07-17 07:40 AM
Am I doing something wrong?
Apparently.2013-08-28 10:50 AM
Hi
Can any one tell me how to get the acceleration value ? I want to calculate the distance by using it. Thanks.2013-08-29 01:03 AM
Above code with small correction gets you a number out. Distance through acceleration? This is something we can discuss about nicely. You do know that acceleration is 0 when speed is constant? This might get you into problem - just a thought.
2013-08-29 01:22 AM
Yes, i know this fact but what about if we store the previous acceleration and when speed becomes constant we can use that previously stored value of acceleration ?
2013-08-29 03:58 AM
Honestly by asking this question my only response can be: go check the basic physics book again. What you could do is calculate speed or something and go with that...
2013-08-29 05:37 AM
Reducing the requirements from ''odometer'' to ''step counter'' would make it sound more realistic ...