stm32f030r8 SPI çalışmıyor

Başlatan justice_for_all, 16 Haziran 2015, 08:40:14

justice_for_all

merhaba SPI ile ilgili problemim var

void init_eeprom(void)
{
	GPIO_InitTypeDef  	GPIO_InitStructure;
	
	SPI_InitTypeDef			SPI_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_SPI1EN,ENABLE);
	
	GPIO_PinAFConfig(GPIOA,GPIO_Pin_5,GPIO_AF_0);
	GPIO_PinAFConfig(GPIOA,GPIO_Pin_6,GPIO_AF_0);
	GPIO_PinAFConfig(GPIOA,GPIO_Pin_7,GPIO_AF_0);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;	// sck miso mosi
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;			//Cs
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
	SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
	SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
	SPI_InitStructure.SPI_CRCPolynomial=7;
	SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
	SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
	
	SPI_Init(SPI1,&SPI_InitStructure);
	
	SPI_RxFIFOThresholdConfig(SPI1,SPI_RxFIFOThreshold_QF);
	SPI_CalculateCRC(SPI2, DISABLE);  
	
	SPI_Cmd(SPI1,ENABLE);
	
}


yazma kodu

#define Read		0x03
#define Write		0x02
#define WR_DIS      0x04
#define WR_EN	0x06
#define RDSR		0x05		// read status register
#define WRSR		0x01


#define cs(a)		GPIO_WriteBit(GPIOA,GPIO_Pin_8,a);


void WREN(void)
{
	cs(0);

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
	SPI_SendData8(SPI1,WR_EN);
	
	//*(__IO uint8_t *) 0x4001300C =WR_EN;

	cs(1);
}

void WRDIS(void)
{
	
	cs(0);

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
	SPI_SendData8(SPI1,WR_DIS);

	cs(1);
	
	
}

void eeprom_yaz(uint16_t adress , uint8_t data)
{
	WREN();

	
	cs(0);

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

	SPI_SendData8(SPI1,(uint8_t)(adress>>8));

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

	SPI_SendData8(SPI1,(uint8_t)(adress));
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

	SPI_SendData8(SPI1,data);

	cs(1);

	
	WRDIS();
	
}

kodlarım bunlar eeprom yaz dediğim zaman SPI->DR registerinde yazdığım datalar gözükmesi gerekmiyormu debug yaparken sürekli sıfır görüyorum ve TX buffer sürekli boş görünüyor bunun nedeni ne olabilir?

25lc256 eeproma veri yazmaya calışıyorum ama yazamıyorum sanırım hep sıfır değeri okuyorum.




Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Hocam selam; Genelde spi ile yapılan çalışmalarda kod kontrolüne gitmeden önce logic analyser veya osilaskop ile Clock Enable Mosi miso hatlarını incelemek gerek herhangi bir problem göremediyseniz koda bakmakta yarar var.
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

ama benim söyle bir sorunum var hocam debug yapıyorum

void SPI_SendData8(SPI_TypeDef* SPIx, uint8_t Data)
{
  uint32_t spixbase = 0x00;

  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));

  spixbase = (uint32_t)SPIx; 
  spixbase += 0x0C;
  
  *(__IO uint8_t *) spixbase = Data;
}


bu spi.c kodunda gönderme yaparken

*(__IO uint8_t *) spixbase = Data;


bu satır SPI buffer adresi kontrol ettim.bu satırı geçtikten sonra buffer a bir değer yüklenmesi gerekmiyormu?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

#3
Hocam ;

SPI ile data gönderirken kütüphane kodu kullanmıyorum, bazı problemler yaşamıştım. Şu şekilde istediğiniz bilgiyi SPI'dan göndermiş olursunuz isterseniz birde bu şekilde deneyin.

SPI_NO yazan yere hangi SPI'yı kullanıyorsan onu eklersin.

    SPI_NO->DR = Data;

    while((SPI_NO->SR & 0x02) == 0);

    while((SPI_NO->SR & 0x01) == 0);

    return SPI_NO->DR;


SPI DR registerınıda veya SR registerında kurulum vs tüm bilgileri görebilmen lazım. Eğer göremiyorsan çok büyük olasılıkla clock verilmemiş veya yanlış init ediliyor olsa gerek.

Birde kodların içinde
    SPI_CalculateCRC(SPI2, DISABLE);  
    
    SPI_Cmd(SPI1,ENABLE);


CRC kısmında neden SPI2 yazıyor ? Alakası olacağını zannetmiyorum fakat bence SPI kurulumunda problem olabilir.
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

cebug yaparken registerleri görebiliyorum akşam ekran görüntüsünü alırım Hocam.

SPI_CalculateCRC(SPI2, DISABLE); 


bunda yalnışlık olmuş hocam.Yalnış init edildiği zaman SPI fifoda herhangi bir değer görebilirmiyiz hocam?

Direkt olarak register adresini attım yine yemedi.

*(__IO uint8_t *) 0x4001300C =WR_EN;
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

JKramer

/CS pin'ini en başta pull-down olarak ayarlamışsınız; ya pull-up yapın ya da okuma-yazma işlerine girmeden önce bir yerde cs(1) yapın.

justice_for_all

Tamam hocam o şekilde yaparım.Peki Bu fifoya yazma sorununa fikri olan varmı ? Tamam eeproma yazamamam o sepepten olabilir ama ben SPI->DR registerine neden değer yazmadığını merak ediyorum bunu deneyebilecek biri varmı kendi kartında?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Geri dönen herhangi birşey var mı peki ? Yerinde olsam bu kadar uğraşmak yerine skop veya logic-analizor ile sinyalleri incelerdim. Şu an boşa kürek çekiyoruz gibi.

FLASH_SPI yazan şey SPI2 'yi işaret ediyor.

Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

Senin yaptığın fonksiyonda DR registerine bilgi yerleşmiş mesela hocam bende DR 0x00 gösteriyor TXE flag sürekli 1 busy sürekli 0 durumunda geri dönen değer 0 akşam deneyeceğim lojikle.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Alıntı yapılan: justice_for_all - 16 Haziran 2015, 14:45:06
Senin yaptığın fonksiyonda DR registerine bilgi yerleşmiş mesela hocam bende DR 0x00 gösteriyor TXE flag sürekli 1 busy sürekli 0 durumunda geri dönen değer 0 akşam deneyeceğim lojikle.

Benim bildiğim MOSI-MISO hattı pull-up'da kalması gerekiyor. Seninki saki pull-down gibi görünüyor. Eğer pull-up kalmış olsaydı ve cihaz cevap vermeseydi 0xFF olacaktı. Belkide GND ile kısa devre vardır. İncelemek gerek lojikle.
Picproje Eğitim Gönüllüleri ~ MrDarK

PROTECH_

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

justice_for_all



bu sekilde DR nin icinde deger yukleyemiyorum.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

Dün eeproma yazıp okuma işlemini yaptım ama kodda değişiklik yapmadım eepromun lehimlerini tazeledim oldu ama hala debug yaparken DR registerinde değer göremiyorum ama yazdığım ve okuduğum datalar aynı.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Hocam ;

DR register'a veriyi koyar koymaz gidiyor olabilir. Dönen değeri görebiliyor olmanız lazım. Karşı tarafın verdiği cevabı. Logic Analizör ile bakma şansınız oldu mu acaba ?
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

lojik analizörü bulamadım evde ama buda işyerinde osilaskopta baktım hocam clk mosi ve miso sinyallerini gördüm.DR de gelen datayı görebiliyorum onda sorun yok hocam.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay