2.11- MicroPython ile SPI ve I2C Uygulamaları

SPI uzun zamandır dijital devrelerde senkron iletişim için kullanılan seri iletişim protokolüdür. Senkron iletişimde asenkrondan farklı olarak veri sinyalinin yanında saat sinyali de gönderilmektedir. Bu sayede alıcı taraf veri hattında bitleri ne zaman okuması gerektiğini gelen saat sinyali sayesinde bilmektedir. SPI bilgisayarlarda devreler arası iletişimde sıkça tercih edilen bir protokol olmakla beraber mikrodenetleyici dünyasında genellikle hafıza birimlerinde yüksek bant genişliğinde iletişim için kullanılmaktadır. SPI’da teorik olarak hız sınırı saat frekansı ile belirlenmekte ve bu hız sınırını donanımın kapasitesi belirlemektedir. Örneğin daha basit olan ATmega328P mikrodenetleyicide azami SPI saat hızı 8MHz (16MHz’de) iken ESP32’de bu oran SPI ayaklarında 80MHz diğer ayaklarda ise 40MHz’dir.

SPI iletişimde genellikle amaç mümkün olduğu kadar yüksek veri aktarımını sağlamaktır. Bunun için SPI protokolü Çift SPI (Dual SPI), Dörtlü SPI (QPI) ve çift veri oranı (Double data rate) gibi veri aktarımını mümkün mertebe artıracak bazı özelliklerle de geliştirilmiştir. SPI protokolü en basit haliyle bile full-duplex yani aynı anda hem gönderim hem de okuma işlemi yapabilen bir protokoldür. Biz SPI protokolünü genellikle düşük bant genişliğinin yeterli olduğu çevrebirim modülleri ve çeşitli dijital algılayıcılar ile kullanacağımız için bizim için yüksek hız çok önemli olmamaktadır. Aşağıdaki listede SPI ile kullanacağımız belli başlı modülleri görebilirsiniz.

· TFT, OLED, E-Paper vb. gelişmiş ekranlar
· Dotmatrix, 7-segman gösterge sürücüleri
· Dijital güç elektroniği modülleri, PWM üreticiler
· Flash Hafıza, SD kart
· Basınç, Sıcaklık, Nem algılayıcıları
· Analog dijital çevirici ve dijital analog çeviriciler
· İvmeölçer, elektronik pusula, jiroskop modülleri
· Çeşitli iletişim modülleri (Ethernet, Bluetooth, CAN Bus)
· İki mikrodenetleyici arası veya mikrodenetleyiciler ağı arası iletişim
· Giriş çıkış çoklama
· Motor sürücüleri

SPI protokolünü daha iyi anlama adına bir örnek yapalım ve bunu lojik analizörde izleyelim.

Yukarıdaki programda SPI birimini 1 MHz saat hızında tanımladık ve SCK için GPIO14, MOSI için GPIO13, MISO için GPIO12 ve CS için GPIO27’yi kullandık. Yazdırdığımız veri ise ‘12345’ olup bunu sırayla gerçekleştirmektedir.

Grafiğe baktığımızda önce CS ayağının sıfıra çekildiğini görmekteyiz. SPI protokolünde iletişim aynı hat üzerinden gerçekleştirildiği için bizim hatta bağlı hangi aygıtı kullanacağımızı her bir aygıta atanmış farklı CS (Chip select) sinyalleriyle belirlemekteyiz. Kullanılan aygıt da kendisinin seçildiğini CS ayağının sıfıra çekilmesiyle algılamaktadır. Yani bir SPI iletişimini başlatmak için öncelikle ilgili aygıta giden CS ayağının sıfıra çekilmesi gereklidir. Aksi taktirde iletişim gerçekleşmeyecektir.

