Wednesday 13 February 2019

Arduino'ya Nasıl Paralel Flash Bellek Eklenir

Pil profili oluşturucu - son Arduino projem - Arduino tarafından kontrol edilen
 bir tür flash bellekte büyük miktarda veri depolamak gerekiyordu. Geçmişte 
bunun için Winbond'un seri tahtası (SPI) yongası W25Q80BV'yi bir breadboard-dostu 
PDIP-8 paketi ile birlikte kullandım. Bu mükemmel eğiticiye bakınBunun nasıl 
yapıldığına ve bunun neden bir SD karttan tercih edildiğine dair sebepler. 
Ancak çip artık mevcut değil ve alternatifleri ararken paralel flash bellekli bir 
süre flört ettim. Paralel hafıza? İlk başta, bu Arduino ile umutsuz bir uyumsuzluk 
gibi görünüyor. Sonuçta, paralel mantık yongaları paralel olarak bağlanması 
gereken çok sayıda pime sahiptir. Örneğin, kullandığım çip, SST39SF010A, 
32 (!) PDIP pinine sahip. Adres pimleri tek başına 17'ye kadar sayılır! Pro Mini 
gibi pin fakir Arduino'nun bu tür yüklerle başa çıkmasına imkan yok. Ancak,
 birkaç ek yonga ile, iletişim için 6 Arduino pin artı I2C pin kadar az kullanarak 
bellek yongasını başarılı bir şekilde seri hale getirebildim.


Sonunda, yüzeye monte bileşenlerden duyduğum korkumun 
üstesinden geldim (bunları lehimlemek gerçekten kolay!) Ve 
bitmiş pil profilcim, SOIC paketindeki Winbond'dan küçük ama 
güçlü 32 MB'lık modern _serial_ çipini kullanıyor. Ancak paralel
 belleği Arduino'ya bağlamak, yazılım yazmak ve her şeyin çalışmasını 
sağlamak için çok çaba harcadığımdan, bu Eğitilebilir'i yazmaya karar verdim. 
Belki birileri paralel mantık cihazlarını Arduino'ya bağlamanın genel bir tarifi 
olarak yararlı bulabilir. Belki ölen bir mobil cihazdan veri kurtarma?



Parçalar:
SST yongası, 128 kB kapasitesini karşılamak için 17 bitlik adres için A0 - A16 
pinlerini kullanır. 74HC595 kaydırma yazmacı, QA-QH pinlerinde tek pimli seri 
girişi olan pin SER'yi 8-bit paralel çıkışa "dönüştürmek" için tasarlanmıştır. 
Çip, bir bitin bitip diğeri başladığında “bilmesi” gerektiğinden, kontrol için iki ek pim kullanmalıdır (saat ve mandal). Bununla birlikte, bu çipin güzelliği, ikisini bir papatya zincirine etkili bir şekilde yerleştiren başka bir vardiya kaydının SER pimine 
bağlanabilen ek bir çıkış pimi QH 'dir. İki papatya zinciri 74HC595'in çıktısı 
16 bit, üç 24 vb.
SST39SF010A'nın adres alanını kaplamak için iki vardiya kaydına ihtiyacımız var.
 "Bekle bir dakika" diyebilirsiniz, "bu kadar eklemez. SST39SF010A tarafından ihtiyaç duyulan 17 bilgisayara nasıl 16 paralel pin bağlanabilir?" Ah, arkadaşım, zincirdeki son 74HC595'in QH pimi eksik 17. bitleri sağlıyor. Bu nedenle, sadece bir bit kapsayacak 
şekilde üçüncü bir vardiya kaydının "boşa harcanmasına" gerek yoktur. Ekteki şemalara bakın: iki vardiya yazıcısı tüm A0-A16 bellek adres pinlerini güzelce kaplar. Genel olarak, vardiya kayıtları 3 Arduino pini kullanır.
74HC595 ne kadar güzel olursa, yalnızca paralel bitler gönderebilir, ancak bunları alamaz. Bu nedenle, SST'nin veri pinlerini (D0 ila D7) Arduino'ya bağlamak için 
başka bir çözüme ihtiyacımız var. Microchip'ten MCP23008 I / O genişletici şeklinde 
kendini gösterir. Vardiya kayıtlarından daha pahalıdır, ancak paralel olarak 8 bit 
okuyabilir ve SDA ve SCL pinlerindeki I2C protokolü ile bunları Arduino'ya kaydırabilir.
 I2C için karşılık gelen pimler, Arduino Pro Mini'de (panelin ortasında) A4 ve A5 ve 
Arduino Mega'da 20,21 pimleridir. Bunlar, çipin kullandığı tek 2 Arduino pinidir; bu, aynı anda birden fazla I2C cihazının bağlanabileceğini düşünen bir şey değildir. Açıkça 
sorulan soru şudur: SST adres pinleri için iki vardiya kaydı yerine üç I / O genişletici kullanılabilir mi? Evet tabi ki. Benim konuğum ol ve bu değişikliği yap.
Son bağlantılar, bellek yongasının üzerindeki WE #, CE # ve OE # pinlerine yapılmalıdır: bunlar yonga kontrolü için kullanılır. Bu nedenle, Arduino pinlerinin toplam kullanımı, 
6 dijital pin artı 2 I2C pin içerir.


Adım 2: Yazılım


Ptorelli, flash belleğin nasıl çalıştığını bana bir ton yazma tasarrufu sağladığını zaten açıkladı SST yongası farklı değil: fabrikadan yeni çıkan boş yonga her biti "1" olarak ayarladı ya da tercih ederseniz, her bayt onaltılık olarak 0xFF okur. Ptorelli, neden tek 
bir bayta kolayca yazabildiğinizi açıklarken, silme o anda en az bir sektörden yapılmalıdır. SST'nin sektör büyüklüğü 4096 bayta eşittir (onaltılık 0x1000) ve SST'nin toplam 32 sektörü vardır; yukarıdaki resme bakın. Ptorelli ayrıca flash belleğin neden 
100k silme döngüsünün sınırlı bir ömre sahip olduğunu da açıklıyor. Veri depolama,
 örneğin her seferinde bayt 0'dan başlarsa, ilk sektör oldukça hızlı bir şekilde "ölür", son sektörler kullanılmadan kalır. Bu nedenle,En basit log-yapılandırılmış aşınma dengeleme algoritmasını benimsedim Benim durumumda 0-30 kesimleri sırayla bayt 0x0'dan bayt 0X1EFFF'ye yazılan ve daha sonra tekrar 0x0'a sarılmış olan verilerin depolanması için dairesel bir tampon olarak ayırdım. 31 numaralı son sektör, her bir dosyanın başlangıcındaki 3 baytlık adresleri depolamak için dairesel bir tampon işlevi görür. Uygulamamda, yalnızca yazılı veri yığınını önemsiyorum, fakat örneğin isimler ve / veya tarihler ekleyerek gerçek bir dosya sistemi oluşturabilirsiniz.
Bu proje için yazdığım kütüphanelere şu depolardan erişilebilir:
ParallelMemoryInArduino kütüphanesi ayrıca aşağıdakileri içeren bir demo taslağını içerir:
1) yongadan en son 20x4 şamandıralar tablosunu okur ve Seri Monitörde görüntüler
2) yongaya yeni bir 20x4 rasgele yüzen tablo tablosu yazar
Yukarıdaki görüntülerden biri tipik çıktı içeriyor

No comments: