Seri Haberleşme Protokolleri

Seri haberleşme için geçerli, standartlaşmış bazı senkron ve asenkron protokoller vardır, detaylı anlatımda ise UART, SPI ve I2C protokolünü inceleyeceğiz. Bunlar cihazların birbiriyle veya bir ana kontrolcü ile haberleşmesini sağlar. Yazımıza öncellikle senkron ve asenkron haberleşme hakkında bilgi vererek başlayalım;

Senkron Haberleşme

Senkron haberleşme gerçekleştirilirken, gönderilen veri biti ve alınan veri biti birbiriyle uyum içerisinde olmalıdır. İletişimi gerçekleştirecek olan aygıtlar eş zamanlı olarak çalışmak zorundadır. Yani alıcı ve verici aynı saat (clock) üzerinde olmalıdır.

Asenkron Haberleşme

Asenkron haberleşme yapmak için belirli bir clock’a ihtiyaç duyulmaz. Veri herhangi bir anda iletilebilir. Belirli standartlar kullanılarak gerçekleştirilir ve Senkron haberleşmeye göre daha yavaş bir iletim olur.

UART
SPI
I2C

UART Protokolü

UART hakkında detaylı bir şekilde hazırladığımız buradaki içeriğimize bakmanızı öneriyoruz.

UART (Universal Asynchronous Receiver Transmitter), bilgisayar ve mikrokontrolcüler veya mikrokontroller ve çevre birimler arasında haberleşmeyi sağlayan haberleşme protokolüdür. Asenkron olarak çalıştığı için herhangi bir “clock” ihtiyacı duymaz. USART (Universal Synchronous Asynchronous Receiver Transmitter) ise hem senkron hem de asenkron olarak çalışabilir. UART’a göre daha gelişmiş bir protokoldür. Haberleşme mantıklı aynı şekilde çalışır ancak USART aynı zamanda senkron haberleşmeleri de gerçekleştirebilir. Yeni çıkan bir mikroişlemcinin datasheet’ine baktığınız zaman bu birimleri genelde USART birimi olarak görüyoruz çünkü USART aynı zamanda UART’ı da kapsayan bir birim olarak tasarlanmıştır. USART, 5 ve 9 bit arası data uzunluğuna sahip veriyi taşıma özelliğine sahiptir. Ancak genel olarak 8 veya 9 bitlik kullanımlar tercih edilir.

UART-USART Haberleşmesi

UART haberleşmesini gerçekleştirirken ilk olarak baudrate (veri taşıma hızı) ayarlanması gerekir. Veri taşıma hızı çok çeşitli aralıklarda olabilir ancak piyasada yaygın olarak kullanılan baudrate’ler 4800, 9600, 57600, 115200 ve mikroişlemciler için çok fazla tercih edilmese de 921600. (921600 genelde hızlı işlem gerektiren yerlerde kullanılır.) Baudrate bizim verimizin saniyede ne kadarlık byte’ını taşıyacağını belirlememize yarar. Örneğin veri taşıma hızımızı 115200 seçersek bu bizim için saniyede yaklaşık olarak 11520 byte veri iletimi sağlayacaktır.Veri iletimi için aşağıdaki görseldeki gibi bir yapı kullanılır. Yani haberleşme işlemimiz bir başlangıç bitinden sonra data bitleri, ardından parity biti ve son olarak da bitiş biti gönderilerek sonlandırılır. Bu işlem sırasında data uzunluğu ve parity biti opsiyonel olarak değişkenlik gösterebilir.

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri
Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

Bu haberleşme tipini kullanabilmemiz için alıcı ve vericinin veri taşıma hızlarının (baudrate) aynı olması gerekiyor (veya birbirine çok yakın değerler olması gerekiyor.) Bunun sebebi ise aktarım sırasında oluşabilecek hataları minimuma indirmek. Hata payları tolere edilebilir seviyede olması taktirde bir sorun yaratmayacaktır (~%1-3)

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

Yukarıdaki görselde gördüğünüz gibi haberleşme gerçekleşmesi için ilk önce verici tarafında logic 1 (HIGH) seviyesinde bulunan iletişim hattı iletişimin başlaması için logic 0 (LOW) seviyesine çekilir ve bu bizim Başlangıç Bit’imizi (Start Bit) 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şime sonlandırmak için gerekli olan bitiş bitini (stop bit) HIGH seviyesine çekerek iletişimin sonlandığını alıcıya bildiririz. Biz verici kısmında bu işlemleri yaparken alıcı da aynı şekilde işlem yapar ve sadece bizim gönderdiğimiz dataları kendi UART Data Register’ına yazar.

Nasıl Kullanılır?

USART haberleşmesi yapabilmek için mikroişlemcimizdeki daha önceden tanımlanmış olan pinleri kullanarız. Bunun için ya USB-TTL dönüştürücü ya da RS232 modülü kullanırız. Her iki modülü de RX-TX pinleri mikroişlemcimizin RX-TX pinleri ile ters olarak bağlanacak şekilde bağlantısını yaptıktan sonra iletişimi başlatabiliriz. (Yani mikroişlemci TX —> Modül RX, mikroişlemci RX —> Modül TX)

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