SPI iletişiminde veri iki farklı hat üzerinden iletilmektedir. Bunlardan MOSI (Master out slave in) ana aygıta (Master) tahsis edilmiş olup kendine bağlı uydu aygıtlara (Slave) bu hat üzerinden veri gönderimini yapmaktadır. Uydu aygıtlar ise ana aygıta MISO (Master in slave out) hattı üzerinden veri göndermektedir. Bu sayede aynı anda çift yönlü veri iletişimi mümkün olmaktadır. Her seferinde tek bir ana aygıt ile tek bir uydu aygıt iletişimde olduğu için çakışma gibi durumlar da olmamaktadır.

Grafiğin devamında MOSI kısmında ana aygıttan gönderilen veriler görünmektedir. Bununla beraber alt kısımda SCK hattında sıralı 1 ve 0 gibi görülen bir kare dalga görünmektedir. Bu saat sinyali olup bu sinyal referans alınarak veri okuması yapılmaktadır. SPI iletişimi bittiği zaman CS hattı bire çıkarılmalıdır. Uygulamada CS hattını mikrodenetleyicilerin SPI protokolü kontrol etmeyip bizim GPIO işlemleriyle yapmamız gereklidir.

Şimdi tek bir bayt üzerinden iletişimin nasıl gerçekleştirildiğine bakalım.

Burada alt kısımda yer alan rakamların konumlarına dikkat ediniz. Saatin her yükselen kenarında yukarıda bulunan veri hattı okunup oradan örnek alınmaktadır. Eğer saatin yükselen kenarında veri hattı 0 ise 0, 1 ise 1 olarak kaydedilmektedir. Burada ASCII ‘1’ karakterini yani 0b00110001 değerini gönderdik. SPI iletişiminde baş bitin mi son bitin mi önce gönderileceği bir standarda bağlanmamıştır. Burada MSB öncelikle gönderilmektedir. Dikkat ederseniz veri ile saatin birbirine paralel olmadığını görürsünüz. Saatin yükseldiği sırada veri okunmakta ama saatin düştüğü zaman veri güncellenmektedir. Eğer saatin yükseldiği zaman hem veri okunup hem güncellenmeye çalışılsaydı dijital devrelerdeki yükselme oranı (slew rate) başta olmak üzere gecikmelerden dolayı bunu yapmak çok mümkün olmayacaktı. Sinyalin düşüşünden yükselişine kadar verinin aslında kendine gelmesi için zaman tanınmaktadır. Yani burada düşen kenar değiştirme kenarı (Toggling edge), yükselen kenar ise örnekleme kenarı (Sampling edge) olarak kullanılmaktadır.

SPI UART gibi basit ve esnek bir iletişim protokolü olduğundan pek çok farklı uygulama yöntemi bulunmaktadır. Biz burada bitlerin sırasını soldan sağa değil sağdan sola yapabileceğimiz gibi saat sinyalini tersleyebilir veya yükselen kenarda değil alçalan kenarda veriyi okuyabilirdik. Bu ihtiyaç duyacağımız zamanlar ancak karşımıza çıkan konular olduğu için çoğu zaman biz SPI’ı varsayılan haliyle kullanırız.

MicroPython’da SPI donanımsal olduğu kadar yazılımsal olarak da gerçekleştirilmektedir. Bunun için SoftSPI sınıfı bulunmaktadır. Bu iletişim protokollerini yazılımsal olanlarının sakıncaları bulunduğu için mümkün mertebe donanım ile çalışmanızı tavsiye etmekteyim. Genellikle UART, SPI gibi protokolleri yazılımsal olarak ancak elimizdeki donanımın yetersiz olduğu zamanlarda uygulamaktayız. Donanım birimleri iletişimde gerçekleşen belli başlı olaylarda kesme üretmektedir. Biz yazılımsal olarak benzer işleri yapmak istediğimizde mikrodenetleyici aşırı derecede meşgul olacaktır.

MicroPython’ın SPI sınıfında okuma ve yazma yapmak için aşağıdaki fonksiyonlar kullanılmaktadır.

SPI.read(nbytes, write = 0x00)

