Facebook RSS Feed
 

.NET Micro Framework: SPI İletişim

SPI (Serial Peripheral Interface) arabirimi, Motorola tarafından isimlendirilen full-duplex bir iletişim protokolüdür. Bir master cihaz ile birden çok slave cihazın seri yoldan haberleşmesini sağlar. Sensörler, ses codecleri, hafıza kartları, LCD'ler ve mikrodenetleyiciler arası veri iletişiminde tercih edilir.

Çalışma Mantığı

SPI arabiriminde iletişim kurulacak cihaz ve iletişimin saat frekansı master cihaz tarafından belirlenir. Slave cihaz aktif hale getirildiği anda işlem yapmaya başlar (Mesela analog - dijital çevirici ölçüm yapar) ve master cihaz saat frekansı ürettiği anda çift taraflı iletişim sağlanır. Bu işlem sırasında iki cihaz da birbirine veri göndermek zorundadır. İstenmeyen veriler karşı tarafta gözardı edilir. Veri alışverişi sonrasında saat frekansı durur ve slave cihaz pasif konuma geçer.

Birden çok slave cihazın bağlı olması durumunda ise yalnızca aktif slave cihaz ve master cihaz hattı dinler. Diğer cihazlar iletişimi bozmamak amacıyla bağlantıları kesilmiş (pasif) durumda kalırlar.

Pinlerin Tanımı

- SCLK (Serial Clock, SCK, CLK): Master cihazın ürettiği saat frekansı, SPI iletişiminin hızını belirler.
- MOSI (Master Out Slave Input, SIMO): Master cihazın slave cihaz(lar)a gönderdiği seri veri sinyali.
- MISO (Master Input Slave Output, SOMI): Slave cihazın master cihaza gönderdiği seri veri sinyali.
- SS (Slave Select, CS): Master cihazın o an çift yönlü haberleşeceği cihazın seçim bağlantısı. Genellikle düşük seviyede slave cihaz aktif olur. Kullanılacak her slave cihaz için ayrı bir pin ayrılmalıdır. O an aktif olmayan cihazlar hattı dinlemez ve iletişime karışmaz.
- INT (Interrupt): Slave cihaz, master cihaz ile iletişim kurmak istediğinde aktif (yada deaktif) olur. Bazı cihazlarda birden çok interrupt pini bulunabilir ve interrupt türüne / önceliğine göre hangi pinin aktif olacağı programlanabilir.

Bağlantı Şeması

SPI Arabiriminde cihazlar 3 yada 4 pin ile bağlanır. 3 Pin ile yapılan bağlantılarda MOSI ve MISO uçları tek hat üzerinde birleştirilir. 4 Pin ile yapılan bağlantılarda ise SCLK, MOSI, MISO ve hat üzerine bağlanacak her bir cihaz için SS uçları kullanılır. Master cihaz üzerinde her bir slave cihaz için bir pinlik SS bağlantısı ayrılması gerekir.

-

Yukarıdaki şemada en yaygın kullanılan SPI bağlantı şekli gösterilmiştir. Farklı amaçlara yönelik alternatif bağlantılar da yapılabilir.

Veri İletişimi

Veri iletişimi başlarken öncelikle master cihaz, iletişime geçmek istediği slave cihazın SS ucunu düşük konuma getirir. Daha sonra slave cihazın desteklediği bir saat frekansı üretir. Her bir saat döngüsünde 1 bitlik full-dublex iletişim gerçekleşir. (Master cihaz MOSI hattından 1 bit gönderir, slave cihaz bunu okur, slave cihaz MISO hattından 1 bit gönderir, master cihaz tarafından okunur.) Veri iletişimi sonrası saat frekansı durur ve SS ucu yüksek konuma getirilir.

.NET Micro Framework ile SPI Kullanımıı

Herhangi bir SPI destekleyen cihaz ile iletişim kurmak için örnek bir uygulama geliştirelim. Visual Studio 2010 içerisinde yeni bir .NET Micro Framework 4 Console Application oluşturalım.  Program.cs dosyasının Namespace'leri arasına

