SPI Flash Memory Nasıl kullanılır?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,234
shopping

Öğrenme amaçlı olarak, kolay erişilebilirlik, uygun fiyat ve yüksek kapasite nedeni ile resimdeki modulden sipariş ettim. Üzerinde Winbond 25Q32 bellek var. Siparişim henüz elime ulaşmadı ama şimdiden kurcalanmaya başladım. Elimdeki hurda parçaların üzerinden bu ürüne muadil olduğunu tahmin ettiğim zbit25vq32 bir bellek çıktı. Hemen esp32 ye bağlayarak iletişim kurmayı denedim. İletişim yapılarını çok fazla bilmiyorum. İşimi gördüğü sürece kütüphaneleri kullanıyorum ama işin biraz daha detayını öğrenmek istiyorum. Daha önce 24CXX serisi i2c epromlar kullandım. Ama yine kütüphane desteği ile sadece şu adrese yaz, şu adresten oku şeklinde ilerledim. 25VQ32 nin data sheet dosyasını incelediğimde konunun jargonuna da uzak olduğum için page, blok, sektör gibi kavramlar arasında kayboldum. Oradan buradan bir sürü şey okuyunca da biraz kafam karıştı...

1694460456318.png



Şimdi Bir blok içerisindeki yapıyı anlamak için excelde şöyle bir tablo hazırladım ve biraz daha olay kafamda şekillendi...

1694462873363.png




Şu adreste refens alacağım bir kod var : https://github.com/kriswiner/ESP32/blob/master/SPI/SPIFlash_ESP32.ino

C++:
#define CMD_WRITE_STATUS_REG   0x01
#define CMD_PAGE_PROGRAM       0x02
#define CMD_READ_DATA          0x03
#define CMD_WRITE_DISABLE      0x04//not tested
#define CMD_READ_STATUS_REG    0x05
#define CMD_WRITE_ENABLE       0x06
#define CMD_READ_HIGH_SPEED    0x0B//not tested
#define CMD_SECTOR_ERASE       0x20//not tested
#define CMD_BLOCK32K_ERASE     0x52//not tested
#define CMD_RESET_DEVICE       0xF0//<<-different from winbond
#define CMD_READ_ID            0x9F
#define CMD_RELEASE_POWER_DOWN 0xAB//not tested
#define CMD_POWER_DOWN         0xB9//not tested
#define CMD_CHIP_ERASE         0xC7
#define CMD_BLOCK64K_ERASE     0xD8//not tested


Bir sürü instruction tanımlanmış. i2c epromdaki gibi bir bayt oku, bir byte yaz yok sanırım. Ben şimdi 1. adrese yazmak için 256 byte birden mi yazacağım? veya 2. adresteki veriyi değiştirmek için önce 256 okuyup istediğim yeri değiştirip tekrar mı yazacağım bu işin mantığı nedir? Dikkat etmem gereken noktalar varmı?
 

Ekler

  • ZB25VQ32.pdf
    2 MB · Görüntüleme: 80
  • W25Q32JV RevI 05042021 Plus.pdf
    3 MB · Görüntüleme: 74
SPI EEPROM'a yazma için bakman gereken en önemli parametre "erase size". Datasheet'e bakınca, bunun gelişmiş bir EEPROM olduğunu görüyoruz ve adamlar 3 farklı erase size seçeneği vermiş. 4 KByte, 32 KByte, ve 64 KByte. Bunun anlamı şu: EEPROM'un belli bir yerine yeni veri yazacaksan, ve o yer de daha önce silinmemiş ise (içinde FF yoksa), o zaman en az 4 KByte okuman, 4 KByte silme yapman, sonra okuduğunun üzerinde değişiklik yapıp 4 KByte geri yazman lazım.

Peki 4, 32, 64, arada ne fark var? Hız farkı. Eğer 64 KByte veri yazacaksan, 64 KByte silme yapmak, 16 tane 4 KByte silme yapmaktan çok daha hızlı oluyor.
1694465821199.png