Bu metot nbytes ile belirtilen bayt sayısı kadar okuma yapar ve write parametresindeki değeri boş yazdırma işlemi olarak kullanır. Bunun sebebi SPI’da okuma ve yazmanın eş zamanlı olarak yapılması, bu yüzden bir veri okumak için anlamsız da olsa veri yazmamız gerekmesidir.

SPI.readinto(buf, write=0x00)

Bu metot okuduğu değeri buf adındaki tanımladığımız tampon belleğe yazdırır. read() metodundan farkı okuduğu değeri geri döndürmeyip argüman olarak aktardığımız değişkene yazdırmasıdır.

SPI.write(buf)

SPI’da veri yazma işlemi bu metot ile yapılır. buf içerisinde yer alan değerler SPI’da yazdırılmaktadır. Bunun bytes olması gereklidir.

SPI.write_readinto(write_buf, read_buf)

Bu fonksiyon bir tamponu yazarken öteki taraftan okunan değerleri bir tampona kaydetmektedir.

SPI iletişim protokolünde bir aygıt ana aygıt (Master) olacağı gibi uydu da olabilir (Slave). Genellikle mikrodenetleyiciler her iki modda çalışmaya imkân vermektedir. Uydu olarak kullanılan bir mikrodenetleyici genellikle bir uç birim olup merkezde yer alan mikrodenetleyicinin gönderdiği komutlara göre çıkış vermekte veya algılayıcıdan okuduğu okumaları merkezdeki mikrodenetleyiciye göndermektedir. Birden fazla mikrodenetleyici kullanmamız gereken uygulamalarda bizim için faydalı bir özellik olsa da MicroPython SPI’ı uydu modda kullanamamaktayız. Bunun için ESP-IDF’in kütüphanelerini kullanabiliriz.[8]

SPI uygulamalarına bir sonraki bölümde yer verilecektir.

I2C

I2C iletişim protokolü Philips tarafından aynı kartta bulunan dijital devrelerin birbiriyle kolayca haberleşmesi için tasarlanan bir seri iletişim protokolüdür. Bu iletişim protokolünün en büyük özelliği sadece iki kablo üzerinden bütün aygıtlara bağlanabilmesi ve kablo kalabalığını ortadan kaldırmasıdır. Bunu bilgisayar ağlarındaki bus topolojisine benzetebiliriz. Aynı hat üzerinden pek çok aygıt arasında iletişim sağlandığı için çoğu zaman çakışmaların önüne geçmek için bir adet ana aygıt ve ana aygıta bağlanan pek çok uydu aygıt bulunmaktadır.

Çoklu ana aygıt kullanımı ile ilgili “I2C Bus Arbitation” ve “I2C collision/bus busy detection” anahtar kelimesi ile konuyu araştırınız.

I2C protokolünün diğer avantajları ise UART’daki gibi baud oranı zorunluluğu olmayışı (saat sinyalini ana aygıt belirlemekte) ve aygıt seçiminde her bir aygıtın adresinin olmasıdır. I2C protokolü uygulamalarında genellikle veri iletimi için kullanılan ayağa SDA, saat sinyali için kullanılan ayağa SCL adı verilmektedir. Bu ayaklar normal şartlarda HIGH durumunda olup veri iletimi LOW konumuna çekilerek gerçekleştirilmektedir.

I2C ile kullanabileceğimiz aygıtların çeşidi oldukça fazladır. İki veya daha fazla mikrodenetleyici arasında iletişim kurabileceğimiz gibi I2C destekleyen belli başlı modüller şu şekildedir,

· OLED ekranlar
· Sinyal üreteçleri
· LED gösterge sürücüleri
· Motor sürücüler
· Giriş çıkış çoklayıcılar
· Sıcaklık, nem, basınç algılayıcıları
· Analog-dijital çeviriciler, dijital-analog çeviriciler
· Gerçek zaman saatleri (RTC)
· Hafıza birimleri (EEPROM)
· Termal kameralar
· Jiroskop, ivme ölçer, dijital pusulalar

