STM32 İLE ST25VF040 NOR FLASH BELLEK KULLANMAK

STM32 ile EEPROM kullanmak gerektiğinde 24L serisi I2C arayüzlü tümleşik devreleri kullanmaktaydım. Ancak bunlara daha hızlı bir alternatif gerektiğinde SPI arayüzlü NOR FLASH bellekleri kullanmak uygun oluyor. 50 MHz saat hızları ile çalışabilen bu bellekler en fazla 400 KHz e çıkabilen I2C EEPOM lara göre çok hızlılar.

Ancak bunların kullanımları 24L serisi EEPROM’lardan biraz farklı. Bu yayında Ali Express den çok ucuza aldığım (5 tanesi 0.55USD) 4 Mbitlik SST25VF040B-50-4C-S2AF tipi NOR Flash yongasının STM32 ile kullanılışını anlatacağım.

Bilgisayarların BIOS yongalarını CH341A modülü kullanarak PC den okuyup yazma işlemini bir başka yayında ele alacağım. Bu yayın STM32 ile Flash kullanımına yönelik.

24L SERİSİ EEPROMLARA GÖRE ÖNE ÇIKAN FARKLAR

NOR Flash belleğe bir şey yazabilmek için o konumun önce özel bir komut ile silinmesi gerekiyor. Silinen bellek adresi 0xFF değerini alıyor. Daha önce yazılmış bilginin üzerine yenisi yazılamıyor.

Dikkat : Bu silme işleminin "Erase" komutlarından birisi ile yapılması zorunlu. Oraya "0xFF" yazarak aynı sonucu alamazsınız.
FLASH belleklerde yazılmış olan bir '1' bitinin üzerine '0' yazmak mümkün ama tersi yapılamıyor, '0' olan bir biti '1' haline getirmek ancak bitin bulunduğu sektörü komple silerek mümkün oluyor. Eğer yazma işleminizin sadece bazı '1' leri '0' yapmaya yönelik olduğundan eminseniz, eski bilginin üzerine yazmak mümkün. Ama bilesiniz ki arada '1' e dönüşmesi gereken '0' lar var ise, bu işlem çalışmayacaktır.

Silme işlemi tek bir bellek adresi için yapılamıyor. Tek seferde silinecek en küçük alan bir “sektör”, ST25VF040B de bu 4096 Byte’lık bir blok. Bu flash belleklerin yapısından kaynaklanan bir özellik.

Bu nedenle eğer yeni veriyi yazacağınız sektörde kaybetmek istemediğiniz başka veriler var ise bunların tamamını -yani 4096 byte olarak- bir diziye okuyup, sektör silme işleminden sonra tekrar yazmanız gerekiyor.

Dikkat : Çin'den bu kadar ucuza alınan devre elemanlarına dikkatle yaklaşmak gerekiyor. Özellikle hız ve silme-yazma dayanımı söz konusu olduğunda. Benim aldığım SST25VF040B leri data sheetde belirtilen 50MHz SPI hızı ile test edemedim.Çıkabildiğim en yüksek hız olan 18MHz de sorun olmadı, ama yine de fiyatı kuşku uyandırıyor. 10.000 olması gereken yazma-silme dayanımını ise test etmeye kalkışmadım. Ciddi bir uygulama söz konusu ise güvenilir tedarikçilerden alışveriş etmekte yarar var.

FİYATLAR :
Özellikle 0-70C Ticari ile -45/+85 C Endüstriyel çalışma bölgesi seçiminin önemli fiyat farkı yarattığı anlaşılıyor. Aşağıda 10.000 silme/yazma dayanım garantili birkaç tipin farklı satıcılardan fiyatları var, özellikleri aynı değil ama fikir veriyor. Aliexpress den alınanın fiyatı kuşku uyandıracak kadar düşük. (Sonuç paragrafındaki izlenimlerimi okuyabilirsiniz):

