Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: justice_for_all - 16 Haziran 2015, 08:40:14

Başlık: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 16 Haziran 2015, 08:40:14
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.

(http://i.hizliresim.com/DMAg8o.jpg) (http://hizliresim.com/DMAg8o)


(http://i.hizliresim.com/QAnO4y.jpg) (http://hizliresim.com/QAnO4y)
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 16 Haziran 2015, 08:51:54
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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 16 Haziran 2015, 08:58:24
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?
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 16 Haziran 2015, 10:44:47
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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 16 Haziran 2015, 11:00:35
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;
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: JKramer - 16 Haziran 2015, 12:09:26
/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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 16 Haziran 2015, 12:51:46
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?
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 16 Haziran 2015, 14:00:04
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.

(http://i.hizliresim.com/7kL4Q5.png)
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: 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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 16 Haziran 2015, 14:58:20
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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: PROTECH_ - 16 Haziran 2015, 16:01:53
Soft spi yap 15-20 dk da biter.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 16 Haziran 2015, 21:26:58
(http://i.hizliresim.com/5d0pDD.jpg) (http://hizliresim.com/5d0pDD)

bu sekilde DR nin icinde deger yukleyemiyorum.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 17 Haziran 2015, 09:16:21
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ı.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 17 Haziran 2015, 10:01:09
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 ?
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 17 Haziran 2015, 10:07:09
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.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 17 Haziran 2015, 10:32:04
Alıntı yapılan: justice_for_all - 17 Haziran 2015, 10:07:09
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.

Resimde gösterdiğim gibi bende gönderdiğim datayı göremiyorum DR'de, Yani koyduğun an shift registerdan çıkıyor sanırım. Resimde koyduğum zaten dikkat ettiysen dönüş değeriydi. Neyse geçmiş olsun :) Eepromun aynı yerine sürekli yazmamaya dikkat :)
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 17 Haziran 2015, 10:44:36
Aynı yerine sürekli yazılırsa ne olur hocam ? ???
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: MrDarK - 17 Haziran 2015, 11:16:07
Hocam ;

Eepromun ve Flash hafızaların yazılıp silinme ömürü var bildiğiniz üzere, üreticiden üreticiye değişmek üzere 100K ile 300K arasında genelde benim gördüğüm ömürleri var. Rakam gözünü boyamasın çok büyük bir değer değil :)
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: justice_for_all - 18 Haziran 2015, 08:10:05
Ömürleri olduğunu biliyorum hocam ben aynı yere yazacam ama belki gunde bir belki haftada bir yani.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: quigon1977 - 02 Kasım 2017, 15:07:10
Merhaba ,
ben de 25lc512 den hiçbir cevap alamıyorum. Osiloskop ile baktığımda clock ve giden data yı görüyorum ama gelen  bir şey yok.
Kütüphane kullanmıyorum. Alttaki kodlarda ne hata olabilir? Yardım lütfen.


EEPROM_SELECT_0; 
SPI1->DR=(0x06);      //yazma koruması
EEPROM_SELECT_1;
         
delay_ms(10);
         
EEPROM_SELECT_0;   
SPI1->DR=(0x02);    //yazma komutu
SPI1->DR=(0x01);   //adres
SPI1->DR=(0x00);   //adres
SPI1->DR=(0x4f);    //data yaz
EEPROM_SELECT_1;   
         
delay_ms(10);
                                                               
EEPROM_SELECT_0;         
SPI1->DR=(0x03);     //okuma komutu
SPI1->DR=(0x01);     //adres
SPI1->DR=(0x00);    //adres
haf=SPI1->DR;         //data oku
EEPROM_SELECT_1;


Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: Mucit23 - 02 Kasım 2017, 15:16:00
Bu şekilde spi kullanımı hatalı. DR registerine bir veri yüklediğiniz zaman, yeni bir veri paketi yüklemeden önce o veri tamamen gönderilene kadar beklemelisiniz. SPI örneklerini inceleyin.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: quigon1977 - 02 Kasım 2017, 15:29:35
Daha önce örneklerden gördüklerimi uygulamıştım. Her veriyi gönderdikten sonra  while((SPI1->SR & 0x02) == 0);  ekledim.
Olmadı bekleme süreleri koydum oda olmadı.
Başlık: Ynt: stm32f030r8 SPI çalışmıyor
Gönderen: quigon1977 - 02 Kasım 2017, 17:33:40
Ek olarak debug yaptığımda DR register içi sürekli FFFF görünüyor.  Ama osiloskoptan baktığımda çıkış normal gibi.  FFFF olsaydı düz çizgi görmem gerekirdi.