cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 SPI Configuration SPI_Init causes assert_failed loop

mozcelikors
Associate
Posted on March 03, 2014 at 12:24

I'm trying to configure SPI to work with a ST7565 GLCD library which is given here (  ). For now, I'm trying to use SPI1 to achieve this. When the init function -which is given below- is called in main(), it causes the program to loop in assert_failed function.

void init_SPI1(void){

 

 

 

    GPIO_InitTypeDef GPIO_InitStruct;

 

    SPI_InitTypeDef SPI_InitStruct;

 

 

 

    // enable clock for used IO pins

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

 

 

 

    /* configure pins used by SPI1

 

     * PA5 = SCK

 

     * PA6 = MISO

 

     * PA7 = MOSI

 

     */

 

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;

 

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

 

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

 

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

 

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;

 

    GPIO_Init(GPIOA, &GPIO_InitStruct);

 

 

 

    // connect SPI1 pins to SPI alternate function

 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);

 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);

 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

 

 

 

    // enable clock for used IO pins

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

 

 

 

    /* Configure the chip select pin

 

       in this case we will use PE7 */

 

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

 

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

 

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

 

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

 

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

 

    GPIO_Init(GPIOE, &GPIO_InitStruct);

 

 

 

    GPIOE->BSRRL |= GPIO_Pin_7; // set PE7 high

 

 

 

    // enable peripheral clock

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

 

 

 

    /* configure SPI1 in Mode 0 

 

     * CPOL = 0 --> clock is low when idle

 

     * CPHA = 0 --> data is sampled at the first edge

 

     */

 

    SPI_InitStruct.SPI_Direction = SPI_Direction_1Line_Tx; // set to full duplex mode, seperate MOSI and MISO lines

 

    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;     // transmit in master mode, NSS pin has to be always high

 

    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide

 

    SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle

 

    SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge

 

    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // set the NSS management to internal and pull internal NSS high

 

    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI frequency is APB2 frequency / 4

 

    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first

 

 

 

    SPI_Init(SPI1, &SPI_InitStruct); 

 

    SPI_Cmd(SPI1, ENABLE); // enable SPI1

 

}

I've noticed that program goes in infinite loop inside assert_failed function when it reaches SPI_Init() line:

SPI_Init(SPI1, &SPI_InitStruct); 

The assert_failed function ( Default in Firmware Library) is below:

void assert_failed(uint8_t* file, uint32_t line)

 

 

  /* User can add his own implementation to report the file name and line number,

 

     ex: printf(''Wrong parameters value: file %s on line %d\r\n'', file, line) */

 

 

 

  /* Infinite loop */

 

  while (1)

 

  {

 

 

 

  }

 

}

I don't know what does it supposed to mean that it loops in assert_failed function. Is it a problem to do with the SPI configuration. I need guidance to understand the problem and generate a solution. Any help will be greately appreciated. Thanks in advance.

#stm32 #discovery #spi #spi_init
1 REPLY 1
Posted on March 03, 2014 at 14:14

Well the assert() likely comes from SPI_Init() not liking a parameter passed to it. Suggest you review the file and line parameter passed to the assert() and then go LOOK at the line in question to see what it objected too?

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..