Veri iletiminde kuracağınız devrede dikkat etmeniz gereken iki nokta vardır. Bunlardan biri kablonun kapasitansı diğeri ise direncidir. Bu iki unsur deney tahtası ortamında çok sorun çıkarmasa da bazı durumlarda uygulamayı çalışmaz hale getirebilir. I2C protokolünde SDA ve SCL hatlarına mümkün mertebe birer pull-up direnci takılması önerilir. Aşağıdaki osiloskop görüntüsünde pull-up direnci takılmamış haliyle sinyali görmekteyiz.

Devreye 4.7k pull-up direnci eklediğimizde sinyal düzelmektedir.

Kablonun kapasitansı arttıkça pull-up direncinin düşürülmesi tavsiye edilir. Yalnız pull-up direncinin çok düşük olması da kablonun direncinin yüksek olduğu durumlarda sorun yaşatmaktadır. Kablo direnci yüksek olduğu zamanlar 0 seviyesine gelmekte sorun yaşanmaktadır. Bu durumda da pull-up direncinin değerlerini yükseltmek gereklidir. [10] İletişimin fiziksel yönüyle sağlıklı gerçekleşip gerçekleşmediğini osiloskop üzerinden ölçebilirsiniz.

ESP32’de çıkış destekleyen herhangi bir giriş çıkış ayağı I2C için kullanılabilir. Varsayılan değerleri aşağıdaki tabloda görebilirsiniz.

I2C protokolüne devam etmeden önce seri iletişimde önemli bir konu olan mantıksal seviye dönüşümü konusundan bahsedelim.

Mantıksal Seviye Dönüşümü

Seri iletişimde kullanılan devreler sayısal devreler olsa da sayısal devreler çalışma gerilimleri ile birbirinden ayrılmaktadır. Genellikle 1.8V, 3.3V ve 5V seviyelerinde çalışan devreler birbirleriyle iletişimde bulunurken bu gerilim seviyeleri bazı devrelerin doğru çalışmamasına bazı devrelerin ise zarar germesine sebep olmaktadır. Örneğin TTL için 2V ile 5V seviyeleri HIGH olarak kabul edilirken bizim 1.8V seviyesindeki sayısal devremizden gelen HIGH sinyali 1.8V olacağı için anlamlı bölgede kalmamaktadır. 3.3V gerilim seviyesindeki bir devreye de 5V HIGH sinyali uygulamak çoğu zaman devrenin zarar görmesine sebep olmaktadır. Bazen sayısal devrelerin çalışma gerilim aralığı geniş olup hem 5V hem de 3.3V seviyesinde çalışmamıza imkân verip, bazıları da 3.3V’da çalışırken 5V gerilime de toleranslı olsa da çoğu zaman seviye dönüşümü yapmamıza mecbur bırakmaktadır.

Uygulamada bu seviye dönüşümünü yaygın olarak 3 şekilde yapmaktayız.

Birinci yöntem oldukça basit bir yöntem olup gerilim bölücü direnç yardımıyla tek yönlü bir çevirime imkân vermektedir. Örneğin 5 voltu 3.3 volta çevirmek istediğimizde şöyle bir devre kullanmamız yeterlidir.

Burada 1K ve 2K dirençlerle bunu gerçekleştirsek de gerilim bölücü kullanmak çok verimli bir yöntem değildir. Onun yerine yarı iletken anahtarlayıcıları (transistör, mosfet vb.) kullanmamız mümkündür.

Yukarıdaki devre Sparkfun’ın bu amaç için tasarlanmış modülüne aittir. Bu devreyi modül olarak da alma imkânınız vardır.

https://www.sparkfun.com/products/12009

Daha iyi bir seçenek ise bu amaca yönelik tasarlanmış entegre devreleri kullanmaktır. Texas Instruments’in TXS0108E entegresi bu amaç için üretilmiş olup UART, I2C ve SPI iletişimde kullanılan saat hızlarını desteklemektedir.

Şimdi entegrenin datasheetini açalım ve nasıl kullanacağımızı öğrenelim.

https://www.ti.com/lit/ds/symlink/txs0108e.pdf?ts=1670774246212