SPI Protokolü

SPI hakkında detaylı bir şekilde hazırladığımız buradaki içeriğimize bakmanızı öneriyoruz.

Açılımı Serial Peripheral Interface’dir, Full-dublex olarak çalışır.(Veri alıp gönderme eş zamanlı), iletişim master  ve slave cihazlar arasında gerçekleşir. Master iletişimi 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 yapılır, master cihazda SS pini kullanıcı tarafından belirlenir. Ancak kullanılan SS kullanılan cihaz Slave’dir(IC2’den ayıran özellik)

  • SCLK : Serial Clock (output from master). :Senkron seri haberleşmesi için kullanılır. Haberleşme için kare dalga oluşturur. Yani SPI haberleşmesinde senkronu sağlayan saat bulundurur. 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.

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

Veri iletimi 8-bit olarak gerçekleşir. CS pinini kullanarak slave seçimini yaptıktan sonra master cihazından göndermek istediğiniz veriyi MOSI pinini Lojik 0 ve Lojik 1 şeklinde binary olarak değiştirerek hatta yazarsınız. Her bir bit için CLK pinini 0 – 1 yapmanız yeterlidir. Aşağıdaki resimde daha net bir şekilde görülmektedir.

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

İletişimin SPI ile gerçekleşeceğini belirtmek için SPI kütüphanesi mikroişlemciye yüklenmesi gerekir.Kodları yazarken hem master hem de slave cihazlar için ayrı ayrı kod yazılır. SPI iletişim için Arduino da hazır bir kütüphane bulunmakta. Ancak bu kütüphane Arduino her zaman master konumda olacağı düşünülerek hazırlanmış.

Slave cihaza kod yazılırken SPI kütüphanesinin veri aktarımı için kullanılan registerlarda gerekli değişimler yapılır. Bu registerlar arduino için;

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 hakkında detaylı bir şekilde hazırladığımız buradaki içeriğimize bakmanızı öneriyoruz.

I2C 2 adet pin üzerinden iletişim kurmayı sağlayan bir yazılım protokolüdür. Philips ( NXP ) firması tarafından oluşturulmuştur. Bir entegre yada parça eğer içerisinde I2C sistemi var ise bu protokol ile kullanılabilir yani bir RAM entegresinde I2C yok ise bu protokol ile kullanılamaz. I2C protokolünde yönetici MCU lara “master” yönetilen diğer parçalara ise “slave” denir.

Olumlu Yanları

Olumsuz Yanları

Esnektir, sistem içerisinde bir çok slave ve master/slave parça ekeleyerek istediğiniz gibi geliştirebilirsiniz.

Parça adresleri üretilirken tanımlandıkları için adres çakışması yaşanabilir

Adrese dayalı seçim yapar , yani fazladan bir CS ( chip select) pinine ihtiyacınız yoktur.

Diğer paralel iletişim sistemlerine göre hızları sınırlıdır

Bağlantı sadedir, birden fazla parçada kullansanız sadece 2 hat üzerinden bağlantı kurulur

Bazı durumlarda çok fazla pull-up direnci koymak PCB lerde alan sıkıntısına yol açabilir

Hata tespit sistemi olan ACK ve NACK bulunur. Böylece yapılan işlemin doğru olup olmadığı anlaşılır.(ileride anlatılacak)

Hız gözetmeksizin bu protokole sahip tüm parçalar ile çalışır

I2C Protokolü Kullanım Amacı

I2C protokolü normalde çok fazla pin ayrılması gereken parçaların sadece 2 adet pin kullanılarak sürülmesini 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 da fazladan pin ihtiyacını ortadan kaldırır. I2C protokolünde hat üzerine başka MCU larda bağlanabilir bunlar gerekli zamanlarda hem master hem slave olarak yerini alabilir.

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri

I2C Protokolü Yapısı

Temelde fazladan bir devreye gerek yoktur sadece SDA ve SCL uçları dirençler ile pull-up yapılırlar.

I2C protokolü  4 adet hız aralığına sahiptir.

100 kbit/s

400 kbit/s

1 mbit/s

3.2 mbit/s

Ancak kullanılan parçaların bu hızları desteklemesi gerekmektedir.

Kullanılacak dirençler için bir hesaplama yolu bulunsa da ben burada artık standartlaşmış değerleri vereceğim,  çünkü doğru hesap yapılabilmesi için I2C protokolüne bağlanacak parçalara giden bakır yolların dirençlerinin vs. hesaplanması gerekmektedir.Aşağıdaki tablodan kullanılacak hıza uygun pull-up direnç değerleri seçilebilir. I2C protokolü için kullanılacak hattın da çok fazla uzun olmaması gerekmektedir. Bu iletişim protokolü kısa mesafe için uygundur.

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Ω

Seri Haberleşme Protokolleri i2c,uart,spi,seri haberleşme protokolleri