Eeprom

Başlatan Serk@n, 08 Şubat 2021, 08:51:09

Serk@n

Hocam benim plaket iki üstteki mesajda. Alttaki resim internette bulduğum örnek. Elektronikçi değil bir kasap yapmış sanırım lehimi :)
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n

Hocam şimdilik gelişmeler şunlar:

GND hakkında bir tereddütüm kalmadı. İnternette bulduğum şemalarda adres pinlerine GND verilerek işlem sağlanmış. Ben de o şekilde yapıyorum.

Eepromun slave adresi 10 bit imiş. Henüz 8 bit i2C.yi anlamaya çalışırken 10 bit i2C'yi çözmeye bilgi seviyem yeterli şimdilik gelmedi.

Ben okuma işlemini Arduino ile yapacaktım. Arduino'nun i2C'si 8 bit işlem kabiliyetine sahip.

Dolayısıyla 10 bit adreslik i2C'nin veri protokolünü anlayıp bit seviyesinde verileri gönderip-almaya çalışmam gerekebilir diye düşünüyorum.

Bunu usartta yapmıştım. Pinleri açıp kapatarak istediğim verileri gönderebilmiştim.

Bir tavsiyeniz olursa takipteyim.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

ete

Adres hem 8 bit hemde 16 bit (yada 10 bit) olabilir. Bu verdiğin adres bilgisine göre değişir.
Adresin 10 bitlik ise peş peşe LOW byte ve high Byte olarak vereceksin hepsi bu.
Denemekten bir şey çıkmaz. Dene bence. Açıklama şöyle diyor;

 The Address size sent (byte or word) is determined by the size of the variable that is used. If a byte-sized variable is used for the Address, an 8-bit address is sent. If a word-sized variable is used, a 16-bit address is sent. Tercimesi şöyle Adres büyüklüğünü (byte veya Word) bu iş için kullanılan değişken belirler. Şayet word değişkeni kullanılır ise 16 bit adres yollanır yada 8 bit değişken kullanılırsa 8 bit adres gönderilir

Ete

Serk@n



Hocam, son gelişmeler...

10 bit adres protokolünden anladığım kadarıyla, 8 bit adresin ilk bilgilerini gönderdikten sonra epromdan bir ACK almam gerekiyor. Adresin ikinci 8 bitlik kısmını da gönderince bir ACK daha almam gerekiyor.

Henüz bit seviyesinde işlem yapmıyorum. Arduino şimdilik işimi görecek gibi. Arduino'dan ilk 8 biti eeproma göndererek bir ACK bilgisi almaya çalışıyorum. Fakat 0-255 arası bütün ihtimalleri denememe rağmen hiçbirinden ilk gelmesi gereken ACK biti dönmedi. Hepsinde NACK verisi aldım.

GND.den yine şüphelendim. 4. pini adres pinlerine bağladım. Sonuç aynı.

Pull-up dirençlerim 4,7K idi. İnternetteki şemalarda 18K idi. İkisine seri 10K taktım. Sonuç yine aynı.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

ete

Basic ACK bilgilerini otomatik alır. Arduino da da öyle olması gerek ama emin değilim.
Bu durumda işin mekanizmasını biraz açıklamam lazım.
ACK yı işlemci alacak ise,
Data pininden veri yi bit bit çıkartır. Bu konumda Data pini OUT olarak çalışır. Veri aktarımı bitince ACK almak üzere Data pini input yapılır. Pullup dan dolayı pin otomatik HIGH konumuna geçer ve işlemci Data pininin karşı taraftan LOW yapılmasını bekler. Geldiği anda ACK alınmış olur. Şayet belirli bir süre içinde Bu low sinyali gelmez ise işlemci NACK durumunu yani ACK alınmadı durumunu ilan eder.
Burada önemli olan Data pininin Çıkıştan giriş konumuna çevrilmesi işlemidir. Bu yapılmaz ise hiç bir zaman ACK alınmaz.