Datasheetin ilk sayfasında entegre hakkında özet bilgiler yer almaktadır. Burada “Features” kısmı entegrenin belli başlı özellikleri, “Applications” kısmı olası kullanım alanları ve “Description” kısmı ise açıklamasıdır. Sayfanın altında yer alan “Simplified Application” kısmında ise örnek bir devre gösterilmektedir.

Resim: Texas Instruments (ti.com)

Burada 1.8V sistem ile 3.3V sistem arasında gerçekleşen iki yönlü bağlantı gösterilmiştir. VCCA ayağı düşük gerilimli A sisteminin beslemesine, VCCB ayağı yüksek gerilimli B sisteminin beslemesine bağlanmalıdır. GND bağlantısı ortak olup OE ayağı ise LOW olması durumunda tri-state durumunda (yani boşta) HIGH olması durumunda ise iletimdedir. Bu entegre 8 bitlik bir veri yolunu desteklemektedir. Her bir bit birbirinden bağımsız kullanılabilir.

Burada dikkat edilmesi gereken nokta açıklamada A kısmının 1.4V ve 3.6V arasını desteklediği, B kısmının ise 1.65V ve 5.5V arasını desteklediğidir. Open drain modda 1.2Mbps hızı desteklemesi I2C protokolünün (400kbps en fazla) azami hızından daha yüksektir.

OE ayağı 4. sayfadaki “Pin Functions” tablosunda “Referened to Vcca” diye belirtilmiştir. Yani bu ayağa gerilim uygularken A sistemindeki gerilimi uygulamamız gereklidir. Yukarıdaki entegre SMD kılıfta olup kullanımı öğrenciler için biraz zahmetlidir. Bunun için bunun modülünü kullanmanız daha uygun olacaktır.

Resim: volusion.com

MicroPython’da I2C Kullanımı

I2C protokolü donanım tarafında SPI veya UART kadar basit olmasa da MicroPython’daki I2C sınıfı bunu oldukça sadeleştirmiştir. MicroPython’da I2C protokolünü kullanmak için DS1307 modülü ile bir deneme devresi kurulmuştur. Bunun için mantıksal seviye dönüşümü de yapmamız gerekecektir.

Devre12_RTCI2C.fzz

Bu devreyi daha sonraki uygulamada kurmanız gerekse de şimdilik kurmanıza gerek yoktur. Kullandığımız modülde DS1307’nin adresi 0x68’dir.

ESP32’de iki adet I2C çevrebirimi bulunup bunlar 0 ve 1 olarak belirtilebilir. Kodda I2C1 kullanılmıştır. SDA ayağı 12, SCL ayağı ise 13 olarak belirlenmiştir. Frekans ise 400kHz olarak belirlenmiştir.

Şimdi lojik analizör üzerinden iletişim grafiğini inceleyelim.

Grafiği madde madde şöyle açıklayabiliriz,

· İletişim grafikte “S” ile işaretlenen kısımda başlamıştır. I2C protokolünde buna START durumu adı verilmektedir. Bu duruma geçmek için SCL HIGH durumda iken SDA LOW duruma çekilmelidir.
· Sonrasında 7 bitlik adres verisi yazdırılmıştır. Burada adres 0x68 ya da ikilik ifade ile 0b1101000 değeridir.
· 7 bitlik adres verisinden sonra son bit yazma mı okuma mı işlemi yapacağımız belirlemektedir. Okuma işleminde 1, yazma işleminde ise 0 değerine sahiptir.
· En son olarak A ile işaretlenen yerde “Acknowledgement” yani teyit biti kontrol edilmektedir. Bu bit uydu aygıt tarafından değiştirilmektedir. Eğer böyle bir aygıt varsa uydu aygıt bu biti sıfır yapmaktadır, eğer tepki yoksa bu bit HIGH konumda kalır ve gönderen aygıt burada bir sorun olduğunu algılar. ACK biti diğer veriler gibi yükselen kenarda okunmaktadır
· Sonrasında ise gönderdiğimiz ASCII “1” karakteri yazdırılmaktadır. Veri yazdırmada I2C’de baş bit (MSB) en başta yazılmaktadır.
· Veri kısmının gönderiminde de adres kısmının gönderiminde olduğu gibi ACK biti denetlenmektedir.
· İletişimin sonlandırılması için SCL hattı HIGH konumda iken SDA hattı HIGH konuma çekilir ve öyle bırakılır. Buna da STOP durumu adı verilmektedir.

