ana sayfa > PSoC > PSoC 5LP UDB Birimi ve SPI kullanımı

PSoC 5LP UDB Birimi ve SPI kullanımı

Pazartesi, 12 Haz 2017 yorum ekle yorumlara git
PSoC 5LP UDB Birimi ve SPI kullanımı

Evet Arkadaşlar bu yazımızda PSoC 5 serisinde SPI donanımını inceleyeceğiz. SPI ile birlikte UDB birimini ele almaya çalışacağım.

SPI protokolünü bilirsiniz Mikroişlemci dünyasında olmazsa olmaz bir seri haberleşme protokolüdür kendisi. Olmazsa olmaz diyorum çünkü neredeyse Her türlü sensör, ekran veya giriş çıkış birimi bu protokolü bir uçtan desteklemektedir.

Durum böyle olunca çok fazla kullanılıyor. Mikroişlemcilerde temel donanımlar arasına girdi. Her mikroişlemcide en az 1 tane olmak üzere duruma göre 2-3 tane SPI donanımı bulunabiliyor. Tabi biz şuanda standart mikroişlemcilerle ilgilenmiyoruz. Bizim işimiz PSoC ile :)

PSoC5 serisinde aslında doğrudan SPI donanımı yoktur. Mesela  mikroişlemci için konuşursak genellikle mikroişlemciler üretilirken 1 veya 2 adet mikroişlemci tasarlanırken SPI donanımı mikroişlemci içerisine gömülür. Sürekli kullanılmasa bile SPI donanımı orada bekler. Eğer üretim esnasında 2 adet spi eklenmişse siz donanımsal olarak 3 adet spi kullanamazsınız. Yazılımsal SPI vs kullanmanız gerekir.

PSoC’da ise durum böyle değildir. SPI donanımı tasarladığınız programda derlenme aşamasında PSoC içerisinde tasarlanıp PSoC içerisine gömülür.

PSoC içerisinde “Digital System” ve “Analog System” denilen iki adet birim vardır. Analog System içerisinde Analog tasarımlar yapılırken Digital System içerisinde dijital tasarımlar yapılmaktadır.

Bize lazım olan SPI birimi Digital System içerisinde UDB(Universal Data Block) larda tasarlanıp PSoC içerisine gömülür.

Aşağıdaki resimde PSoC 5 LP Serisinin Genel Mimarisi görünmektedir.

Şekil 1

Daha Derinlere inersek; Aslında UDB bloklarının içerisinde PLD(Programmable Logic Device ) yani Programlanabilir lojik aygıtlar bulunmaktadır. Aslında PSoC’ların FPGA’lara benzerliğide buradan gelmektedir. Bu sayede karmaşık lojik devrelerin tasarımı PSoC’larda yapılabilmektedir.

Digital System içerisine bakarsanız UDB’nin yanı sıra USB, CAN, I2C ve Timer gibi donanımların hali hazırda bulunduğunu görürsünüz. Bu Mikroişlemcilerde olduğu gibi standart bazı donanımların UDB’den bağımsız olarak PSoC içerisine eklendiğini gösteriyor. USB ve Can Bus dışındaki donanımlar UDB ilede kullanılabilir. Ama Can ve USB donanımları konusunda UDB seçeneği yok. Sanırım bu tür donanımlar karmaşık bir yapıya sahip olduğu için UDB den bağımsız olarak PSoC içerisine eklenmiş.
Genel olarak UDB biriminin iç yapısı aşağıdaki gibidir.

Şekil 2

PSoC içerisinde buna benzer UDB Bloklarından birden fazla bulunur. PSoC 5LP serisi için bu UDB bloklarından max. 24 adet bulunduğu yazıyor.

Bu  UDB bloklarını aslında bir flash hafıza gibi düşünebilirsiniz. Kullandığınız SPI, UART gibi donanımlar toplam UDB kaynağı kullanılarak PSoC içerisine gömüldüğü için toplam UDB miktarı azalır. Kalan UDB miktarını PSoC Creator Yazılımında Şekil 3’de Resources kısmında görebilirsiniz.

Şekil 3

