Skip to main content
walpro
Visitor II
May 3, 2013
Question

STM32F3 discovery SPI communication

  • May 3, 2013
  • 3 replies
  • 1114 views
Posted on May 04, 2013 at 00:34

hello!

i'm an engineering student and i'm workingon a quad-copterproject. i have to use the stm32f3 discovery board to send gyro and accelerometer data throught spi to a rasberry pi board! the first step i did is trying to test the stm32 spi communication by doing a loopback test(MOSI to MISO) but i did not managed to do it! i did not found spi examples on stm32f3 but this is what i've coded :

/// clock configuration
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
//// GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
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_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/// SPI
SPI_I2S_DeInit(SPI2);
SPIS.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPIS.SPI_DataSize = SPI_DataSize_8b;
SPIS.SPI_CPOL = SPI_CPOL_Low;
SPIS.SPI_CPHA = SPI_CPHA_1Edge;
SPIS.SPI_NSS = SPI_NSS_Soft;
SPIS.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPIS.SPI_FirstBit = SPI_FirstBit_MSB;
SPIS.SPI_CRCPolynomial = 7;
SPIS.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI2, &SPIS);
////sending data 
a=0x08;
SPI_Cmd(SPI2, ENABLE);
SPI_SendData8(SPI2,a);
b=SPI_ReceiveData8(SPI2);
//testing the trasmission 
if(b==0x08)
{ 
a++;
STM_EVAL_LEDOn(LED4);
}

can you help plz?
    This topic has been closed for replies.

    3 replies

    Tesla DeLorean
    Guru
    May 3, 2013
    Posted on May 04, 2013 at 01:19

    STM32F37x_DSP_StdPeriph_Lib_V1.0.0\Project\STM32F37x_StdPeriph_Examples\SPI\SPI_TwoBoards\SPI_DataExchangeInterrupt ??

    Yeah, you'll want to be making sure TXE is asserted before sending data, and RXNE is asserted before reading data.

    SPI examples in the other STM32 firmware libraries may also be instructive.
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    hillpatrickb
    Associate II
    May 4, 2013
    Posted on May 04, 2013 at 06:09

    Since SPI uses a shift register to move out one bit at a time you you need to implement a while loop to to wait for the SPI Busy Flag to become a 0 then you can make b =

    b=SPI_ReceiveData8(SPI2);

    So while SPI Busy Flag is 1 do nothing, then once it becomes a 0 set b equal to the MISO data.

    hillpatrickb
    Associate II
    May 4, 2013
    Posted on May 04, 2013 at 06:09

    Since SPI uses a shift register to move out one bit at a time you you need to implement a while loop to to wait for the SPI Busy Flag to become a 0 then you can make b =

    b=SPI_ReceiveData8(SPI2);

    So while SPI Busy Flag is 1 do nothing, then once it becomes a 0 set b equal to the MISO data.