Ete

Serk@n

#35
ACK pinini Arduino da otomatik alıyor hocam. Bir baytlık veri aktarımını bitirdikten sonra bir değişkene 0'dan 4'e kadar bir değer atıyor. Bu değişkene bakarak işlemin sonucunu öğreniyorum.

0-ACK başarılı diğerleri hata kodu.

I2c.yi slave adresi vererek başlat komutunu verdiğimde start işlemini yapıyor, 7 bitlik adresi ekliyor, R/W bitini ekliyor ve ACK bekliyor.

Başlat komutuna sadece 7 bitlik veri girilebilir.

Bu başlatma işleminden sonra 8 bitlik veriler yazdırılabiliyor.

Benim bu durumda iki seçeneğim var.

Birincisi arduinonun mevcut i2c komutlarıyla 10 bit adresi göndermeye çalışmak.

İkincisi iki pini sda-scl yapıp açıp-kapatarak işlemleri yapmak.

İlk işlem bana daha kolay gibi geldi. Çünkü 10 bit adres yazarken ilk işlemde adresin 7 biti yazılıp ACK bekleniyor. Bu da ilk işlemin Arduino ile uyumlu olduğunu gösteriyor, protokolü yanlış yorumlamadıysam.

Eğer yardımınız olursa ikinciyi de denemek isterim.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

ete

Genel anlamda yardım ediyorum zaten ama Arduino dan anlamam. Bu yüzden fazla yardımcı olabileceğimi sanmıyorum.
Deneyerek bulman gerek bir yolunu.
Ete

Serk@n

#37
Pinleri 1-0 yaparak i2c haberleşmesi yapılabilir mi sizce?

Tüplü TV.den bir eprom söktüm. Markası 24WC08. 7 bitlik adresi olduğu için bu epromdan ACK aldım. İlk denemelerimi bu epromda yapabilirim i2c.nin mantığını daha iyi kavrayabilmek için.

ACK nasıl kontrol edeceğimi mesajınızdan aldım. Ama Start için emin değilim. Önce clock 1 iken sda yı 0 yapılacak. Sonra clock da 0'a düşecek. Burada bekleme süresi verecek miyim, bir de clock palsleri kaç mikrosaniye 1'de ve 0'da kalacak?
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n

#38
Hocam ben biraz dersime çalışayım. Zira Arduino ile 7 bit adresli epromu okurken bile eksiklerimin olduğunu görüyorum. Soru sormak bile belli bir seviye bilgi istiyor. Hem cevaplayanı yormamak hem de cevap alan için verimli olması için sanırım bu gerekiyor. Biraz meseleye vakıf olduktan sonra size sorularımı sorayım.

Mesela şuan 0-255 arası eprom verilerini okuyabiliyorum. 256'yı okuyacakken veriler başa sarıyor. Adresi 8 bitten yüksek isteyemiyorum.

Benim oğlum binâ okur
Döner durur yine okur

:) Gibi bir durum söz konusu.

Aslında eprom 8Kbit imiş.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n