Aliexpress SST25VF040B 50-4C-S2AF(4 Mbit 50MHz, ticari)     0.11$
Ozdisan    SST25VF010A 33-4I-SAE (1 Mbit 33Mhz Endüstriyel) 1.08$
Farnell    SST25VF040B 50-4I-SAF (4 Mbit 50Mhz Endüstriyel) 0.90$

Bir diğer uyarı : SST25VF serisini yeni tasarımlarda tavsiye etmiyorlar. Bunun yerine SST26VF öneriliyor. Bu iki seri pin uyumlu ama yazılımda adaptasyonlar gerektiriyor. 
SST26VF serisinin SQI (4 bit paralel I/O SPI) olanağı var, bu sayede çok daha hızlı veri transferi yapılabiliyor. Ancak mikrodenetleyicinizin bu haberleşme protokolunu desteklemesi gerekir. Aksi halde mikro denetleyicinin bu moda uyumlu SPI çevre birimi olmadığından, bunun yerine kod yazarak "bit-banging" ile çözmeniz gerekir ki bu da CPU zamanından çalar.

PROJE KURULUMU

SOP8 kılıflanmış ST25VF tümleşik devresine bağlantı yapabilmek için bir plakete lehimlemekten başka çarem yoktu. Ama bu deneyimin ardından ilk işim SOP8 ve 16 tümleşik devreler için birer klips-prob sipariş etmek oldu.

Boş PCB lerimden birinin bir köşesindeki SOP8 alanı tam da bu işe uygun düştü. Sadece 2 ayağa dışarıdan tel lehimlemek zorunda kaldım.

Dışarıdan lehimlemek zorunda kaldığım iki bağlantının kalitesi gurur verici değil ama işimi gördü.

Ucuz ST25 lerin hepsinin tek tek ölçülmesi gerektiğini gördüğümde bir SOP8/DIP8 adaptörü satın aldım, iyi de oldu.

SPI ADAPTÖR KARTI İLE NİHAİ KURULUM

Havadan giden 20cm lik SPI bağlantı kabloları -sonradan 10cm ye indirmeme rağmen- sistemin kararlı çalışmasına izin vermiyor. 18MHz lik veri hızları ile çalışıyoruz. Flash belleklerden bazıları sinyal yükselme/düşme sürelerine, parazitlere diğerlerinden daha duyarlı. Bazan çalışıp bazan çalışmama sorunları oluyor.

Sonunda kabloları aradan çıkarmak üzere küçük bir adaptör/bağlantı kartı hazırladım.

SST25VF / STM32 SPI bağlantısı için adaptör kartı

Böylece proje kurulumum daha derli toplu hale geldi, önceki dağınık montaj ile çalışmayan, arızalı diye ayırdığım flash bellekler de artık çalışır hale geldi.

SST25VF AYAK BAĞLANTILARI ve STM32 YE BAĞLANTILARI

ST25 in ayak bağlantıları Microchip data sheetinden aldığım haliyle aşağıdaki gibi:

Bu ayaklardan VDD, WP ve HOLD doğrudan 3.3 Volt Vcc ye bağlı. ST25 2.6 ila 3.6V arasında çalışıyor, en fazla 4.5 Volta dayanıyor, 5 Volt vermeyin sakın. (Ben verdim ! :))

Diğer bağlantılar :
CE : STM32 PB12
SCK: STM32 PB13. (SPI2 SCK)
SO : STM32 PB14. (SPI2 MISO)
SI : STM32 PB15. (SPI2 MOSI)

Kullandığım mikrodenetleyici modülü STM32F103C8 Pico devresi. Üzerinde 240×320 SPI TFT ekranı var. Ekran STM32 nin SPI1 portu üzerinde çalışıyor.

STM32 Cube IDE PROJE KURULUMU

Projenin yazılım kurulumunda çok özel bir şey yok. Mikrodenetleyici CPU saatini 72 MHz e ayarladım. SPI1 ve SPI2 portlarını etkinleştirip, ST25 e bağlanan SPI2 için prescaler’i 2 olarak seçtim. Bu durumda SPI2 hızı 18MHz oluyor.

