AnsweredAssumed Answered

SPI, debugging, errors, need help!

Question asked by p.s.001 on Mar 29, 2012
Latest reply on Mar 30, 2012 by Simon. Lee
Hi so when i debug this program ( using an stm32l discovery board) it will sometimes get caught up on the lines GPIO_Init(GPIOx, &GPIO_InitStructure) . Also after debugging it once or twice my board completely stops communicating with my computer and i get "Fatal Error:Failed to read CPUID for Cortex device" I've managed to fix the problem almost 3 times. I don't want to risk ruining my board though will someone take a look at my code to see what may be the problem? I'm trying to just do an SPI between mosi and miso pins and display it on the lcd 


#include "stm32l1xx.h"
#include "stm32l1xx_lcd.h"
#include "stm32_tsl_api.h"
#include "discover_functions.h"
#include "stm32l_discovery_lcd.h"
#include <stdio.h>                 
#include "stm32l1xx_spi.h"
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_conf.h"
#include "stm32l1xx_dma.h"
#include "stm32l1xx_rcc.h"
#include "stdint.h"

uint8_t state_machine;

 char display[7]; /* Used to display results*/

GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;
void SPI_Configuration(void);
void init_nss(void);
void GPIO_SPI_Configure();

int main(void)
{


   RCC_Configuration();
   /* Init I/O ports */
   Init_GPIOs ();
   GPIO_SPI_Configure();
   SPI_Configuration();

   /* Initializes ADC */
   ADC_Icc_Init();

   /* Init Touch Sensing configuration */
   TSL_Init();

   /*Initializes the LCD glass */

   SPI_Cmd(SPI1, ENABLE);
   LCD_GLASS_Init();
 int c;


 while(1)
 {

   SPI_I2S_SendData(SPI1, 0x0A);
   int a=  SPI_I2S_ReceiveData(SPI1);
   sprintf (display, "%d", a);
   LCD_GLASS_DisplayString(display);




 }
}


void RCC_Configuration(void)
{

 /* Enable HSI Clock */
 RCC_HSICmd(ENABLE);

 /*!< Wait till HSI is ready */
 while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
 {}

 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

 RCC_MSIRangeConfig(RCC_MSIRange_6);
 //clock the spi, usart,


 /* Enable the GPIOs Clock */
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE|
RCC_AHBPeriph_GPIOH, ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);


 /* Enable  comparator clock LCD and PWR mngt */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD |
RCC_APB1Periph_PWR,ENABLE);

 /* Enable ADC clock & SYSCFG */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG , ENABLE);

 /* Allow access to the RTC */
 PWR_RTCAccessCmd(ENABLE);

 /* Reset Backup Domain */
 RCC_RTCResetCmd(ENABLE);
 RCC_RTCResetCmd(DISABLE);

 /* LSE Enable */
 RCC_LSEConfig(RCC_LSE_ON);

 /* Wait till LSE is ready */
 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
 {}

 RCC_RTCCLKCmd(ENABLE);

 /* LCD Clock Source Selection */
 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

 RCC_HSEConfig(RCC_HSE_OFF);

 if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET )
 {
   while(1);
 }

}

/**
 * @brief  To initialize the I/O ports
 * @caller main
 * @param None
 * @retval None
 */



void  SPI_Configuration(void)
{
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
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_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}


void GPIO_SPI_Configure(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 | GPIO_Pin_11 | GPIO_Pin_12;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_MCO);
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource11,GPIO_AF_SPI1);
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource12,GPIO_AF_SPI1);
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void  Init_GPIOs (void)
{
 GPIO_InitTypeDef GPIO_InitStructure;



/* Configure Output for LCD */
/* Port A */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_Init( GPIOA, &GPIO_InitStructure);

 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource15,GPIO_AF_LCD) ;

/* Configure Output for LCD */
/* Port B */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_8 | GPIO_Pin_9 \
                                | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_Init( GPIOB, &GPIO_InitStructure);

 GPIO_PinAFConfig(GPIOB, GPIO_PinSource3,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource4,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource5,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource8,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource9,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource12,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_LCD) ;

/* Configure Output for LCD */
/* Port C*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_6 \
                                | GPIO_Pin_7 | GPIO_Pin_8 |
GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11 ;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_Init( GPIOC, &GPIO_InitStructure);


 GPIO_PinAFConfig(GPIOC, GPIO_PinSource0,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource1,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource2,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource3,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource6,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource7,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource8,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource9,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource10,GPIO_AF_LCD) ;
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource11,GPIO_AF_LCD) ;

/* ADC input */
 GPIO_InitStructure.GPIO_Pin = IDD_MEASURE  ;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
 GPIO_Init( IDD_MEASURE_PORT, &GPIO_InitStructure);

}



#ifdef  USE_FULL_ASSERT

/**
 * @brief  Reports the name of the source file and the source line number
 *         where the assert_param error has occurred.
 * @param  file: pointer to the source file name
 * @param  line: assert_param error line source number
 * @retval None */



FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG)
{
 FlagStatus bitstatus = RESET;
 /* Check the parameters */
 assert_param(IS_SPI_ALL_PERIPH(SPIx));
 assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG));

 /* Check the status of the specified SPI flag */
 if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET)
 {
   /* SPI_I2S_FLAG is set */
   bitstatus = SET;
 }
 else
 {
   /* SPI_I2S_FLAG is reset */
   bitstatus = RESET;
 }
 /* Return the SPI_I2S_FLAG status */
 return  bitstatus;
}

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)
 {
 }
}


Outcomes