- SPI İletişim Protokolü nedir?
- SPI Protokolü Nasıl Çalışır?
- I2C ve SPI İletişimi arasındaki fark
- XC8 Derleyicisini kullanan PIC16F877A ile SPI:
- SPI Başlık Dosyası Açıklaması:
- Ana program Açıklama:
- SPI hata ayıklayıcı ile PIC simülasyonu:
PIC Mikrodenetleyiciler, gömülü projeler için mikroçip tarafından sağlanan güçlü bir platformdur; çok yönlü doğası, birçok uygulama için yollar bulmasını sağladı ve henüz çok fazla büyümedi. PIC eğitimlerimizi takip ediyor olsaydınız, en temelden başlayarak PIC mikrodenetleyici hakkında çok sayıda öğreticiyi ele aldığımızı fark etmişsinizdir. Aynı akışta PIC ile mevcut olan iletişim protokollerini ve bunların nasıl kullanılacağını öğrenmeye devam ediyoruz. I2C'yi PIC Microcontroller ile zaten kaplamıştık.
Geniş gömülü uygulamalar sisteminde, hiçbir mikrodenetleyici tüm faaliyetleri tek başına gerçekleştiremez. Bir aşamada, bilgi paylaşmak için diğer cihazlarla iletişim kurması gerekir, bu bilgileri paylaşmak için birçok farklı iletişim protokolü vardır, ancak en çok kullanılanlar USART, IIC, SPI ve CAN'dır. Her iletişim protokolünün kendi avantajı ve dezavantajı vardır. Şimdilik SPI Protokolüne odaklanalım, çünkü bu eğitimde öğreneceğimiz şey bu.
SPI İletişim Protokolü nedir?
SPI terimi, " Seri Çevre Birimi Arayüzü " anlamına gelir. İki mikro denetleyici arasında veri göndermek veya bir sensörden bir mikro denetleyiciye veri okumak / yazmak için kullanılan yaygın bir iletişim protokolüdür. Ayrıca SD kartlar, vardiya yazmaçları, Ekran denetleyicileri ve çok daha fazlasıyla iletişim kurmak için kullanılır.
SPI Protokolü Nasıl Çalışır?
SPI iletişimi eşzamanlı iletişimdir, yani veri alışverişi yapan iki cihaz arasında paylaşılan bir saat sinyali yardımıyla çalışır. Ayrıca tam çift yönlü bir iletişim çünkü ayrı bir veri yolu kullanarak veri gönderip alabilir. SPI iletişim çalıştırmak için 5 kablo gerektirmektedir. Ana ve bağımlı arasında basit bir SPI iletişim devresi aşağıda gösterilmiştir.
İletişim için gereken beş kablo SCK (Seri Saat), MOSI (Master Out Slave In), MISO (Master In Slave Out) ve SS (Slave Select) 'dir. SPI iletişimi her zaman yalnızca bir ana ve bağımlı arasında gerçekleşir. Bir ana birimin kendisine bağlı birden çok bağımlı öğesi olabilir. Master, saat darbesini oluşturmaktan sorumludur ve aynısı tüm slave'lerle paylaşılır. Ayrıca tüm iletişimler yalnızca usta tarafından başlatılabilir.
SCK pini (diğer adıyla SCL-seri saat), master tarafından üretilen saat sinyalini slave'lerle paylaşır. MOSI pini (SDA –Seri Veri Çıkışı olarak da bilinir) verileri ana bilgisayardan salve'ye göndermek için kullanılır. MISO pini (SDI - Seri Veri Girişi olarak da bilinir), verileri merdaneden ana bilgisayara almak için kullanılır. Verilerin / sinyalin hareketini anlamak için yukarıdaki şekildeki ok işaretini de takip edebilirsiniz. Son olarak, ana bilgisayara bağlı birden fazla bağımlı modül olduğunda SS pini (CS – Chip select olarak da bilinir) kullanılır. Bu, gerekli slave'i seçmek için kullanılabilir. SPI iletişimi için master ile birden fazla slave'in bağlandığı örnek bir devre aşağıdaki devrede gösterilmektedir.
I2C ve SPI İletişimi arasındaki fark
PIC ile I2C iletişimini zaten öğrendik ve bu nedenle I2C'nin nasıl çalıştığını ve bunları RTC modülüne arabirim oluşturmak için I2C gibi nerede kullanabileceğimizi bilmeliyiz. Ama şimdi, zaten I2C'ye sahipken neden SPI protokolüne ihtiyacımız var? Bunun nedeni, hem I2C hem de SPI iletişiminin kendi yollarında avantajlar olması ve dolayısıyla uygulamaya özel olmasıdır.
Bir dereceye kadar I2C iletişiminin SPI iletişimine göre bazı avantajları olduğu düşünülebilir çünkü I2C daha az sayıda pin kullanır ve veri yoluna bağlı çok sayıda slave olduğunda çok kullanışlı olur. Ancak I2C'nin dezavantajı, veri göndermek ve almak için aynı veri yoluna sahip olması ve dolayısıyla nispeten yavaş olmasıdır. Dolayısıyla, projeniz için SPI ve I2C protokolü arasında karar vermek tamamen uygulamaya dayalıdır.
XC8 Derleyicisini kullanan PIC16F877A ile SPI:
Yeterince temel bilgiler, şimdi MPLABX IDE ve XC8 derleyicisini kullanarak PIC16F877A mikrodenetleyicide SPI iletişimini nasıl kullanabileceğimizi öğrenelim. Başlamadan önce, bu öğreticinin yalnızca XC8 derleyicisini kullanan PIC16F877a'daki SPI hakkında konuştuğunu açıklığa kavuşturalım, işlem diğer mikro denetleyiciler için de aynı olacaktır, ancak küçük değişiklikler gerekebilir. Ayrıca, PIC18F serisi gibi gelişmiş mikro denetleyiciler için derleyicinin SPI özelliklerini kullanmak için bazı kitaplıklara sahip olabileceğini unutmayın, ancak PIC16F877A için buna benzer hiçbir şey yoktur, bu yüzden kendi başımıza bir tane oluşturalım. Burada açıklanan kütüphane, PIC16F877A'nın diğer SPI cihazlarıyla iletişim kurması için kullanılabilecek alt kısımda indirilmek üzere bir başlık dosyası olarak verilecektir.
Bu eğitimde , SPI veri yolundan veri yazmak ve okumak için SPI iletişimini kullanan küçük bir program yazacağız. Daha sonra Proteus simülasyonunu kullanarak aynısını doğrulayacağız. SPI kayıtlarıyla ilgili tüm kodlar, PIC16f877a_SPI.h adlı başlık dosyasında yapılacaktır. Bu şekilde bu başlık dosyasını SPI iletişiminin gerekli olduğu tüm gelecek projelerimizde kullanabiliriz. Ve ana programın içinde sadece başlık dosyasındaki işlevleri kullanacağız. Başlık dosyasıyla birlikte kodun tamamı buradan indirilebilir.
SPI Başlık Dosyası Açıklaması:
Başlık dosyasının içinde PIC16F877a için SPI iletişimini başlatmalıyız. Her zamanki gibi başlamak için en iyi yer PIC16F877A veri sayfasıdır. PIC16F8777a için SPI iletişimini kontrol eden kayıtlar, SSPSTAT ve SSPCON Kaydı'dır. Veri sayfasının 74 ve 75. sayfalarında bunlar hakkında bilgi edinebilirsiniz.
SPI iletişimini başlatırken seçilmesi gereken birçok parametre seçeneği vardır. En sık kullanılan seçenek, saat frekansı Fosc / 4 olarak ayarlanacak ve ortada yapılacak ve saat ideal durumda düşük olarak ayarlanacak. Dolayısıyla, başlık dosyamız için de aynı yapılandırmayı kullanıyoruz, ilgili bitleri değiştirerek bunları kolayca değiştirebilirsiniz.
SPI_Initialize_Master ()
SPI Başlatma Ana işlevi, ana bilgisayar olarak SPI iletişimini başlatmak için kullanılır. Bu fonksiyonun içinde ilgili pinleri RC5 ve RC3 çıkış pinleri olarak ayarladık. Ardından SSPTAT ve SSPCON kaydını SPI iletişimini açacak şekilde yapılandırıyoruz
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Set köle modu için çıktı olarak }
SPI_Initialize_Slave ()
Bu işlev, mikro denetleyiciyi SPI iletişimi için bağımlı modda çalışacak şekilde ayarlamak için kullanılır. Bağımlı mod sırasında, RC5 pimi çıkış olarak ve RC3 pimi giriş olarak ayarlanmalıdır. SSPSTAT ve SSPCON, hem slave hem de master için aynı şekilde ayarlanır.
void SPI_Initialize_Slave () { TRISC5 = 0; // SDO pin çıkışı olarak tanımlanmalıdır SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 1; // Ana mod için giriş çıkışı olarak ayarla }
SPI_Write (gelen karakter)
SPI Yazma işlevi, verileri SPI veri yoluna yazmak için kullanılır. Gelen değişken aracılığıyla kullanıcıdan bilgileri alır ve daha sonra bunu Tampon yazmacına geçmek için kullanır. SSPBUF, ardışık Saat darbesinde silinecek ve veriler veri yoluna parça parça gönderilecektir.
void SPI_Write (gelen karakter) { SSPBUF = gelen; // Kullanıcı tarafından verilen verileri arabelleğe yaz }
SPI_Ready2Read ()
SPI Okumaya hazır işlevi, SPI veri yolundaki verilerin tamamen alınıp alınmadığını ve okunup okunamayacağını kontrol etmek için kullanılır. SSPSTAT yazmacının BF adında bir biti vardır ve bu veri tamamen alındıktan sonra ayarlanır, bu yüzden bu bitin ayarlanıp ayarlanmadığını kontrol ederiz, eğer ayarlanmamışsa, SPI veriyolundan herhangi bir şey okumak için ayarlanana kadar beklemeliyiz.
işaretsiz SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; aksi takdirde 0 döndürür; }
SPI_Read ()
SPI Read, verileri SPI veriyolundan mikrodenetleyiciye okumak için kullanılır. SPI veriyolunda bulunan veriler SSPBUF'da saklanacaktır, verilerin tamamı Buffer'da saklanana kadar beklemeliyiz ve sonra onu bir değişkene okuyabiliriz. Veri alımının tamamlandığından emin olmak için tamponu okumadan önce SSPSTAT yazmacının BF bitini kontrol ederiz.
char SPI_Read () // Alınan veriyi oku { while (! SSPSTATbits.BF); // Tüm verilerin okunduğundan emin olmak için BF biti ayarlanana kadar bekleyin return (SSPBUF); // okunan verileri döndür}
Ana program Açıklama:
Yukarıdaki bölümde açıklanan işlevler başlık dosyasında olacaktır ve bunlar ana c dosyasına çağrılabilir. Öyleyse, SPI iletişiminin çalışıp çalışmadığını kontrol etmek için küçük bir program yazalım. SPI veri yoluna sadece birkaç veri yazacağız ve aynı verilerin SPI hata ayıklayıcıda alınıp alınmadığını kontrol etmek için proteus simülasyonunu kullanacağız.
Programa her zaman olduğu gibi yapılandırma bitlerini ayarlayarak başlayın ve ardından az önce açıkladığımız başlık dosyasını aşağıda gösterildiği gibi programa eklemek çok önemlidir.
#Dahil etmek
Programı yukarıda indirilen zip dosyasından açtıysanız, varsayılan olarak başlık dosyası proje dosyanızın başlık dosyası dizininde yer alacaktır. Aksi takdirde, başlık dosyasını projenizin içine manuel olarak eklemeniz gerekir, eklendikten sonra proje dosyalarınız aşağıdaki gibi görünecektir.
Ana dosyanın içinde, PIC'yi SPI iletişimi için Master olarak başlatmalıyız ve ardından sonsuz bir süre döngüsü içinde, simülasyon sırasında aynısını alıp almadığımızı kontrol etmek için SPI veriyoluna rastgele üç onaltılık değer yazacağız.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Programda kullanılan rasgele değerlerin 0A, 0F ve 15 olduğuna ve onaltılık değerler olduğuna dikkat edin, bu nedenle simülasyon sırasında da aynısını görmemiz gerekir. Yani kodun tamamı yapılır, bu sadece bir örnektir, ancak diğer MCU ile veya SPI protokolünde çalışan diğer sensör modülleriyle iletişim kurmak için aynı metodolojiyi kullanabiliriz.
SPI hata ayıklayıcı ile PIC simülasyonu:
Artık programımız hazır olduğuna göre onu derleyip simülasyona geçebiliriz. Proteus, SPI veri yolu üzerinden verileri izlemek için kullanılabilen, SPI hata ayıklayıcı adlı güzel ve kullanışlı bir özelliğe sahiptir. Bu yüzden aynısını kullanıyoruz ve aşağıda gösterildiği gibi bir devre oluşturuyoruz.
Simülasyonda sadece bir SPI cihazı olduğu için SS pin kullanmıyoruz ve kullanılmadığında yukarıda gösterildiği gibi topraklanmalıdır. Hex dosyasını PIC16F877A mikrodenetleyicisine yükleyin ve programımızı simüle etmek için oynat düğmesine tıklayın. Simülasyon başladığında, aşağıda gösterildiği gibi SPI veri yolundaki verileri görüntüleyen bir açılır pencere göreceksiniz.
Gelen verilere daha yakından bakalım ve programımızda yazdığımızla aynı olup olmadığını kontrol edelim.
Veriler, programımızda yazdığımız sırayla alınır ve aynısı sizin için vurgulanır. SPI protokolünü kullanarak iki PIC mikrodenetleyici ile iletişim kurmak için bir programı simüle etmeyi de deneyebilirsiniz. Bir PIC'yi ana ve diğerini bağımlı olarak programlamanız gerekir. Bu amaç için gerekli tüm başlık dosyaları zaten başlık dosyasında verilmiştir.
Bu, SPI'nin neler yapabileceğine dair bir fikirdir, ayrıca birden fazla cihaza veri okuyabilir ve yazabilir. SPI protokolü ile çalışan çeşitli modülleri arayüzleyerek yaklaşan eğitimlerimizde SPI hakkında daha fazla bilgi vereceğiz.
Umarım projeyi anladınız ve ondan faydalı bir şeyler öğrenmişsinizdir. Herhangi bir şüpheniz varsa, bunları aşağıdaki yorum bölümüne gönderin veya teknik yardım için forumları kullanın.
Tam Ana kod aşağıda verilmiştir; tüm kodun bulunduğu başlık dosyalarını buradan indirebilirsiniz