SPI donanımı daha önce derleme esnasında tasarlanıp gömülüyor demiştim. Aslında tam olarak öyle değil. PSoC Creator yazılımı ile UDB dizisine göre daha önceden tasarlanmış ve test edilmiş olan UART, SPI, LIN, PRS, CRC, timer, counter, PWM, AND kapısı, OR kapısı gibi donanımlar Library olarak gelir. Biz devre şemamıza bu donanımlardan herhangi birini eklediğimizde PSoC creator yazılımı library ile gelen hazır tasarımları kullanır. Yani sonuç olarak biz birebir SPI donanımının tasarımıyla uğraşmıyoruz. Blok halindeki hazır tasarımları kullanarak kendi tasarımımızı yapıyoruz.

Tabi birtek hazır tasarımlarla sınırlı değil. İstersek eğer Verilog Yada HDL dili ile kendi bloklarımızı oluşturabiliyoruz anladığım kadarıyla. Bu konuyu henüz bende tam bilmiyorum. Muhtemelen FPGA’larda olduğu gibi bir mantık vardır. İleride bu işi öğrenirsem bu konuda bir yazım olabilir. Bende öğrene öğrene gidiyorum şu anda

Daha iyi anlamak için PSoC5 Mimarisini iyice okuyup anlamak gerekir. Merak edenler Buradan PSoC 5LP Architecture TRM dökümanını inceleyebilir.

Evet UDB ile ilgili anlatacaklarım bu kadar. Şimdi SPI donanımının kullanımını kısaca anlatıp örnek bir uygulama yapalım.

İlk önce yeni proje oluşturacağız. File>>new>>new Project kısmında kullandığınız PSOC serisi için yeni bir proje oluşturun. Benim kullandığım PSoC CY8C5868-AXI olduğu için projemi buna göre oluşturdum. Daha önceki yazılarımda nasıl proje oluşturulduğunu anlatmıştım. Bu konuda problem yaşayanlar Buraya bakabilir.

Boş Proje sayfası oluşturduktan sonra Component Catalog’dan SPI birimini alıp şemada boş bir alana yerleştirin.
Bir adet Clock kaynağı bağlayıp MISO, MOSI ve SCLK pinlerine birer pin bağlayın.

Şekil 4

Daha sonra pin ataması yapmanız gerekmektedir. PSOC ile çalıştığımız için Üreticinin bize sunmuş olduğu SPI pinlerini kullanmak zorunda değiliz. Bazı özel pinler haricinde bütün GPIO ları bu iş için atayabiliyoruz. Ben MOSI, MISO ve SCLK için Sırasıyla P0.0, P0.1 ve P0.2 pinlerini atadım.

Bundan sonra projenizi derleyebilirsiniz. Projenin Derlenmesi gerekmektedir.

SPI modülününde birkaç ayarı bulunmakta.

Şekil 5

Buradan Clock polaritesi, Bit genişliği gibi birkaç ayar yapılabilmekte. Bu arada SCLK frekansı Giriş frekansının yarısı kadardır. Yani 10Mhz clock uyguluyorsanız SCLK frekansının 5Mhz olur. Bu şekilde hız ayarı oldukça esnek bir şekilde yapılabiliyor.

Şemada yapılacak olan ayarlar bunlardan ibaret. Şimdi main.c dosyamızı açalım.

Main dosyasında ana programda ilk olarak SPI Master modulünü init etmemiz gerekiyor. Bunun için main programında SPIM_1_Start(); fonksiyonunu çağırmamız yeterlidir. Fonksiyonun başı sizin SPI modülüne verdiğiniz isimdir. Buraya dikkat edin.

Veri göndermek içinde birkaç adet fonksiyon otomatikmen bizim için hazırlanmış oluyor. Bu fonksiyonları görmek için Modüle ait header dosyasını(SPIM_1.h) inceleyebilirsiniz.

Örnek fonksiyonlardan aşağıdakiler ilgi çekebilir.
void SPIM_1_WriteTxData(uint8 txData) ;
uint8 SPIM_1_ReadRxData(void) ;
void SPIM_1_PutArray(const uint8 buffer[], uint8 byteCount);

Bu fonksiyonları kullanarak istediğiniz gibi veri gönderip alabilirsiniz.

Örnek kullanım şekli aşağıdaki gibidir

#include "project.h"

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    SPIM_1_Start();

    for(;;)
    {
        SPIM_1_WriteTxData(0xAA);
        /* Place your application code here. */
        CyDelay(1);
    }
}

SPI ile ilgili anlatacaklarım bu kadar. Bir sonraki yazımda görüşmek üzere.

Categories: PSoC Tags:
  1. şimdilik yorum yok.
  1. şimdilik geri bağlantı yok