Not: Havadan giden jumper kablolar ile yapılan SPI bağlantıları ile 2.25MHz den yüksek hızlarla çalışılamıyor. 

Herhangi bir kesme kullanmadığımdan NVIC ile yapılacak bir ayar yok.

ST25VF040 KOMUTLARI

Bu çalışma için Mikrochip’in SST25VF040B data sheetini göz önünde bulundurmak gerekiyor. Bu türdeki NOR Flash devreler üreticiden üreticiye farklılıklar gösteriyor. Örneğin Winbond’un WQ25 leri oldukça farklı. Birisi için yazılmış kod diğerini çalıştırmıyor.

KOD HAKKINDA

Proje kodlarını burada vermeyeceğim. Daha fazla bilgi isyteyen olursa yorum bırakabilir.

Projede aşağıdaki komutları kullanarak ST25Vf040B yi test ediyorum:

JEDEC ID READ : 0x9F
WREN – WRITE ENABLE : 0x06
SECTOR ERASE : 0x20
CHIP ERASE : 0x60
BYTE READ. : 0x03
HIZLI OKUMA. : 0x0B
BYTE PROGRAM : 0x02
AAI WORD PROGRAM : 0xAD
WRDI – WRITE DISABLE : 0x04
EWSR – STATUS REG WRITE ENABLE : 0x50
WRSR – WRITE STATUS REGISTER : 0x01
RDSR – READ STATUS REGISTER : 0x05
EBSY – ENABLE HW BUSY on SO : 0x70
DBSY – DISABLE HW BUSY on SO. : 0x80

Görüldüğü gibi Block Erase komutu dışındaki tüm komutlara işim düşmüş. Aslında Block Erase’i de test ettim, ama ucuz ürünlerde bu da Sector Erase gibi güvenilir biçimde çalışmadı.

PROGRAM İŞLEYİŞİ HAKKINDA

JEDEC ID OKUNMASI

Programa JEDEC ID okuyarak başlıyorum. Bu konutun başarısı aynı zamanda, başka fonksiyonlara el atmadan önce ST25 ile SPI iletişiminin sorunsuz olduğunu da gösteriyor.

Bu komut doğru çalıştığında bize 3 byte’dan oluşan bir bilgi sağlıyor:

Byte 1 : Üretici kodu – Mikrochip için bu 0xBF
Byte 2: Bellek tipi. – SPI Flash için bu 0x25
Byte 3: Device tipi. – ST25VF040B için bu 0x8E ya da 0x8D oluyor

STATUS REGISTER OKUNMASI VE AYARLARI

İkinci adımda status Register’i okuyorum. Açılışta varsayılan olarak bu register tüm sektörleri yazmaya karşı kilitli olarak 0b0011100 şeklinde geliyor. Belleğe birşeyler yazabilmek için ilk iş olarak bu Register’e 0x00 yazıyorum. Bunun için önce WREN komutunu ya da EWSR komutunu çalıştırmak gerekiyor.
Programın bundan sonraki aşamalarının çalışması için bu şart.

Status Registerini program akışı içinde de her komuttan önce okuyarak devrenin “meşgul” (bit 0) olup olmadığı kontrol ediyoruz.

OKUMA YAZMA HIZI

Yazmadan önce silme işlemi gerekmesi biraz yük getiriyor. 4096 byte lık bir sektörü silmek 25µS alıyor. Bu 4096 byte’ın her birine tek bir sefer yazabiliyorsunuz. eğer herhangi bir veriyi değiştirmek isterseniz, tüm sektörü tekrar silmeniz gerekiyor. (Yayının başındaki nota bakınız !)
Silinmiş bir sektöre 1 kByte lık bir bloku seri halde (AAI : Auto Address Increment) yazmak yaklaşık 5 mS sürüyor (Tbp*512) . Aynı diziyi 400 KHz ile çalışan bir I2C EEPROM’a ~20 ms de yazabilirsiniz. Bu önemli bir hız farkı.

SİLME/YAZMA DAYANIMI HAKKINDA