EEPROM page size da gene yazma hızını arttırmak için yapılmış olan bir optimizasyon. En az 256 byte yazman lazım anlamına gelmiyor. 1 byte da yazabilirsin. Ama 1 byte yazma ile 256 byte yazma arasında süre olarak bir fark olmayacak, o yüzden yazmışken, 256 byte'a kadar ne bulursan yazmanda fayda var.
 
Okuma açısından hiçbir zorluk yok. Block, sector, erase size hiçbir önemi yok. Başlayıp 1 byte da okursun, EEPROM'un tamamını da okursun.

Eğer EEPROM'un tamamını silmişsen, yazma açısından da durum aynı. Başlayıp 1 byte da yazarsın, EEPROM'un tamamını da yazarsın. Ama EEPROM'da hali hazırda veri varsa, ve sen o verilerin bir kısmını muhafaza ederken bir kısmını değiştireceksen o zaman block, sector, erase size ve page size işin içine giriyor.
 
Benim şu anda uğraştığım projede de 16 Mbit lik bir SPI EEPROM kullanılıyor. Herhangi bir kütüphanesi yok, ama olsa da kullanmazdım. Onun yerine SPI kütüphanesini kullanıyorum ve datasheet'teki komutlarla doğrudan iletişim kuruyorum. Bunun en büyük avantajı, datasheet'te ne yazılınca ne okunacak belli. Osiloskop ile SPI sinyallerine bakıp herşeyi datasheet'e uygun hale getirmek benim elimde.

Ama diyelim bu EEPROM'un bir kütüphanesini buldum. Deniyorum ve sorun var. Veyahut istenmeyen bir davranışa sahip (geç siliyor, geç yazıyor vs vs). Ne olacak? Kütüphane kaynak kodunu anlamaya çalışmam gerekecek, bir sürü vakit kaybedeceğim.
 
Okuma açısından hiçbir zorluk yok. Block, sector, erase size hiçbir önemi yok. Başlayıp 1 byte da okursun, EEPROM'un tamamını da okursun.

Eğer EEPROM'un tamamını silmişsen, yazma açısından da durum aynı. Başlayıp 1 byte da yazarsın, EEPROM'un tamamını da yazarsın. Ama EEPROM'da hali hazırda veri varsa, ve sen o verilerin bir kısmını muhafaza ederken bir kısmını değiştireceksen o zaman block, sector, erase size ve page size işin içine giriyor.
1. Önce şunu sorayım. Yazmak için önce silmem gerekiyor doğru mu?

2. Diyelimki page 0 komple boş. , adres 0 a 1 byte veri yazmak istiyorum. Bir byte yazdıktan sonra geri kalan 255 byte a tekrar ff mi yazılıyor.
 
Sonra 2. Adrese 1 byte veri ekleyeceğim. Doğrudan yazabiliyormuyum. Yoksa isteiğim adrese kadar olan veriyi bir dizide okuyup, isteiğim veriyi ekleyip tekrar page olarak mı yazmalıyım.
 
Sen ilk önce JEDEC ID yi okuyabilecek hale getir kodu. Bu önemli bir aşama. SPI iletişimini çalıştırmış olursun. Ondan sonra yazmayı halletmek kolay.
 
Sen ilk önce JEDEC ID yi okuyabilecek hale getir kodu. Bu önemli bir aşama. SPI iletişimini çalıştırmış olursun. Ondan sonra yazmayı halletmek kolay.
Jedeci okudum. 5e 40 16 datası geldi. Tam orada kaldım. 5e nin üretici olduğunu dopruladım ama 40 16 kısmı yorumlayamadım. Neyse yarın ola hayrola.
 
Daha hızlı ilerleme kaydetmek adına eprom için fat kütüphanesi yükledim. 4096 byte dosya ayırma boyutu oluşuyor. Hız denemelerini yapacağım. İstediğim aralıkta olur ise projeme fat ile devam edeceğim.

Ancak yinede her şekilde kendimde konuya hakim olmak için öğrenmek istiyorum. Dikkatimi çeken bir konu wp ve hold bacakları genelde + ya bağlanmış. Ben böyle yapınca fat kütüphanesi iyi çalışmıyor. Kütüphane bu pinleride io üzerinden kullanmak istiyor.
 
