Dostlar merhaba,
Uzun bir aradan sonra artık günlük yazılarla, konu paylaşımlarınla ve soru çözümleriyle burada ve Youtube kanalımda olabildiğince aktif olmaya çalışacağım. Paylaşımlardan haberdar olmak için web sitesinden ve sosyal medya hesaplarımdan beni takip etmeyi ihmal etmeyim.
Bugün de sizlerle cihazların birbirleriyle ya da ana bir kontrolcüyle haberleşmelerini sağlayan iletişim tekniklerinden bahsedeceğim. Bu konu hem mühendislik eğitiminizdeki Bilgisayar İletişimi dersinde hem de çalışma hayatınızın pek çok noktasında karşınıza çıkacaktır. Lafı daha fazla uzatmadan hızlıca konuya girelim.
Cihazların birbirleriyle ve ana bir kontrolcü ile kurmuş oldukları seri haberleşme için standartlaşmış bazı iletişim teknikleri vardır. Kısaca bu iletişim tekniklerinden bahsedip farkında olmasak da daha sık kullandığımız UART, SPI ve I2C protokollerinden olabildiğince detaylıca bahsedeğim.
Veri İletişim Teknikleri
Veri iletişimi, sayısal olarak kodlanmış bir bilginin iki cihaz arasında aktarılmasına verilen genel bir isimlendirmedir. Kodlanmış veriyi bir cihazdan diğer bir cihaza iletmek için paralel iletişim ve seri iletişim olmak üzere iki ana veri iletişim yöntemi kullanılabilir.
Paralel İletim
Paralel iletimde, her bit ayrı bir telden aynı zamanda iletilir. Bundan dolayı paralel iletim seri iletime göre daha hızlıdır. Ancak bu iletim türünde tüm bitleri aynı anda iletmek için 8 adet veri yoluna ihtiyaç duyulmaktadır. Bilgisayarların merkezi işlem birimi ile bellekleri arasındaki veri iletimi paralel iletime örnek gösterilebilir.
Seri İletim
Seri iletimde veriler bit bit tek bir iletim hattı üzerinden sırayla iletilirler. Bu özelliğinden dolayı seri iletim paralel iletime göre nispeten daha yavaştır ancak pek çok farklı alanda seri iletim örnekleri görülebilmektedir. Seri iletim, asenkron, senkron ve isenkron iletim olarak üç başlık altında ve bu alt başlıklarında alt başlıkları şeklinde detaylandırılacaktır.
Senkron Haberleşme
Senkron iletim metodu pahalı ve uygulanması zor bir iletişim metodudur. İletişimin sürekli ve hızlı olması gerektiği durumlarda tercih edilir. Ayrıca senkron iletimde bitler, START-STOP bitleri ve aralıklar olmadan gönderilir. Yani iki aygıt başlangıçta kendilerini birbirleriyle senkronize ettikten sonra senkronize kalmak için sürekli olarak birbirleri arasında bit akışında bulunurlar. Veriler gerçekten gönderilmediğinde bile, sabit bir bit akışı her cihazın, diğer cihazın herhangi bir zamanda nerede olduğunu bilmesini sağlar. Yani iletişimde gönderilen her bir karakter ya gerçek veri ya da boş bir karakterdir. Eşzamanlı iletişimde, her bir veri baytının başlangıcını ve sonunu işaretlemek için ek bir bite gerek yoktur. Bu durumun sonucu olarak eşzamanlı iletişimde veri aktarım hızları eşzamanlı olmayan (asenkron) iletişime göre daha hızlıdır. Ağ teknolojileri Ethernet, ArcNet, Token Ring vb. yapılar bu iletişim yöntemini kullanmaktadır.
Senkron iletimde, alıcı ile verici arasında anlamlı bitlerin yanında bir de saat (clock) bilgisi de taşınır. Bu bilgi alıcı ve verici cihaz arasındaki senkronizasyonun kurulmasını ve korunmasını sağlar. Alıcı ve verici veri aktarı süresince iletişimin bozulmaması için aynı tempoda çalışmak zorundadır.
Senkron aktarım için iki temel yöntem kullanılmaktadır.
1. Saat bilgisinin işarete kodlanması ve tekrar elde edilmesi
1.1. Çift kutuplu sıfıra dönen kodlama (Bipolar Encoding)
1.2. Mancherter kodlaması
1.3. Ayrımsal (Differential) Manchester kodlaması
2. Farklı bir saat kablosu kullanarak
Asenkron (Eşzamansız) İletişim
Asenkron (eşzamansız) iletişim “senkronizasyon yok” anlamına gelir ve bu nedenle senkron haberleşmede olduğu gibi cihazların birbirlerinin konumlarını tespit etmek için gönderdikleri boş bitleri bu iletişim türünde gönderilmelerine gerek yoktur. Bunun dışında ise, verilerin her bir baytının başlangıç ve bitişi, başlangıç ve durdurma bitleri tarafından tanımlanmalıdır. Başlangıç biti veri baytının başlamak üzere olduğunu ve durdurma biti veri baytının bittiğini ifade eder. Bu iki bitin gönderilmek zorunda olmasından dolayı asenkron iletişim yapılar arasında senkron iletişime göre daha yavaş bir iletişim kurulmasına neden olur. Ancak işlemcinin ek boş bitler göndermesine gerek olmamasından dolayı da bir avantaja sahiptir.
Hattan veri gönderilmediği sürece, iletişim sürekli olarak “1” seviyesindedir. Bir karakterin başladığı bir “0” biti gönderilerek bildirilir. Başlangıç bitinin hemen arkasından gelen yedi veri biti, iletişimde yollanılan karakteri temsil eder.
Karakter verisinin son biti de parite biti olur. Bu bit yollanan veride tek bitlik hata olup olmadığının anlaşılması için kullanılır. Eğer iletişim sırasında tek parite seçilmiş ise parite biti yardımıyla yollanan bitlerin sayısının tek olması sağlanır. Eğer çift parite seçilmiş ise bitlerin sayısının çift olması beklenecektir.
Parite bitinin ardından ise bir veya iki adet “Stop” biti iletilir. Stop bitlerinin seviyesi 1’dir. İletişim hattı, yeni bir veri yollanıncaya kadar 1 seviyesinde kalır.
UART Nedir?
UART (Universal Asynchronous Receiver Transmitter) (Evrensel Asenkron Alıcı Verici), bilgisayar ve mikrokontrolcüler veya mikrokontroller ve çevre birimleri arasında haberleşmeyi sağlayan bir haberleşme protokolüdür. Asenkron olarak çalıştığı için herhangi bir “clock” ihtiyacı duymaz. Veri bitleri iletin sırasında en anlamsız bittin (LSB) en anlamlı bite (MSB) doğru, başlatma ve durdurma bitleriyle çevrelenmiş olarak birer birer gönderilirler böylece kesin zamanlama iletişim kanalı tarafından gerçekleştirilir. Elektrik sinyal seviyeleri, UART’ın dışındaki bir sürücü devresi tarafından yönetilir. Özel UART’lar otomobiller, akıllı kartlar ve SIM’ler için kullanılırlar. USART (Universal Synchronous Asynchronous Receiver Transmitter) protokolüne sahip aygıtlar ise hem senkron hem de asenkron olarak çalışabilirler. UART’a göre daha gelişmiş bir protokoldür. USART haberleşme sistemi de UART haberleşme sistemiyle aynı şekilde çalışır ancak USART aynı zamanda senkron haberleşmeleri de gerçekleştirilebilir.
İki UART cihazının birbirine bağlanması aşağıdaki şekildeki gibi gerçekleştirilir. Birinci cihazın Tx pini ikinci cihazın Rx pinine, ikinci cihazın Tx pini de birinci cihazın Rx pinine bağlanacaktır. Bu pinlerden Tx pini veri iletmek için Rx pini de veri iletmek için kullanılır. Aynı anda yalnızca iki UART cihazı birbiri ile bağlantı sağlayabilir.
UART – USAR Haberleşmesi
UART haberleşmesini gerçekleştirirken öncelikle haberleşmeyi gerçekleştirecek aygıtların baudrate (veri taşıma hızı) değerlerinin ayarlanması gerekmektedir. Veri taşıma hızı çok çeşitli aralıklar olabilir ancak piyasada sıklıkla kullanılan veri taşıma hızları 4800, 9600, 57600, 115200 ve 921600’dür. Baudrate bizim verilerimizin saniyede ne kadarlık byte’ını taşıyacağını belirlememize imkan sağlar. Örneğin veri taşıma hızımızı 115200 seçersek saniyede yaklaşık olarak 11520 byte veri iletimi sağlanacaktır. Bu haberleşme tipini kullanabilmemiz için alıcı ve vericinin veri taşıma hızlarının (baudrate) aynı olması veya birbirine çok yakın olması gerekmektedir. Bunun nedeni ise veri aktarımı sırasında oluşabilecek hataları minimuma (~%1-3 tolere edilebilir) indirmektir.
UART cihazı veri göndermeden önce, verici cihaz veri baytlarını bitlere dönüştürür. Bitlere dönüştürülen veriler UART cihazı tarafından paketlere bölünür ve iletime hazır hale getirilir. Her paket içerisinde bir başlangıç biti, bir veri çerçevesi eşlik (parity) biti ve bitiş bitleri bulunur. Paket hazırlandıktan sonra, UART devresi bu paketi TX pini aracılığıyla karşı tarafa iletir.
Haberleşmenin gerçekleşmesi için öncelikli olarak verici tarafında logic 1 (HIGH) seviyesinde bulunan iletişim hattı iletişimin başlaması için logic 0 (LOW) seviyesine çekilir ve bizim başlangıç bitimizi (Start biti) temsil eder. Ardından göndermek istediğimiz verileri başlangıç bitinin arkasına ekleriz. Eğer parity bitine sahipsek onu da ekledikten sonra son olarak iletişimi sonlandırmak için gerekli olan bitiş (stop) bitini HIGH seviyesine çekerek iletişimin sonlandığını alıcıya bildiririz. Verici kısmında bu işlemler yapılırken alıcı kısmındaki UART cihazı 1’lerin sayısını hesaplayarak pakette bulunan parity bitinin değeri ile karşılaştırarak (RX pini aracılığıyla) alınan paketi hatalara karşı kontrol eder. İletimde herhangi bir hata yoksa, veri çerçevesini almak için başlangıç bitini, bitiş bitlerini ve parity bitini çıkarmaya devam eder. Alınan Baytlar yeniden oluşturulduktan sonra UART DATA Register’ında saklanır.
UART Parametreleri
UART iletişimde, uygun iletişimin sağlanması için her iki cihazda da aynı olması gereken bazı ayarlar vardır. Bu UART ayarları, baud hızı, veri uzunluğu, eşlik biti, durdurma biti sayısı ve akış kontrolüdür.
Baud Hızı(Baud Rate)
Baud hızı, bir UART cihazının iletebileceği/alabileceği saniyedeki bit (bps) sayısıdır. Doğru veri iletimi için her iki UART cihazının da aynı baud hızına ayarlanması gerekmektedir. Baud hızı için genel değerler 9600, 1200, 2400, 4800 , 19200, 38400, 57600 ve 115200 bps’dir.
Veri Uzunluğu(Data Lenght)
Veri uzunluğu, veri baytı başına bit sayısını ifade eder.
Eşlik Biti(Parity Bit)
Eşlik biti, iletilen verilere eklen bit bittir ve alıcıya iletilen verideki 1’lerin sayısının tek mi çift mi olduğunu söyler. Eşlik Biti için olası ayar Tek(Odd) veya Çift(Even)’tir.
- Tek(odd): veri çerçevesinde tek sayıda 1 varsa eşlik biti ‘1’dir.
- Çift(even): veri çerçevesinde çift sayıda 1 varsa eşlik biti ‘0’dır.
Durdurma Biti Sayısı(Stop Bits Number)
UART cihazları, iletilen bir dizi bitin (paket adı verilen) sonunu işaretlemek için hiç, bir veya iki durdurma bitini kullanabilir.
SPI Protokolü
SPI (Serial Peripheral Interface / Seri Çevre Birim Arayüzü) bir seri iletişim protokolüdür. 1970 yılında Motorola firması tarafından bulunmuştur. mikrodenetleyiciler, shift registarlar, sensörler ve SD kartlar gibi küçük çevre birimleri arasında veri göndermek için yaygın olarak kullanılan bir haberleşme veri yoludur. SPI, tam çift yönlü bağlantıya sahiptir. Yani bir master, bir slave’e veri gönderebilirken aynı anda bir slave’e de master’e veri gönderebilir. İletişim master ve slave cihazları arasında gerçekleşir. Veriler aynı anda gönderilip alınabilir. Ayrıca SPI senkron seri iletişim sınıfında bir iletişim protokolü olduğu için, iletişimin düzenli sağlanması amacıyla saat bilgisine de ihtiyaç duymaktadır. Master iletişim kurmak istediği cihazı seçer ve o cihazla iletişime geçer. Bu seçme genellikle SPI donanımı dahilinde olan SS(Slave select) pini ile gerçekleştirilir. Master cihazda SS pini kullanıcı tarafından belirlenir. Ancak kullanılan SS pini kullanılan cihazın Slave’dir( SPI’ı IC2’den ayıran özellik).
* SCLK : Serial Clock (output from master). Senkron seri haberleşmesi için kullanılır. Cihazların senkren olarak haberleşmesini saplayan kare dalgayı oluşturur. Saat sinyali master cihaz tarafından üretilir.
* MOSI : Master Output, Slave Input (output from master). Master’ın çıkış Slave’in giriş olduğu veri yolunu oluşturur.
* MISO : Master Input, Slave Output (output from slave). Master’ın giriş Slave’in çıkış olduğu veri yolunu oluşturur.
* SS : Slave Select (active low, output from master). Slave select anlamına gelir. Master cihazın Slave cihazları seçmesine yarar. Master’ın SS pinleri kontrol edilecek Slave cihaza göre seçilir ve kullanıcı tarafından belirlenir.
Veri iletimi 8-bit olarak gerçekleşir. CS ( chip select) pinini kullanarak slave seçimini yaptıktan sonra master cihazından gönderilmek istenilen veri MOSI pininin lojik 0 ve lojik 1 şeklinde binary olarak değiştirilmesiyle iletişim hattına yazılır. Her bir bit için CLK pinini 0 – 1 yapmanız yeterlidir. Aşağıdaki görselde iletişim işlemi daha detaylı gösterilmektedir.
İletişimin SPI ile gerçekleşeceğini belirtmek için SPI kütüphanesinin mikroişlemciye yüklenmesi gerekmektedir. İşlemcinin kodlanması sırasında master ve slave cihazları için ayrı ayrı kod blokları oluşturulmalıdır. Eğer bu iletişim türünü Arduino cihazınızda kullanacaksanız Arduino için hazırlanmış hazır bir SPI kütüphanesi bulunmaktadır. Ancak bu kütüphane Arduino cihazının her zaman master olacağı koşula göre hazırlanmıştır. Bundan dolayı başla bir Arduino cihazı slave yapmak isterseniz kullanılan registerlarda gerekli değişimler yapmanız gerekmektedir. Bu registerlar Arduino için aşağüıdaki gibidir.
SPDR(SPI Data Register) : Bu register SPI’daki aktarılacak veriyi tutar.
SPSR(SPI Status Register): Bu register SPI durumunu belirtir. Bit kaydırmada aktarılacak veri olup olmadığını kontrol eder.
SPCR(SPI Control Register) : SPI başlangıç ayarlarının yapıldığı registerdır. Master Slave ayarları burada yapılır.
I2C Protokolü
I2C iki adet pin üzerinden iletişim kurmayı sağlayan bir iletişim protokolüdür. Philips ( NXP ) firması tarafından oluşturulmuştur. Bir entegrenin içerisinde I2C sistemi var ise bu protokol ile kullanılabilir. Bu özellikler işlemcilerin – entegrelerin veri sayfa dokümanlarında bulunmaktadır. I2C protokolünde yönetici MCU’lara “master” yönetilen diğer parçalara ise “slave” denir.
I2C protokolünün avantajlarını ve dezavantajlarını aşağıdaki gibi listeleyebiliriz.
Avantajları:
- Esnektir, sistem içerisinde bir çok slave ve master/slave parçaları ekleyerek iletişim sistemini istediğiniz gibi geliştirebilirsiniz.
- Adrese dayalı seçim yapar , yani fazladan bir CS ( chip select) pinine ihtiyacınız yoktur.
- Bağlantı sadedir, birden fazla parçada kullansanız sadece 2 hat üzerinden bağlantı kurulur.
- Hata tespit sistemi olan ACK ve NACK bulunur. Böylece yapılan iletişimin doğru olup olmadığı anlaşılır.
- Hız gözetmeksizin bu protokole sahip tüm parçalar ile çalışır
Dezavantajları:
- Parça adresleri üretilirken tanımlandıkları için adres çakışması yaşanabilir (Özellikle klon ve sahte ürünlerde).
- Diğer paralel iletişim sistemlerine göre hızları sınırlıdır.
- Bazı durumlarda çok fazla pull-up direnci koymak PCB lerde alan sıkıntısına yol açabilir.
I2C Protokolü Kullanım Amacı
I2C protokolü normalde çok fazla pin ayrılması gereken cihazların sadece 2 adet pin kullanılarak ana cihaz ile iletişim kurmalarını amaçlar. I2C protokolünde sadece 2 pin ayrılarak aynı hat üzerine birçok RAM, EEPROM, RTC vb. parça bağlanıp kullanılabilir. Bu durumun sonucu olarak iletetişimdeki fazladan pin ihtiyacını ortadan kaldırır. I2C protokolünde hat üzerine başka MCU larda bağlanabilir. Sonradan bağlanılan bu cihazlar gerekli zamanlarda hem master hem slave olarak yerini alabilir.
I2C Protokolü Yapısı
I2C protokolünde iletişim için temelde fazladan bir devreye gerek yoktur. Sadece SDA ve SCL uçları dirençler ile pull-up yapılırlar. Pull-up dirençlerini hesaplamanın çeşitli teorik yöntemleri olsa da seçilecek iletişim hızına göre kabul gören bazı direnç değerleri aşağıdaki gibidir.
Mod |
Hız |
Direnç Aralığı |
Standart Mod |
100 Khz |
5kΩ – 10kΩ |
Hızlı Mod |
400 Khz |
2kΩ – 5kΩ |
Yüksek Hızlı Mod |
3,4 Mhz |
1kΩ |
I2C Kullanım Alanları
- I2C, monitörlerde renk dengesi, değişen kontrast ve renk tonu için kullanılır.
- Akıllı hoparlörde ses I2C iletişim yöntemi kullanılarak değiştirilir.
- Bilgisayarlarda fan hızı gibi tanı sensörlerinin okunmasında kullanılır.
- Sistem bileşenlerinde güç kaynağının açılması ve kapatılmasında kullanılır.
- Kullanıcı ayarlarını tutan gerçek zamanlı saatlere ve NVRAM yongalarına erişimde kullanılır.
Dostlar bu yazımızdan da bu kadardı. İçerik üretilmesini istediğiniz fikirlerinizi bana mailden ya da web sitesindeki Soru & Cevap kısmından iletebilirsiniz. İlerleyen dönemlerde bu haberleşme türlerini kullandığımız çeşitli uygulama örneklerini de sizinle paylaşacağım.
Bana destek olmak için sosyal medya hesaplarımdan, özellikle YouTube kanalımdan ve Linkedin hesabımdan beni takip edebilirsiniz. Bir sonraki paylaşımda görüşmek üzere.