Yazma işleminde veri çerçevesini şu şekilde ifade edebiliriz.,

Burada gri gölgelendirme olan kısımlar uydu aygıtın hat üzerinde yaptığı değişikliği ifade ederken geri kalan kısımlar ana aygıt tarafından kontrol edilmektedir.

Burada ACK bitine neden ihtiyacımız olduğunu biraz daha iyi anlamamız gerekebilir. ACK biti iletişim esnasında uydu aygıt ile sağlıklı bir iletişim sağlanıp sağlanamadığını öğrenebilmenin tek yoludur. Tabloda gördüğünüz üzere burada sadece ACK biti uydu aygıt tarafından değiştirilebilmektedir. Eğer ACK biti LOW’a çekilmemişse bu bit NACK (Not acknowledged) olarak değerlendirilir. Bunun sebepleri aşağıdaki gibi olabilir,

· Hatta böyle bir adreste aygıt yoktur ya da alıcı bir şekilde veriyi alamamıştır.
· Alıcı tarafından anlaşılmayan veriler gönderilmiştir.
· Uydu aygıt zamanlamanın önemli olduğu bir işi yapıyor ve cevap verememiştir.
· Ana aygıt veri okurken veri dizisinin bittiğini belirtmek için NACK biti eklenir.

Şimdi basit bir okuma işlemi yapalım. Bu programda öncelikle scan() metodu ile hatta bulunan I2C aygıtların adresleri listelenir ve yazdırılır. Bu adresini bilmediğimiz aygıtın adresini bulmakta bize yardımcı olacak bir metottur. Sonrasında ise yüksek seviyeli bir metot olan readfrom_mem() metodu ile belirli aygıtta yer alan belirli adresten itibaren okuma gerçekleştirilir.

İletişimi lojik analizörde incelediğimizde şöyle bir grafiği gözlemleyebiliriz.

Öncelikle iletişime yazma modunda başlanıp adres verisi yazıldıktan sonra okuma yapmak istediğimiz aygıtın yazmaç adresini (burada 0x00) yazmaktayız. Sonrasında okuma modunu açtığımızda aygıt hangi adresi okumayı istediğimizi kaydettiği için o adresteki veriyi bize göndermektedir. Yazma kısmını daha önce incelediğimiz için şimdi sadece okuma kısmına odaklanalım.

· Burada iletişim başta S ile belirtilen START durumu ile başlatılmaktadır.
· Adres verisi kısmında aygıtın 7 bitlik adres değeri yazılmaktadır. Son kısımda ise okuma/yazma biti 1 olarak belirtilmekte yani okuma yapılacağı haber verilmektedir.
· A kısmında uydu aygıttan gelen ACK biti okunmaktadır.
· Okunan veri 0x91 olup NAK biti ile ana aygıt tarafından bitirilmektedir. Grafikte NA olarak belirtilen noktada ACK bitinde olduğu gibi 0 konumunda değil 1 konumunda okuma yapılmıştır.
· Ana aygıt NAK bitini okuduktan sonra STOP durumuna geçer.

Bu süreci tablo halinde şu şekilde gösterebiliriz.

Burada gölgelendirilmiş kısımlar uydu aygıtın yolladığı bitler, gölgelendirilmemiş yerler ise ana aygıtın kontrol ettiği bitlerdir. Okuma uygulamasında ilk ACK biti uydu aygıt tarafından gönderilirken sonraki ACK bitleri ana aygıt tarafından gönderilmektedir.