SST25VF için 10.000 silme-yazma garantisi veriyorlar. Bu rakam yeterince büyük gibi görünüyor ama cihazınız çalışırken sürekli yazıp silecek ise bir kere daha düşünmelisiniz.
Benim önüme gelen bir vakada, 7-8 yıldır günde 10-12 saat çalışan yüzlerce cihazın toplu halde arızalandıklarını görünce devredeki flash belleklerin ömürleri ile ilgilenmek zorunda kaldım.

Günde 10 silme-yazma işlemi yılda 3.650 ye ulaşarak cihazların ömrünü 2.5 yıl ile sınırlıyor.

Daha da sık silme/yazma yapma gereksiniminiz varsa başka çözümler üretmeniz gerekir, yaratıcılığınıza kalmış.

OKUMA YAZMA TESTLERİ

Bu projenin amacı bir sürücü kütüphanesi oluşturmanın yanısıra, muhtelif arızalı ürünler üzerinde kuşkulanılan ST25VF lerin test edilmesi için bir araç sağlamak.
Bu nedenle kütüphanedeki bir test fonksiyonu ile aşağıdaki işlemler uygulanabiliyor:

  • Her birisi 4096 byte olan 128 sektörü “Sector Erase” komutu ile silinip, her bir adres geri okunarak 0xFF değerini alıp almadıkları kontrol ediliyor.
  • Sector Erase işleminin sorunlu olduğu ucuz ürünlerde bu işlem Chip Erase ile yapılıyor.
  • Silinen her bir sektöre AAI (Auto Adresi Increment) modunda 4096 adet 0x00 değeri yazılıp, geri okunarak gerçekten 0x00 değerleri olup olmadığı kontrol ediliyor.
  • Yukarıdaki işlemler sırasındaki okumalarda “Hızlı okuma” modu kullanılarak test ediliyor.

SONUÇ

Geliştirdiğim kod ile Ali Express’den aldığım ucuz devrelerin 18MHz SPI hızında aşağıda sözünü ettiğim sorun dışında çalışabildiğini görebildim.

Sector Erase komutu her seferinde başarılı olmuyor, o nedenle kontrollu bir çevrim içinde başarılı sonuç alana kadar tekrarlatıyorum. Genelde bu çevrimi tek seferde başarıyla geçiyor, zaman zaman tutukluk yaptığında da bu tekrarlama işlemi de işe yaramıyor. Bu sorunun nedeni 20cm lik jumper tellerle yaptığım bağlantı yumağı olabilir, ST25 lerin kalitesinden de kaynaklanıyor olabilir. Chip Erase sorunsuz, diğer yazma-okuma işlemleri de sorunsuz. Block Erase komutu da stabil değil.

Güncelleme : Bendeki ucuz Aliexpress SST25VF040B-50-4C-S2AF belleklerinin ucuzluğunun nedeninin Sector Erase işleminin sorunlu olmasından kaynaklandığı anlaşılıyor. Bunlar ancak Chip_Erase komutu ile silinerek kullanılabiliyor. Aralarında her zaman, ya da arada bir çalışanlar da çıkabiliyor ama güvenilir değil, başlangıçta Sector Erase ile çalışanlar olsa da birkaç silme-yazmadan sonra bozulabiliyorlar.

Ben elimdeki 20 adet SST25 in hepsini tek tek test ettim. İçlerinden 4 adedi bozuk çıktı, dikkatli inceleyince içlerinden birisinde üreticinin üzerine koyduğu mor beneğin (reject işareti) dahi durduğunu gördüm.

Montajı jumper kablolardan temizleyip STM32 ye SPI bağlantılarını adaptör kartı ile yapınca arızalı olarak ayırdığım bu 4 adetten 3 ü daha çalışır hale geldi.


25 MHz de çalışan uygulamam için emin olabilmek adına MicroChip üretimi olduğundan emin olduğum -ama 10 katı fiyatına- birkaç ST25 daha sipariş ettim. Eğer ilk partide sorun çıkarsa bunları deneyeceğim.

Bu yayının sonu. Selçuk Özbayraktar Mayıs 2021