Stm32f429 L3GD20(Gyroscope) SPI Sorunu

Başlatan elektronikDelisi, 09 Eylül 2016, 05:47:51

elektronikDelisi

Merhabalar,

Forumda Bunalmış hocamın @z Stm32f407 için yazdığı temel örneklerden yola çıkarak Stm32f429 Gyroscope veri almak istedim. Ama çalışmıyor.
Write Fonksiyonu içerisinde while(SPI5->SR&0x40); komutunda sonsuz döngüye giriyor.
sonsuz döngünün sebebi datasheetten:
Bit 6 OVR: Overrun flag
0: No overrun occurred
1: Overrun occurred
This flag is set by hardware and reset by a software sequence. Refer to Section 28.4.8 on
page 918 for the software sequence.


F7,F8ve F9 pinleri SPI , C1 pini CS olarak tanımlı.

Bu sorunu nasıl çözerim?

Teşekkür ederim.

#include <stdio.h>	 
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_adc.h"
#include "stm32f4xx.h"
#include "stm32f429i_discovery.h"
#include "stm32f429i_discovery_lcd.h"
#include "stm32f4xx_spi.h"



char x,y,z;


void SystemInit ()
{
	unsigned int i;
	(*((int *) 0xE000ED88)) |= 0x0F00000; // Register write enable 
	for(i = 0; i < 0x00100000; i++);

	// OSC oturtma ve kurtarma rutini 
	RCC->CFGR |= 0x00009400;		// AHB ve APB hizlarini max degerlere set edelim 
	RCC->CR |= 0x00010000;			// HSE Xtal osc calismaya baslasin  
	while(!(RCC->CR & 0x00020000));

	// Xtal osc stabil hale gelsin 
	RCC->PLLCFGR = 0x07402A04;		// PLL katsayilarini M=4, N=150, P=2 ve Q=7 yapalim 150 Mhz  
	RCC->CR |= 0x01000000;			// PLL calismaya baslasin (Rehber Sayfa 95) 
	while(!(RCC->CR & 0x02000000));

	// Pll hazir oluncaya kadar bekle 
	FLASH->ACR = 0x00000605;		// Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55) 
	RCC->CFGR |= 0x00000002;		// Sistem Clk u PLL uzerinden besleyelim 
	while((RCC->CFGR & 0x0000000F) != 0x0000000A);

	// Besleninceye kadar bekle 
	RCC->AHB1ENR |= 0x0000006F;		// GPIO A,B,C,D,F,G clock'u aktif edelim  
	GPIOG->MODER |= 0x14000000;		// G13,14 output 
	GPIOG->OSPEEDR = 0xFFFFFFFF;
	GPIOD->MODER = 0x55550000;		// GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin) 
	GPIOD->OSPEEDR = 0xFFFFFFFF;	// GPIOD nin tum cikislari en yuksek hizda kullanacagiz  
	GPIOA->MODER |= 0x00000000;    //A0 input mode (önemsiz)
	GPIOA->OSPEEDR = 0xFFFFFFFF;
	
	
	GPIOF->MODER|=0xA8000; //F7,F8,F9 alternate fun. mode
       GPIOF->AFR[0]=0x50000000; //F7 set AF5	
       GPIOF->AFR[1]=0x55; //F8 and F9 alternate function AF5
       
       
       RCC->APB2ENR|=0x100000;        // SPI5 clk enable  
       GPIOC->MODER|=0x00004;   //C1 output. C1 selected SPI on chip
      
       GPIOC->OSPEEDR |= 0x00;
       GPIOC->BSRRL=0x0002;                // GPIOC1=1; LIS302DL CS=1  
      debug_c1= (GPIOC->ODR&0x2);
       SPI5->CR1=0x00000B7F;               // SPI5 16 bit, master , fulldublex vs 
       SPI5->CR2=0X0000; 
	
	
}
 
void Write(char Adr,unsigned char Data) 
{ 
      GPIOC->BSRRH=0x0002;           //  CS=0 
      SPI5->DR=((Adr&0x3F)<<8)|Data; 
      while(SPI5->SR&0x40);
      GPIOC->BSRRL=0x0002;            // CS=1 
}   
 
char Read(char Adr) 
{ 
 
      GPIOC->BSRRH=0x0002;          //  CS=0 
      SPI5->DR=((Adr&0x3F)|0x80)<<8; 
      while(!(SPI5->SR&1)); 
      GPIOC->BSRRL=0x0002;            // CS=1 
      return(SPI5->DR); 
}   
int main ()
{
	
	LcdInit();
	volatile int i=0;
	
          if(Read(0x0F)==0xD4)   // Who are you ? 
       { 
				 
          Write(0x20,0xF);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable 
          while(1) 
            { 
               who=Read(0x27); // Statusu ogrenelim. Kim hazir kim degil? 
               if (who&1) x=Read(0x29); 
               if (who&2) y=Read(0x2B);
               if (who&4) z=Read(0x2D);
		LcdWriteInt(220,(int)x);
            }
       } 
       
					
	
	}
	  

void LcdInit ()
{

	// LCD initialization 
	LCD_Init();

	// LCD Layer initialization 
	LCD_LayerInit();

	// Enable the LTDC 
	LTDC_Cmd(ENABLE);

	
	LCD_SetLayer(LCD_FOREGROUND_LAYER);
	LCD_SetColors(LCD_COLOR_RED, LCD_COLOR_WHITE);
	LCD_Clear(LCD_COLOR_WHITE);
	
	
}
void LcdWriteInt (int line, int number)
{
 int num=(int)number;

	uint8_t text[50];
	sprintf((char *) text, "%d", num);		// a int text charina geliyor 
	LCD_DisplayStringLine(line,text);			// text yazdiyorz
	
}

}
aramızda bir elektrik var..