MicroPython’da I2C sınıfında kullanacağınız temel metotlar şu şekildedir.

I2C.readfrom(addr, nbytes, stop=True, /)

Bu metot n sayıda baytı addr kısmında belirtilen adresten okumaktadır. Eğer stop True ise okumadan sonra STOP durumuna geçer. Okumanın ardından okunan veriyi bytes tipinde nesne olarak geri döndürür.

I2C.readfrom_into(addr, buf, stop=True, /)

addr parametresinde belirtilen adresten okumayı gerçekleştirip buf parametresindeki argümana aktarır. Okunan verinin kaç bayt olacağı buf argümanının uzunluğuna bağlıdır. Eğer stop True ise okumanın ardından STOP durumuna geçilir. Bu metot değer döndürmez.

I2C.writeto(addr, buf, stop=True, /)

buf içindeki baytları addr argümanında belirtilen adrese yazar. Eğer NACK elde edilirse geri kalan baytlar yazılmaz. Eğer STOP True olarak belirtilmişse gönderimin sonunda STOP durumuna geçilir. Bu metot elde edilen ACK bitlerinin sayısını geri döndürür.

Bazı I2C aygıtları bellek gibi çalışmaktadır. Belli bir yazmaç setinden oluşan aygıtlara başlangıç adresinden itibaren sırayla veri yazmak mümkündür. Aynı şekilde başlangıç adresinden itibaren sırayla (örneğin 0x00, 0x01, 0x02 …) veri okumamız da mümkündür.

I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize = 8)

addr argümanındaki adrese sahip aygıttan memaddr argümanındaki adresten itibaren nbytes boyutunda bayt dizisini okumaktadır. addrsize ise adres boyutunu ifade etmektedir.

I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)

addr argümanındaki adrese sahip aygıttan memaddr argümanındaki adresten itibaren okuma yapıp buf nesnesine kaydetmektedir. addrsize ise adres boyutunu ifade eder. Bu metot değer döndürmez.

I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)

buf nesnesindeki değeri addr argümanındaki adres değerine sahip cihazın memaddr argümanında yer alan hafıza adresinden itibaren sırayla yazar. addrsize ise adres boyutunu ifade eder. Bu metot değer döndürmez.

Yukarıdaki fonksiyonlarda parametre listesinde yer alan ‘/’ karakteri sol taraftaki parametrelerin sadece sıralı olarak kullanılabileceğini, ‘*’ karakteri ise sağ tarafındaki parametrelerin sadece anahtar kelime olarak belirtilerek kullanılabileceğini ifade eder. İkisinin ortasında kalan parametreler ise iki şekilde de kullanılabilir.

Bu bölümde temel mikrodenetleyici uygulamaları gerçekleştirilmiştir. Bu tarz uygulamaları gerçekleştirebilmek geliştiriciliğe atılan ilk adım olacaktır. Bir sonraki bölümde özellikle SPI ve I2C modüllere nasıl sürücü yazılacağı, bunlarla nasıl uygulamalar yapabileceğimiz ve arayüz uygulamalarını nasıl oluşturacağımızı göreceğiz.

2. Bölüm — Kaynaklar

[1] https://scholar.google.com/scholar?start=20&q=micropython&hl=tr&as_sdt=0,5

[2] https://en.wikipedia.org/wiki/Year_2038_problem

[3] https://forum.micropython.org/viewtopic.php?t=4652

[4] https://roboticsbackend.com/arduino-fast-digitalwrite/#:~:text=We%20have%20the%20answer%3A%20a,have%20a%20much%20better%20precision.

[5] https://www.analog.com/media/en/training-seminars/design-handbooks/Data-Conversion-Handbook/Chapter1.pdf

[6] https://en.wikipedia.org/wiki/Seven-segment_display

[7] https://www.analog.com/en/analog-dialogue/articles/uart-a-hardware-communication-protocol.html

[8] https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_slave.html

[9] https://www.i2c-bus.org/i2c-primer/termination-versus-serial-resistance/

--

--