using Microsoft.SPOT.Hardware;

satırını ekleyelim. Proje referanslarına da "Microsoft.SPOT.Hardware.dll" dosyasını ekleyelim.

Program.cs dosyasının kodları ve açıklaması:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MFSPIIletisim
{
    public class Program
    {
        public static void Main()
        {
            //SPI Arabiriminin yapılandırmasını yapalım:
            //Bu ayarları slave cihazın datasheet'indeki değerlere göre yapmanız gerekir.
            //ADXL345 Accelerometer sensörü için örnek bir yapılandırma:
            SPI.Configuration spiConfig = new SPI.Configuration(Cpu.Pin.GPIO_Pin1, //SS pini
                false//Slave Select pininin aktif durumu (genellikle düşük durumdayken aktif olur)
                0, //Slave cihaz seçildikten sonra saat frekansı üretmeden önceki bekleme süresi
                   //Mesela: Analog - Dijital çevirici cihazların ölçüm yapması için gereken süre.
                0, //Veri alışverişi tamamlandıktan sonra slave cihazın aktif kalma süresi (SS enable)
                false//Slave cihaz seçili olmadığı durumda saat frekansının yüksek yada düşük olması
                false//Veri alımının saat frekansının yükselen yada alçalan durumunda oluşacağı
                800, //Saat frekansı, KHz biriminden
                SPI.SPI_module.SPI1); //Mikrodenetleyicinin kullanılacak SPI modülü
 
            //Slave cihazla iletişim kuracak SPI arabirimini oluşturalım:
            SPI spi1 = new SPI(spiConfig);
 
            //SPI slave cihaza gönderilecek byte dizisini oluşturalım:
            byte[] yazmaOnbellegi = new byte[] {128, 0};
 
            //SPI slave cihazdan okunacak veriler için bir byte dizisi tanımlayalım:
            byte[] okumaOnbellegi = new byte[2];
 
            //SPI slave cihaza byte dizisi göndermek için:
            spi1.Write(yazmaOnbellegi);
 
            //SPI slave cihaza byte dizisi gönderip, alınan veriyi başka bir byte dizisine atamak için
            spi1.WriteRead(yazmaOnbellegi, okumaOnbellegi);
            //Bu işlem sonrasında yazma önbelleğindeki 2 byte slave cihaza gönderilir ve slave cihazın
            //gönderdiği 2 byte okuma önbelleğine aktarılır.
 
            //Bir byte dizisinin yalnızca belirli elemanlarını okumak yada yazdırmak için WriteRead
            //metodunun overloadlarını kullanırız:
            spi1.WriteRead(yazmaOnbellegi, //Gönderilecek byte dizisi
                0, //Gönderilecek ilk eleman
                2, //Tanımlanan ilk elemanı takip eden, gönderilecek eleman sayısı
                okumaOnbellegi, //Gelen verilerin aktarılacağı byte dizisi
                0, //Gelen verilerin dizide yazmaya başlanacağı ilk eleman sayısı
                1, //Gelen verilerden kaç byte'ın okuma dizisine aktarılacağı
                1); //İletişim başladıktan sonra kaçıncı byte'tan itibaren gelen verinin kaydedileceği
            //Bu işlem sonrasında slave cihaza 2 byte yazılmış olur ve slave cihazın gönderdiği
            //2 byte'ın ikincisi okuma önbelleğinin ilk elemanına kaydedilir.

            //İşimiz bittiğinde Main Thread'i uyutalım:
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
        }
    }
}

Özetle, .NET Micro Framework ile SPI iletişimi sağlamak için öncelikle slave cihazın desteklediği şekilde ayarlamalar yapılır ve ardından mikrodenetleyicide kullanılacak SPI portu belirlenir. Daha sonra byte dizileri ile çift taraflı iletişim sağlanır.

SPI Slave cihazın iletişimi başlatması gerekiyorsa (harddisklerdeki free fall sensörünün düşüş anında master cihaza haber vermesi gibi) ek bir interrupt pini ile master cihaz durumdan haberdar edilir ve yine master cihaz iletişimi başlatıp durumu sorgular.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi