Birden Fazla I2C Bağlamak

Başlatan Mnemonic, 04 Aralık 2005, 13:45:52

Mnemonic

Selamlar

Bİr pic'e birden fazla i2c memory bağlayarak tek ram varmis gibi kullanmak mumkunmu acaba. Yani bir örnekle açıklarsar 24C512'nin son adresi FFFF dir
biz 2 adet i2c kullanarak ikincinin 02C4 adresine bisey yazmak istersek adres olarak 102C3 göndermek istiyorum yada ram adresi olarak 0000'dan 1FFFF'e kadar kullanmak istiyorum yapabilirmiyiz

CaFFeiNe



A0 - PIN1
A1 - PIN2
A2 - PIN3

pinlerini (A2,A1,A0 sırasıyla)
1.EEPROM için 000
2.EEPROM için 001
3.EEPROM için 010
4.EEPROM için 011
5.EEPROM için 100
6.EEPROM için 101
7.EEPROM için 110
8.EEPROM için 111

şeklinde bağlayarak ve
A0' ı A16 gibi
A1' i A17 gibi
A2' yi A18 gibi kullanıp 8 adet 24512 ile 512KB hafıza elde edebilirsin (24512 nin herbiri 64KB dir)
eğer adres bilgisini programında word tipinden büyük bir tipte tutabiliyorsan (ki nasıl olur bilmiyorum) adresi parçalara ayırıp en üst 3 bitini kontrol baytına and/or vs işlemlerle sokacaksın sonra kalan 16bitin üst 8bitini adres üst baytı olarak alt 8bitide adres alt baytı olarak kullanacaksın
bu şekilde olur herhalde

Mnemonic

Verdigin bilgi için çok teşekkür ederim yanlız kafamda tam oturtamadım birazdaha acman mümkünmü acaba

CaFFeiNe

şimdi 16bit adresleme ile 24512 yi kullandığını farz ediyoruz (ki öyle olması gerekir) önce kontrol baytını ardından adresin üst baytını (8bit) sonrada adresin alt baytını gönderiyoruz yani elinde atıyorum 1234h gibi bir adres var ise kontrol baytından sonra sırasıyla 12h ve 34h değerlerini gönderiyoruz sonrada yazmak istediğimiz baytı gönderiyoruz mesela (veya okumak istediğimiz baytı okuyoruz) şimdi 8 adet 24512 yi adres pinlerini ayarlayarak kullanırsak 00000h ile 7FFFFh arasında bir hafızamız olacak yani 19bitlik bir adres (zaten 1adet 24512 de 0000h ile FFFFh adres aralığımız var dikkat edersen) bu adresi word tipinde bir değişkende tutamazsın çünkü 16bit neyse şimdi bu 19bitlik adresin alt 16bitini normal olarak 24512 için nasıl kullanıyorsan o şekilde kullanıyorsun üst 3bitini ise kontrol baytı içine A0,A1,A2 ile gösterilen kısma gömmen gerekiyor
anlatabildimmi bilemiyorum :)

mhk

CaFFeiNe teorik olarak yazmış. Bende teorik olarak yazmak istiyorum.Şimdi elimizde24c512 ( 64K ) hafıza var. Chip select pinleri A0, A1,A2 bunlar tek eepromda 0'a bağlanırlar dikkat ettiysen. Eğer 2 yada daha fazla kullanmak istersen, bağlayacağın oranda bu pinleri binary düzende organize etmen gerekecek. Yani eğer 4 adet eeprom kullanacaksan,
1.eepromun A2=0  A1=0  A0=0
2.eepromun A2=0  A1=0  A0=1
3.eepromun A2=0  A1=1  A0=0
4.eepromun A2=0  A1=1  A0=1
Her eepromun chip select uçlarını bu şekilde 0 yada 1 e bağlamalısın. CaFFeiNe 'nin verdiği resme dikkat!! . Control byte, control code+Chip select kısmından oluşur. Yani eeprom'a veri gönderirken önce kontrol byte+chip select kısmını gönderiyoruz. Sonra adres daha sonra da bilgi. Burda 1.eeproma veri gönderirken kontrolbitleri 1010ddd0 şeklindedir. ddd harfleri device select kısmı olup, istediğin i2c protokolünü destekleyen chiplerle kullanabilirsin.Donanımsal olarak eepromların (A0-A2 uçlarını) bağladıktan sonra, yazılımla
1.eeprom için kontrol byte 1010000
2.eeprom için kontrol byte 1010001
3.eeprom için kontrol byte 1010010
4.eeprom için kontrol byte 1010011
Şeklinde seçip bilgileri gönderebilirsin. Adresler değişmez, yani 1.eeprom için adres aralığı ( 64K için ) 0000-FFFF diğerleri içinde aynıdır. Değişen tek şey chipseçme uçlarıdır.Kolay gelsin.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

Mnemonic

Çok teşekkür ederim bu bilgi çok açıklayıcı oldu sorunu bu şekilde hallederim  yanlız bahsi geçmeyen sda ve scl bacaklarıda hepsi birbirine paralel olacak şekilde bağlayacağımızı tahmin ediyorum

mhk

Evet aynen öyle, zaten i2c bus olarak isimlendirilir. Ben aynı hat üzerinde hem ds1307 ve 24c64 eepromu kullanmıştım. Sonuçları bekliyoruz.Kolay gelsin.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

Mnemonic

Hepinize çok teşekkür ederim herşey çok güzel oturdu ve proteusda simulasyonu yaptım konu açılmışken bu kontrol bitini hep standart kullanıyoruz 1010 şeklinde bununla ilgili olarak yapabileceğimiz başka bir seçenek varmi ve işlevi ne şekilde değiştiriyor acaba bunuda söylerseniz sevinirim

CaFFeiNe

1010 kodu I2C busta bağlanan cihazlar için bir tanımlama kodu gibi birşey yanlış hatırlamıyorsam örneğin aynı I2C busa DS1307 bağlarsan buna erişmek için 1101 kodunu göndermen gerekir

Mnemonic

Ok hersey anlasıldı o zaman bu bilgiyide urun datasheetinden alıcaz