F4 Discocovery ile Spi Haberleşme de Flag sorunu

Başlatan samedkutuk, 12 Şubat 2020, 11:05:49

samedkutuk

Arkadaşlar merhabalar öncelikle herekese iyi çalışmalar dilerim.
Stm32f407 çekirdeğine sahip STM32F4-Discovery geliştirme kartında Spi haberleşme uygulaması yapmaya çalışıyorum(Kart üzerindeki Jyrocop entegresini deniyorum)
Atollic kullanıyorum derleyici olarak
Kodu kartıma yüklediğimde sensörümün" Who am ı" Registerinden bir ıd almam gerekiyor
fakat hiçbir değer alamıyorum  daha sonra debug ettiğimde gördüm ki adresi gönderdikten sonra Flag hazır olana kadar bekle dediğim satırda tıkanıyor programım sebebini anlayamadım
daha önce tecrübe eden var ise yardımlarını rica ediyorum :)
Yüklediğim kod um ve programın takıldığı yer aynen aşağıdaki gibidir;

Kod um şu şekilde eğitim videosundan yararlandım
/*
******************************************************************************
File:     main.c
Info:     Generated by Atollic TrueSTUDIO(R) 9.3.0   2020-02-12

The MIT License (MIT)
Copyright (c) 2019 STMicroelectronics

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

******************************************************************************
*/

/* Includes */
#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
uint8_t SPIData=0;
int i = 0;
GPIO_InitTypeDef GPIOStructure;
SPI_InitTypeDef SPIStructure;


void config(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE) ;

	GPIOStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
	GPIOStructure.GPIO_Mode=  GPIO_Mode_OUT;
	GPIOStructure.GPIO_OType=GPIO_OType_PP ;
	GPIOStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIOStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOD, &GPIOStructure);

	//  SCK , MOSI ,MISO
	GPIOStructure.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIOStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIOStructure.GPIO_OType=GPIO_OType_PP;
	GPIOStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, & GPIOStructure);


	//alternate function olarak ayarlanan pinlerde mutlaka tanımlama yapılmalı

	GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);
	//SP1 için özel pinlerdir .


	// Chipselect =pin E3
	GPIOStructure.GPIO_Pin=GPIO_Pin_3;
	GPIOStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIOStructure.GPIO_OType=GPIO_OType_PP;
	GPIOStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOE,&GPIOStructure);



	SPIStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64 ;
	SPIStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;  //yazma ve okuma		SPIStructure.SPI_Mode=SPI_Mode_Master  ; //stm kartı master olucak
	SPIStructure.SPI_DataSize=SPI_DataSize_8b;  //8 bitlik veri gönderimi
	SPIStructure.SPI_FirstBit=SPI_FirstBit_MSB; //Veri gönderimi yüksek bitten başlasın
	SPIStructure.SPI_CPOL=SPI_CPOL_High;   //cpol=1
	SPIStructure.SPI_CPHA=SPI_CPHA_2Edge;  //cpha=1

	SPIStructure.SPI_NSS=SPI_NSS_Soft; //yazılımsal kontrol aktifleştirildi
	SPI_Init(SPI1,&SPIStructure);

	SPI_Cmd(SPI1,ENABLE);

}


int main(void)
{

     config();

			 GPIO_ResetBits(GPIOE,GPIO_Pin_3); //CS pini lojik 0 e çekildi

			 	// Who_Am_I register adres = 0x0f     = 0000 1111
			 	// Okuma olduğundan ilk bit 1 olmalı   = 1000 1111  = 0x8f
			 		SPI_I2S_SendData(SPI1,0x8F);
			 		while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
			 		SPI_I2S_ReceiveData(SPI1);

			 		while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
			 		SPI_I2S_SendData(SPI1,0x00);  //0x00 sahte değer
			 		while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
			 		SPIData=SPI_I2S_ReceiveData(SPI1);
			 		GPIO_SetBits(GPIOE,GPIO_Pin_3);


			if(SPIData == 0X3F)
			{
				GPIO_SetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);


			}





  while (1)
  {
	  GPIO_ResetBits(GPIOD,GPIO_Pin_12);
  }
}


/*
 * Callback used by stm32f4_discovery_audio_codec.c.
 * Refer to stm32f4_discovery_audio_codec.h for more info.
 */
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size){
  /* TODO, implement your code here */
  return;
}

/*
 * Callback used by stm324xg_eval_audio_codec.c.
 * Refer to stm324xg_eval_audio_codec.h for more info.
 */
uint16_t EVAL_AUDIO_GetSampleCallBack(void){
  /* TODO, implement your code here */
  return -1;
}

Programın takıldığı nokta ;


samedkutuk

z

https://www.picproje.org/index.php/topic,35896.15.html

Bu linki takip et. Bir sorun vardi ve ara tara sorunu bulmustuk. Kesinlikle yol gosterecektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

samedkutuk

Alıntı yapılan: z - 12 Şubat 2020, 12:05:29https://www.picproje.org/index.php/topic,35896.15.html

Bu linki takip et. Bir sorun vardi ve ara tara sorunu bulmustuk. Kesinlikle yol gosterecektir.
Hocam siz daha çok register kodlaması yazmışsınız ben okadar hakim olmadığımdan std fonksiyonları ile yapmayı denemiştim
samedkutuk