#39
Son gelişmelerim şunlar: Kolaydan zora doğru i2c.yi öğrenmek istedim. Öncelikle 7 bit adresli bir epromla çalışayım istedim. TV Epromunu (24WC08p) okudum. Her satıra 32 byte gelecek verileri şekilde sıraladım.

  0=  0,  0,  0,  0,128,128,  0,  0, 58, 55,128,  3,128,159, 28, 44, 48, 56,128,  3,128,156, 29, 44, 35, 56,128,  3,128,156, 27, 44
  32=  43, 56,128,  3,128,159, 28, 44, 38, 56,128,  3,128,157, 27, 44, 51, 56,128,  3,128,159, 28, 44, 25, 57,  0, 19,128,155, 29, 44
  64=  40, 56,128, 19,128,155, 31, 44, 53, 56,128, 19,128,155, 33, 44, 61, 56,128, 19,128,156, 29, 44, 33, 56,128, 19,128,156, 31, 44
  96=  62, 56,128, 19,128,156, 33, 44, 26, 56,128, 19,128,156, 35, 44, 27, 58,128, 19,128,157, 27, 44,150, 56,128, 19,128,157, 29, 44
 128= 152, 56,128, 19,128,157, 31, 44,154, 56,128, 19,128,157, 33, 44,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 160=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 192=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 224=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 256=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 288=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 320=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 352=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 384=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 416=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 448=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 480=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 512=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 544=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 576=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 608=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 640=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 672=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 704=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 736=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 768=  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,128,128,  0,  0
 800=  19,131, 16,  0,  0,  0,  0,165, 42, 51, 25, 15, 31,  0,  0,163,  1,  8, 15,  1,  0,  0,  0, 24, 47,  0,  6,  6,  6,  6,  7, 77
 832=  6, 25, 25, 25, 30, 30, 56,196,  4, 61,  3, 62,  7, 32, 30,198, 30, 27, 28,  6,  6,  7, 49,152,  3,  7, 19,  0,  0,  0,  0, 28
 864=  11, 82, 29,  2,  1,  2,  8,134,142,187,  9,229,123,225, 32,178, 52, 19, 20, 37, 13, 15,  6,161,  8, 20, 28, 36,  9, 11,  6,117
 896=  16, 16,  0,  0,  0,  0,  0, 31, 24, 24, 24, 24, 24,  5,  0,124, 11, 28, 11, 81, 13, 45,  8,196, 27, 18, 13, 32,  7, 12,  0,108
 928=  25, 86, 15,  0,  0,  0,  0,125,204,206,210,214,217,149,152,154,157, 84, 86, 88, 90, 92, 93, 94, 35, 35,255,  0,255,  0,  1,  1
 960=  0,  6,  6,  0,  6,  0,  0, 17, 51, 16,  7, 33, 10, 14, 10,140, 52, 13,  5, 37,  9, 11, 10,136, 61, 17,  5, 37, 10, 17, 10,156
 992=  30, 27, 30,  6, 31,  9, 15,147, 24, 16,  0,  0,  0,  0,  0, 39, 12, 74, 30, 34,161,146, 52,252,142,  0,  0,  0,  0,  0,  0,141
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n

Ete hocam,
Epromun dahasheetini bulamadım ama forum siteleri verilerine göre besleme voltajını 3.3V olduğu söyleniyor. Sizin tarif ettiğiniz 2n7000 serisi mosfetle yapılan devre bu iş için kullanılabilir mi, bu durumda pull-up direncine gerek kalmaz değil mi?

Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n





Devredeki örnek zaten i2C içinmiş.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

ete

Bildiğim Arduino da 3V3 ile çalışıyor. Bu durumda özel tedbir almana gerek olmaz. AMa pullup gerekli mutlaka olmaz ise ACK alınamaz.
Pic tarafında da hemen hepsi 3V3 ile çalışabiliyor. En iyi çözüm işlemciyi 3V3 ile çalıştırmak olur bence.

Ete

Serk@n

Tamam hocam, çok sağolun.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Serk@n

Sayın Ete hocam,
Printer epromundan ACK alabildim. Fakat devamını getiremiyorum.

Şunları öğrendim:
I2c 10 bit adreslere ulaşımı, 7 bite uyumlu olacak şekilde üretmişler.

İlk 5 bit sabit
11110

Sonraki iki bit adresin ilk iki biti
00

Sonraki bir R/W
0

Yani ilk byte 0x78 girerek ilk ACK.yı aldım.

Adresin son 8 biti de sıfır olduğundan ikinci byte 0x00 girerek ikinci ACK.yı da aldım.

Şimdi adresleri girmeye ve veri almaya çalışıyorum.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Powered by EzPortal