FAT kütüphanesinin seni erase size dan kurtaracağını sanmıyorum. En azından benim kullandığım FreeRTOS-FAT kütüphanesinde böyle. FreeRTOS-FAT kullanmak için bir read bir tane de write fonksiyonu vermen lazım. Bunların da EEPROM'un herhangi bir adresinden, herhangi bir sayıda okuma ve yazma yapmak için ne gerekiyorsa yapmaları gerekiyor. Neyseki bana yazma lazım değil o yüzden sadece read fonksiyonunu yapmam yeterli oldu.
 
Peki mantık olarak fat kütüphanesi ne yapıyor? Aklıma takılan şöyle;

1 dosya oluşturunca boş dahil olsa 4 k yer kaplıyor. ancak dosyaya veri yazdığımda kapladığı alan 4 k olarak sabit kalıyor.
Tahminimce dosya boyutu 4k yı aşar ise bu sefer dosya 8 k yer kaplamaya başlayacak.

öylse ise;
1. dosyayı açtım 4 k bir alana yerleşti,
2. dosyayı açtım oda sıradaki 4k alana yerleşti.
sonra 1. dosyaya 4k üzerinde veri yazarsam dosyayı mantıken parçalıyor olması lazım. Doğru mu düşünüyorum...
 
Doğru düşünüyorsun. 4097 byte dosyan varsa, ve sector size 4096 ise, iki tane 4096 byte sector kullanılacak.
 
@taydin, Normalde Kullanılabilir fat alanım 4024Kb

1695050305219.png


Deneme için bir sürü dosya oluşturuyorum. Normalde ihtiyaç yok gibi ancak geliştirme aşamasında belleği formatlamak istiyorum.

C++:
void FORMAT()
{
    FATFS fs;           /* Filesystem object */
    //FIL fil;            /* File object */
    FRESULT res;        /* API result code */
    //UINT bw;            /* Bytes written */
    BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */


    /* Format the default drive with default parameters */
    //FRESULT f_mkfs (const TCHAR* path,    BYTE opt,   DWORD au,   void* work,     UINT len);    /* Create a FAT volume */
    //res = f_mkfs("0:", FM_ANY, 0, work, sizeof work);
    res = f_mkfs("0:", FM_EXFAT, 0, work, sizeof work);
    Serial.println(res);
    if (res==FR_OK) Serial.println("Format Tamam");

f_mks ile belleği formatlayabiliyorum ancak sonrasında kapasite 3772kb a düşüyor. f_mks yi düzgün kullanamıyor olsam gerek. Gözeüne çarpan bir şey var mı?

1695050437835.png
 
Filesystem oluşturduktan sonra yerin azalması normal. Yazma işini nasıl hallettin? Kütüphanenin kendisi erase etme işlerini hallediyor mu?
 
Bilgisayar için konuşuyorum. 1byte veri içeren 1.000.000 tane dosya oluşturun. Dosya boyutuna baktığınız zaman 1.000.000 karakter. Diskteki kapladığı alana bakınca 4gb yada 16gb alan kapladığını görürsünüz. Sizin bahsettiğiniz olayın pcdeki durumu.
 
Filesystem oluşturduktan sonra yerin azalması normal. Yazma işini nasıl hallettin? Kütüphanenin kendisi erase etme işlerini hallediyor mu?
Evet herşeyi kütüphane hallediyor. Konsolda c ile dosyalama işleri yapar gibi hallediyorum herşeyi...

Yerin azalması konusu tuhaf. File sistemi espnin kütüphaneleri ilk başta 4024kb olarak oluşturuyor.

Sonradan ben tekrar formatladığımda 3772kb a düşüyor. Bu noktada bir hata olsa gerek. Anlayamadım. Yarın f mkfs nin parametlerini biraz kurcalayacğım.
 
FAT filesystemde, diskin en başına bir endeks tablosu konuyor. Yedekleme (redundancy) amaçlı sen bu tablodan iki tane oluşturulmasını da talep edebiliyorsun. Belki ESP tek tablo, senin filesistem iki tablo kullanıyor.
 

Forum istatistikleri

Konular
6,129
Mesajlar
104,736
Üyeler
2,551
Son üye
empty

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top