24CXX seri eepromlar
24CXX seri eeprom donanımını ve protokollerden patenti Philips firmasına ait olan i2c�nin seri eepromlarda kullanımını ardından da bu hafızaların kopyalanmasını sağlayan bir uygulamayı bu yazıda bulacaksınız.
Mikrokontrolör uygulamalarında dahili hafızaların yeterli olmadığı durumlarda harici seri hafızalara başvurulur. Amaç veri toplamak ve saklamak veya saklanmış verileri kullanmak olabilir. Veri erişim hızının yüksek olmadığı ve giriş/çıkış bacak sayısının önem kazandığı mikrokontrolör uygulamalarında çevre donanım elemanlarının (eeprom, rtc, sıcaklık ve nem sensörleri gibi) mikrokontrolöre bağlantı şekli önem kazanmış ve mümkün olan en az sayıda bağlantı olması arzulanmıştır. Bu şekilde data/clock (veri/saat pulsu) veya 1 wire (tek telli) gibi bağlantı standartları geliştirilmiştir. Tabiidir ki bu bağlantıları destekleyen protokoller de geliştirilmiştir (i2c, spi, �)
Bu makalede 24CXX seri eeprom donanımını ve protokollerden patenti Philips firmasına ait olan i2c�nin seri eepromlarda kullanımını anlattıktan sonra bu hafızaların kopyalanmasını sağlayan kendi tasarımım olan bir uygulamayı anlatacağım. Benim anlatacağım 512 byte ile 32 kbyte kapasiteli seri eepromların (24c04 -�- 24c256) kopyalanması veya içerisindeki bilgilerin düzenlenmesi amaçlayan bir uygulama devresi olacak.
i2c protokolünü anlatmadan önce data/clock yapısının nasıl işlediğine bir gözatalım. Bilgi akışının mikrokontrolörden seri eeprom yönüne doğru olduğunu varsayalım. Seri eeproma gelen her bir saat sinyali, data hattında kendisi tarafından okunması gereken bir bilginin hazır olduğunu bildirir. Bu bilgi seri eeprom tarafından okunur. Mikrokontrolör tarafından üretilen clock (saat) sinyali seri eepromun adım adım kontrol edilmesini sağlar.
Data/clock seri haberleşmesinde clock (saat) sinyali aktiflenmeden önce seri hale dönüştürülmekte olan bilginin sıradaki biti veri hattında hazır tutulur. Aktiflenen saat sinyali ile bu veri biti seri eeproma iletilmiş olur. Bilgi akışı ters yönde ise her bir saat sinyali aktiflenmesinde seri eeprom data hattına bilginin sıradaki bitini koyar. Mikrokontrolorde bu bilginin okunup paralel hale getirilmesi sağlanır.
Seri eeproma bilginin gönderilmesi aşamasında bazı ilave bilgiler gönderilirken, bazı bilgiler de alınır. Bunlar, başla, okuma-yazma komutu, adres bilgisi, alındı bilgisi ve tamam-devam bilgisi, bitir komutu vs. dirler.
24CXX SERİSİ SERİ EEPROMLAR
24 serisi eepromların bacak isimlendirmesi ve görevleri bakımından iki gruba ayrılmaktadır. Bazı üreticilerin ürünlerinde farklılık olmakla beraber genelde bu iki grup yapı standartlaşmıştır. 24c01 den 24c16 ya kadar olanlara grup1 dersek, 24c32 den 24c512 ye kadar olanlara grup2 olarak tarif edebiliriz.
[Vss: toprak, Vcc: besleme, WP: yazma koruması, SCL: clock (saat), SDA: data (veri), NC: boş (no connection), AO, A1, grup2 seri eepromlarda çipi seçmek için kullanılır.]
Haberleşmenin başlatılması ve bitirilmesi (START/STOP) için kullanılan komut her iki grup için de aynıdır.
Başla komutu, saat sinyali Vcc de iken, veri hattının 0 Volta çekilmesi ile aktiflenir. Bitir komutu ise yine saat sinyali Vcc de iken, veri hattının 0 Volttan Vcc ye çekilmesi ile aktiflenir. Verilerin hat üzerinde değiştirilmesi saat sinyali 0 volt düzeyinde iken gerçekleştirilir.
Grup1 seri eepromlarda kontrol baytından sonra bir tane adres baytı gönderilir.
24c02 256 baytlık hafıza olduğu için bir baytlık adres bilgisi ile kolayca adreslenebilmektedir. 24c04-24c16 arası seri eepromlarda bir bayt çipin bütün adreslerine erişmek için yeterli olmadığından kontrol baytındaki boşta kalan 3 bit bu çip içerisindeki alanları adreslemekte kullanılır. (Aşağıdaki resimde XXX ile gösterilen alan)
Grup 1 çiplerini yazmaya karşı korumak için bir bacak ayrılmıştır. Çip üzerinde A0,A1,A2 olarak gösterilen bacakların bir görevi yoktur. Boşta bırakılabilir, yada toprak veya Vcc ye bağlanabilir.
Grup 2 seri eepromlarda kontrol baytından sonra iki tane adres baytı gönderilir. 2 bayt ile en fazla 64 Kbayt adreslenebildiği için 24c32 (4 Kbayt) den 24c512 (64Kbayt) ye kadar ki çipler bu iki adres baytı ile rahatlıkla adreslenebilmektedir.
Kontrol baytı içerisinde kalan 3 bitlik boş alan ise çiplerin adreslenmesinde (chip select yada device select)
Bu sayede aynı data/clock hattı üzerinde bu çiplerden en fazla 8 tanesi bağlanabilir hale getirilmiştir. Çip üzerinde A0,A1,A2 olarak gösterilen bacakların görevi çiplerin adreslenmesini sağlamaktır. Örnek olarak bir çipde bu bacaklar A0 toprağa, A1 Vcc ye, A2 toprağa bağlanmış ise, bu çipe bilgi yazmak yada bilgi okumak için kontrol baytı A2 biti 0, A1 biti 1, A0 biti 0 olarak hazırlanmalıdır. Yazmaya karşı koruma grup2 çiplerde bulunmamaktadır.
Kontrol baytı hazırlanması da i2c protokolünde standartlaştırılmıştır. İlk 4 biti seri eepromlarda ve ramlerde hex (10) yada 0xA ile başlar. I2C protokolü kullanan bazı rtc lerde (real time clock) de kontrol baytı 0xA ile başlamaktadır. Seri eeprom haberleşmesinde kontrol baytı 0xA ile başlamazsa, geri kalan bilgiler ne kadar da standarta uysa haberleşme gerçekleşmez. Bu şekilde aynı veri / saat yolu üzerinde farklı kontrol baytı ile başlayan çipler de bağlanabilmektedir (bilgi kaybının ve harici gürültülerin azaltılması için haberleşme hızı düşürülmeli ve hat mümkün olduğunca kısa tutulmalıdır.)
Kontrol baytında ikinci 4 bitlik alanda A2, A1, A0 ve okuma/yazma biti bulunmaktadır. 4. bit 0 (sıfır) ise yazma (mikrokontrolorden �O�ut), 1 (bir) ise okuma (mikrokontrolore �I�nput)
Haberleşme sırasında mikrokontrolörden gönderilen her bir bayt bilgi arkasından seri eeprom alındı bilgisi olarak bir bit cevap verir (acknowledge, 0 volt). Bunun tersi durumda da yani seri eepromdan bilgi okunurken de mikrokontrolör, gelen her bir bayt bilgi arkasından bir bitlik alındı bilgisi göndermesi gerekir. Haberleşmenin durdurulması alındı bilgisinin tersi (nack, Vcc) ve ardından stop komutunun gönderilmesiyle sağlanır. Haberleşmenin herhangi bir zamanda kesilmesi için �başlat� veya �bitir� komutu göndermek yeterlidir.
GRUP 1 ve GRUP 2 SERİ EEPROMLARDA OKUMA VE YAZDIRMA İŞLEMLERİ
GRUP1 SERİ EEPROMLARDA OKUMA İŞLEMİ
herhangi bir adresten okuma işlemi şekilde görüldüğü gibidir.
Seri eeprom okuma komutunda doğrudan okunacak adres bilgisi gönderilemediği için seri eeprom önce o adrese yazdırma işlemi yapılacakmış gibi kandırılır fakat yazdırma işlemi yapılmadan tekrar start komutu gönderilir. Bu şekilde bilgi okunacak adresin seri eeprom içerinde saklanması sağlanır. Daha sonra okuma işlemi seri eeprom içerisinde saklanan bu adresten yapılır. Seri eeprom kendisinden istenen bilgiyi seri olarak gönderdikten sonra en son okunan adres değerini bir arttırır ve mikrokontrolorden gelecek tamammı (nack) devammı (ack) bilgisini bekler. Okuma işlemi istenirse kesintisiz olarak bu şekilde devam ettirilebilir.
Yukarıda da belirttiğimiz gibi her okuma işlemi bittikten sonra seri eeprom içerisinde en son okunan adres değeri bir arttırılarak saklanır (stop komutu gönderilmiş olsa bile). Eğer en son okunan adresten sonraki adres okunmak istenirse bu adres tekrar gönderilmez ve �Current Read� adı verilen işlemle o adresteki bilgi okunmuş olur.
Bu işlem birim zamandaki haberleşme sayısını arttırmakta kulklanılır.
Bu okuma işleminden sonra da seri eeprom içerisindeki en son okunan adres bilgisi tekrar bir arttırılarak saklanır.
GRUP1 SERİ EEPROMLARDA BİLGİ YAZDIRMA
herhangi bir adrese yazdırma işlemi şekilde görüldüğü gibidir.
Bu şekilde görünen işlem �page write� işlemidir ve isteğe bağlı sayıda (Grup 1 için en fazla 16 bayt, grup 2 için en fazla 8×8=64 bayt) bilgi aynı anda yazdırılabilir. Page write işlemi dikkatli yapılması gereken bir işlemdir ve mutlaka her bir tipin datasheetinden dikkatlice okunup uygulanması gerekir. Page sınırlarından sonra devem eden okuma yada yazma işlemleri tampon belleğin başına dönülüp, bilgilerin kaybolmasına neden olabilir !
GRUP2 SERİ EEPROMLARDA OKUMA İŞLEMİ
herhangi bir adresten okuma işlemi şekilde görüldüğü gibidir.
Okuma işlemi için adres girmek Grup1 de anlatıldığı gibidir. �NO ACK� komutu yerine �ACK� komutu gönderilerek sonraki 1 bayt bilgide okunabilirdi. Bu şekilde tekrar tekrar start-kontrol-adres1-adres0-start-kontrol baytları gönderilmeden hafızanın tamamı okunabilir.
�Current Read� işlemi
GRUP2 SERİ EEPROMLARDA YAZMA İŞLEMİ
herhangi bir adrese yazdırma işlemi aşağıdaki şekilde görüldüğü gibidir.
2432_pagewr.jpg
Bu işlem �page write� işlemidir. �Data n� ile gösterilen bilgi seri eeproma gönderildikten sonra �STOP� komutu gönderilirse bir baytlık bilgi seri eeproma yazdırılmış olur.
2432_bytewr.jpg
I2C PROGRAMLAYICI/KOPYALAYICI
Şemayı görmek için buraya tıklayın.
Devre şemasından da görüleceği üzere mikrokontrolör olarak PIC16f628 kullanılmıştır. İki seri eeprom yerleştirilmesi amacıyla aynı hat üzerine iki soket monte edilmiştir. Veri ve saat yolunu ayrı ayrı Vcc ye bağlayan iki adet direnç bulunmaktadır. Bunlar her iki hattı Vcc ye çeken (pull-up) dirençlerdir. Saat hattı normalde çekme direnci gerektirmemektedir. Fakat Jal i2c kütüphaneleri saat hattının da çekme direnci ile bağlanmasını gerektirecek şekilde tasarlanmıştır. Hem seri eeprom tipini ve hem de yazma işleminde hata olup olmadığını göstermek amacıyla 7 adet led devreye bağlanmıştır. İki adet butondan birisi seri eeprom tipini değiştirmekte kullanılırken, diğeri soketlere yerleştirilmiş aynı tipte seri eepromlardan soket 0 da bulunanın içeriğini soket 1 de bulunana kopyalamak için kullanılmıştır. PC ile haberleşmede seri haberleşme protokolü (uart) kullanılmıştır. Seri port elektirksel arabirimi olarak PC�leriin standart kullandığı rs232 seçilmiştir.
Bu devre tasarımına Jal derleyicindeki i2c rutinlerinin geliştirilmesi ve test edilmesi amacıyla başlandı. Genel olarak şu işlemleri gerçekleştirilebilmektedir:
1. bir adet seri eeprom içerisindeki bilgiyi aynı kapasitedeki diğerine kopyalamak (PC bağlantısı kullanılarak)
2. birinci maddedeki işlemi PC bağlantısı olmadan devre üzerindeki butonlarla gerçekleştirmek (bu şekilde taşınabilir bir kopyalayıcı olarak kullanılabilir)
3. seri eeprom içeriğini bilgisayara aktarmak veya bilgisayardaki bilgiyi seri eeproma yazdırmak
4. seri eeprom içerisindeki adreslere ulaşıp, içeriğini tek tek değiştirmek
5. istenen sayıda bilgiyi seri eepromun istenilen adresinden başlayarak yazdırmak.
Programlanacak yada üzerinde düzenleme yapılacak seri eeprom 1 nolu sokete yerleştirilmelidir. PCden haberleştirilecek ise haberleşme programında (hyperterminal, minicom, �) haberleşme ayarlarından hardware flow kontrolü seçilmelidir.
Devreye güç verildiğinde (regüleli 5 V yada 4 kalem pil olabilir) hyperterminal ekranına şu bilgiler gelir:
i2c programmer/copier
C-2002 Ziya ERDEMIR
Ready…
Echo On
Mode Ascii
I2C 24C32
>
Program burada ya bir komut girilmesini yada devre üzerindeki butonlara basılmasını bekler. Kullanım hakkında kısa bilgi alabilmek için klavyeden h tuşuna basılır.
>h
w: write
r: read
f: fill
o: overlay
c: copy
d: dump to PC
s: status
i: device (3 for 24C32)
e: echo
a: ascii
b: binary
h: help
>
geçerli ayarları görebilmek için s tuşuna basılırsa ekranda
>s
Echo On
Mode Ascii
I2C 24C32
>
görünür. �Echo on� klavyeden girilen komutların hyperterminal ekranında görülmesini sağlar. �Mode Ascii� kopyalanacak bilgilerin ascii kodlarının hexadesimal sayılar olarak gönderilmesini veya alınmasını sağlar. �I2C 24C32� kopyalanacak seri eepromun 4 kbytelık (24c32) olduğunu belirtir.
�Echo� geçerli modunu değiştirmek için klavyeden bir defa e tuşuna basmak yeterlidir. Girilen komutlardan sonra durum bilgileri ekranda görüntülenir.
>e
Echo Off
Mode Ascii
I2C 24C32
>
seri eeprom içerisinden tek bir byte okunmak istenirse klavyeden r tuşuna basılır. Ekranda okunacak adres sorulacaktır (�>Adr(hex)?�). Adres soru işaretinden sonra girilir. Esc tuşu komutu iptal eder. Yanlış adres girilirse backspace tuşuna (yada �ß�) basarak yanlışlık düzeltilebilir. Ekranda:
>rAdr(hex)? 0012
0012 C2
>
görünür. Burada C2 yerine başka birşey de görünebilir. Benim denememde C2 hex 0012 (desimal 18) adresinde ascii kodu 0xC2 olan bir bilginin bulunduğu anlamına gelmektedir.
Eğer hemen bir sonraki adresteki bilgi okunma
k istenirse tekrar r tuşuna basıp 0x0013 adresini girmek yerine sadece n (next anlamında) tuşuna basmak yeterlidir. Aslında n komutu bir önceki komut ne ise onu tekrar işletir.
>n
0013 7D
>n — echo off modunda �r� görüntülenmez.
0014 E0 � binary modu seçilmiş olsaydı 0xE0�ın ascii eşdeğeri olan karakter görüntülenecekti.
>n
0015 73 � içeriği okunacak adres mikrokontrolör içerisinde otomatik olarak arttırılır.
�Echo off� ve �binary� modunda klavyede �r� tuşuna basılırsa
> — bu satırda �r� nin ekosu görünmüyor.
Adr(hex)? 0012 � adres girilir
>0012 Â — peşpeşe klavyeden n tuşuna basılırsa
>0013 }
>0014 é
>0015 �
>0016 a
>0017 y
>
görüntülenir.
Hafızada (seri eeprom) herhangi bir adrese bir byte yazmak için klavyeden �w� tuşuna basılır.
>w — eko modu açıldığında basılan tuş �w� ekranda görünür.
Adr(hex)? 0014 � yazılacak adresin hexadesimal değeri girilir. (Esc tuşu komutu iptal eder)
dat E0-> E9 — girilen adreste bulunan değer gösterildikten sonra yazılacak yeni değer girilmesi istenir. Burada backspace malesef çalışmıyor.
0014 E9 — girilen değerin kontrol edilmesi amacıyla aynı adres tekrar okutulup ekranda görüntülenir.
>
Hex sayılar girilirken burada dikkatli olmak gerekir çünkü backspace veya herhangi bir düzenleme tuşu çalışmaz.
En son girilen komut �w� olduğu için klavyeden �n� tuşuna basılırsa en son yazılan adres bir arttırılarak yeniden bir byte yazma komutu işletilir. Adres bir arttırılmış olduğu için bizden sadece yazılacak bilginin �ascii� modunda hex değeri �binary� modunda ascii eşdeğeri karakter girilmesi istenir.
w
dat 73-> 84
0015 84
Okunacak yada yazılacak seri eeprom tipini değiştirmek için klavyeden �i� tuşuna basılır veya devre üzerindeki �Device_but� butonuna basılır.
i 6 — eeprom tipini 24c256 ya dönüştürmek için klavyeden 6 rakamı girilir. Devre üzerinde 24c256ya karşılık gelen led aktiflenir, bir öncekine karşılık gelen led söndürülür. Ekranda
Echo On
Mode Binary
I2C 24C256
görüntülenir. �I2C 24C256� satırı o an 24C256 seri eepromu için işlem yapılabileceğini göstermektedir. (İlk başta bu tip 24c32 dir)
tiplere karşılık gelen sayılar şu şekildedir:
0 = 24c04
1 = 24c08
2 = 24c16
3 = 24c32
4 = 24c64
5 = 24c128
6 = 24c256
24C256�nın 24C32 veya 24c512den tek farkı kapasitesidir. Devreye eklenecek bir led ve yazılımda yapılacak bir düzenleme ile 24c512 de desteklenebilir.
Seri eeprom içeriğinin tamamının bilgisayar ekranına indirilmesi için klavyeden �d� tuşuna basılır:
�echo� ve �ascii� modunda ekranda:
dF1F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFCA2EC27DE07361796573696E6465FFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF… � bu sayılar hex sayılar olduğu için örneğin F1 hex 0xF1 (bir bayt) demektir
görüntülenir.
�echo� ve �binary� modunda ekranda:
ñğÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊ.Â}é�ayesindeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
meyaptÿÿÿÿÿDeneme…
görüntülenir.
Hafızanın belirli bir bölümüne belirli bir sayıda (en fazla 256 bayt) bilgi yazmak için önce yazılacak bilgi herhangi bir editör programında seçilip menüden �copy� (veya ctrl+c) seçeneği ile yazılacak bilgi clipboarda aktarılır. Hyperterminal penceresinde o tuşuna basılır.
o
Adr(hex)? 0080 � yazılacak alanın başlangıç adresi girilir.
# of dat -> 09 � yazılacak bilginin uzunluğu hexadesimal sayı olarak girilir.
Send data — ekranda bu satır görününce şu işlem yapılmalıdır:
hyperterminal çekme menüsünden Edit->paste (Düzenle->yapıştır) seçilir. �binary� modunda karakter katarı, ascii modunda karakter katarının içerisindeki her bir karakterin ascii karşılıkları clipboarddan hyperterminal penceresine yapıştırılmalıdır (Microsof yazılımlarında standart olan �ctrl+v� hyperterminal penceresinde kesinlikle kullanılmamalıdır, çünkü komut değil karakter tuşlaması olarak algılanır).
Clipboarda �clipboard� yazısı kopyalanmış olsun. �binary� modunda:
o
Adr(hex)? 0080 — başlangıç adresi mesela 0x0080 girilir.
# of dat -> 0A — 10 baytlık bilgi girilecek (0x0A).
Send data — terminal programından Edit->paste seçilir
clipboard. � bilgi hafızaya kaydedilirken aynı zamanda terminal ekranına yazılan karakterlerin ekosu yapılır.
Kayıt yapılıp yapılmadığını kontrol etmek için klavyeden �r� tuşuna basılırsa
Adr(hex)? 0080 � başlangıç adresini girelim.
0080 c — �n� tuşuna basılır
0081 l � �n� tuşuna basılır
0082 i — �n� tuşuna basılır
0083 p — �n� tuşuna basılır
0084 b — �n� tuşuna basılır
0085 o — �n� tuşuna basılır
0086 a — �n� tuşuna basılır
0087 r — �n� tuşuna basılır
0088 d — �n� tuşuna basılır
0089 . — �n� tuşuna basılır
008A — �n� tuşuna basılır
008B —
Başta hatırlatmıştık ama birkez de burada hatırlatalım, terminal programında haberleşme ayarlarında hardware flow kontrolünü mutlaka aktifleyin. Çünkü seri eeproma bilginin yazılması haberleşme hızından daha yavaş olduğu için bilgi kaybının önlenmesi açısından bu ayar mutlaka gereklidir.
Seri eeprom içeriğinin tamamını PCden gönderilen bilgilerle doldurmak için klavyeden �f� tuşu kullanılır. Bu komutun kullanımı �o� komutundan daha basittir. Yine kopyalanacak bilgi herhangi bir editörden seçilerek edit->copy (windos ortamında ctrl+c) clipboarda aktarılır. Kopyalanan bilgiler hex formatında ise �ascii�, normal karakter ise �binary� moduna geçilir. Klavyeden �f� tuşuna basılır. Başlangıç adresi 0x0000 olduğu için yazılmaya başlanacak adres sorulmaz.
f
Send data � burada terminal ekranında menüden edit->paste seçilir.
Kopyalanan bilgi sayısı seri eepromun kapasine eşit olmalıdır. (fazla olursa kalanı kopyalanmayacaktır).
Bir seri eeprom içeriğinin aynı tipteki diğerine kopyalanması için terminal penceresinde iken klavyeden �c� tuşuna basılır yada devre üzerindeki �prog_button� butonuna basılır. Bu ikinci seçeneğin amacı PC bağlantısı olmadan da kopyalama amacıyla devremizin kullanılabilir olmasını sağlamaktır.
Kopyası alınacak seri eeprom 0 nolu soket de ve henüz yazılmamış olan (taze seri eeprom) da 1 nolu sokete yerleştirilmelidir.
Eğer kopyalama(�c�)/PCye transfer (�d�)/PCden ful transfer (�f�) işlemleri hatasız tamalanırsa devre üzerindeki ledlerde sağdan sola, soldan sağa birkaç defa ışık hareketleri gösterilir. Eğer bu işlemlerde
hata oluşmuş ise devre üzerindeki 3 led yanıp söner. Bu özellikle PC olmadan yapılan kopyalarda kullanıcıya işlemde sorun olup olmadığını göstermek açısından önemlidir.
Projenin kaynak kodu aşağıdaki adrestedir: http://groups.yahoo.com/group/jallist/files/Ziya%20Erdemir/i2c%20copier%20Ver-1.1.zip
Devremizin bilinen tek sorunu yazma işleminin yavaş olmasıdır. Bunun sebebi ise seri eeprom da �page write� işlemini uygulayacak kadar mikrokontrolörümüzde program alanının kalmamış olmasıdır. Sonraki versiyonlarda bu konu üzerinde çalışıp yazma hızını seri eeprom tampon hafızası kadar yani 16 ile 64 kat arttıracağım.
Faydalı olması ümidiyle…..
Yorum, öneri, tavsiye, hata bildirimleri ile PCB çizimi memnuniyetle karşılanacaktır.
Ziya ERDEMIR
Nukleer Enerji Yuksek Muhendisi