6 – SPI Modülü

Bu hafta MSP430’lardaki USI Modülü altındaki SPI birimini inceleyeceğiz. Genellikle düşük seviye MSP430 modellerinde bulunan USI modülü, içerisinde hem SPI hem de I2C birimlerini barındırmaktadır. Daha yüksek seviyeli modellerde ise USCI adı verilen, SPI ve I2C birimlerine ek olarak bir de Seri haberleşme(UART) birimini barındıran bir modül bulunmaktadır.

Arıca USI modülünden gelen bilgilerin tutulduğu USISR Shift Registerına 8 ya da 16 bit olarak erişilebilmektedir. İşaret kaynağı olarak ise ACLK, SMCLK, MCLK kaynaklarına ek olarak USI modülünün kendi işaret kaynağı olan USISWCLK seçilebilmektedir.

USI Modülü

Her ne kadar SPI birimini ineceleyecek olsak da önce USI modülünün hem SPI hem de I2C birimleri için ortak kullanılan kısımlarını incelemekte fayda var.

USI modülü altında ortak kullanılan en önemli saklayıcılardan biri USICNT saklayıcısıdır. Bu saklayıcı kaç bit veri gönderileceğini belirlemek için kullanılır ve otomatik olarak azaltılarak 0’a ulaştığı anda kesme bayrağını etkiler. Bu sayıcı 0’a ulaştıktan sonra bir kez daha azalıp 0xFF olmamaktadır. ‘İşaret kaynağının her yükselen kenarında bu sayıcı da bir azaltılarak seri haberleşme işlemi devam etmektedir. Ve seri haberleşme sonuuc alınan bit USISR Shift Registerine aktarılmaktadır. Sayıcı 0’a ulaştığı anda kesme vektörüne dallandığı için programın bu kısmında sayıcıya tekrar ilk değeri yükleyen bir kod yazılmalıdır.

Diğer önemli saklayıcı ise USISR saklayıcısıdır.

USISR saklayıcısı iki adet 8 bit saklayıcıdan oluşan 16 bitlik bir Shift Registerdir. Bu saklayıcının düşük değerlikli baytını kullanmak için USISRL, yüksek değerlikli baytını kullanmak için ise USISRH saklayıcıları kullanılmaktadır.

Eğer haberleşmede gönderilecek bitler 8 bit veya 8 bitten küçükse genelde USISRL saklayıcısı kullanılır.

Eğer haberleşmede gönderilecek bitler 8 bitten büyükse hem USISRH hem de USISR registerları kullanılabilir. Aşağıdaki diyagram USISR saklayıcısını göstermektedir.

USI için İşratet Kaynağını Seçmek


USI Modülü için işaret kaynağı USICKCTL saklayıcısındaki USISSEL bitleri kullanılarak seçilmektedir. Yukarıdaki resimde de görüldüğü gibi 8 adet farklı işaret kaynağını bu modül için kullanabilmekteyiz.

Yine yukarıdaki resimde görüldüğü gibi USI modülünün kendi işraet kaynağı olan USISWCLK da işaret kaynağı olarak kullanılabilmektedir.

Diğer bir özellik ise USI biriminin frekans bölücüsüdür. Bu frekans bölücü yine USICKCTL saklayıcısındaki USIDIV bitleri kullanılarak ayarlanabilmektedir. Bu frekans bölücü, işaret kaynağımızı 1,2,4,8,16,32,64 ve 128 e bölebilmektedir.

SPI Modu

USI modülü için genel olarak kullanılan birimlerden bahsettikten sonra asıl konumuz olan SPI protokolünün nasıl kullanıldığını inceleyeceğiz. Aşağıdaki diyagramda SPI modülünün temel yapısı görülmektedir.

USI modülünü SPI modunda kullanmak için USICTL1 saklayıcısındaki USII2C bitini 0 yapmalıyız. Aşağıda, SPI Modunda nasıl veri akışı olduğu ve kesme bayrağının ne zaman etkilendiği zaman diyagramı şeklinde görülmektedir.

SPI Master Modu

SPI Modunu master olarak kullanabilmek için basitçe şu tanımlamaları yapmamız gerekmektedir.

MSP430G2231 Mikrodenetleyicisi için;

USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE;

// Port ayarları yapılıyor, SPI master modunda, SPI Çıkışları aktif

USICTL1 |= USIIE; //USI kesmeleri aktif

USICKCTL = USIDIV_4 + USISSEL_2; // Frekans Bölücü /16, SMCLK

USICTL0 &= ~USISWRST; // USI Aktif(Reset modundan çıkıldı)

SPI Slave Modu

SPI Modunu slave olarak kullanabilmek için basitçe şu tanımlamaları yapmamız gerekmektedir.

MSP430G2231 Mikrodenetleyicisi için;

USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE;

// Port ayarları yapılıyor, SPI slave modunda, SPI Çıkışları aktif

USICTL1 |= USIIE; //USI kesmeleri aktif

USICTL0 &= ~USISWRST; // USI Aktif(Reset modundan çıkıldı)

SPI Kesme Vektörü

USI modülü için sadece bir adet kesme vektörü kullanılmaktadır(USIIFG). Bu kesme vektörü hem SPI hem de I2C modu için ortaktır. SPI modunda yukarıda bahsedilen USICNT saklayıcısı sıfır(0) a ulaştığı anda kesme vektörüne dallanılmaktadır. Aşağıda bu donanımın blok diyagramı yer almaktadır.

Uygulama Kodu

main.c   
/*
6 - SPI Modülü
 
MSP430G2452 Mikrodenetleyicisi SPI Modülü ile
74hc595 Shift Registeri Örneği.
 
Muhammed Fatih İNANÇ
www.mcu-turkey.com
05.03.2011
*/
 
#include "io430.h"
#include "in430.h"
 
#define delay()  for (i = 0x1FFF; i > 0; i--);
#define latch_ac_kapa()   P1OUT &= ~BIT0; P1OUT |=  BIT0;
 
void usi_init(void);
 
unsigned char reg=1;
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR = BIT0;                        // P1.0 Çıkış, Diğerleri Griş
  P1OUT = BIT0;                        // P1.0 = 1 
 
  usi_init();
 
  _BIS_SR(LPM3_bits + GIE);            //LPM3 Modunda
}
 
#pragma vector=USI_VECTOR
__interrupt void usi_vektoru(void)
{
  volatile unsigned int i;
 
  delay();
 
  if(reg==0)
    reg=1; 
 
  while(P1IN&BIT3);  //P1.3 Butonu Bekleniyor...
 
  latch_ac_kapa();
 
  USISRL = reg;
  reg<<=1;
 
  USICNT = 8;                         // USI yi Başlat
  USICTL1 &= ~USIIFG;                 // USI Kesme Bayrağı Temizlendi
}
 
void usi_init(void)
{
  USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE;
  //Port Ayarları Yapılıyor, SPI Master Modunda, Çıkışlar Aktif
  USICTL1 |= USICKPH + USIIE; // USI Kesmeleri Aktif
  USICKCTL = USIDIV_7 + USISSEL_1;     // Frekans Bölücü = /128 ACLK
  USICTL0 &= ~USISWRST;                // USI Kesme Bayrağı Temizlendi
 
  USICNT = 8;                          // 8 Bit İletişim Yapılacak
  USISRL = 0x01;
}

6 – SPI Modülü” üzerine 4 düşünce

  1. Tugay Arslan

    Arduino kullaniyorum bayadir. Msp430a pek isinamadim. Port giris cikis islemleri bile cok sacma ve ilginc geldi. Kullanmak istedigim birsey var. Ancak msp430 destekliyor mu nasil yapiliyor bilmiyorum.
    Arduinoda com porta arduinodan veri gonderebiliyor ve o veriyi serial monitorden okuyabiliyorsunuz. Bunu msp430da yapabilir miyiz ?

    Cevapla
    1. M.Fatih İNANÇ Yazar

      Evet bu işlem MSP430 LaunchPad’de de yapılabiliyor. Fakat baud hızınız maksimum 9600 baud. Ona dikkat etmek gerekiyor.
      Bir de bu işlem, G2231 üzerinde donanımsal UART olmadığı için mecburen Timer_A kullanarak yazılımsal olarak yapılabiliyor.

      Arduino gibi bir serial monitor programı yok ama herhangi bir seri port programı da aynı işi gorüyor 😉

      Cevapla
  2. Geri izleme: Muhammed Fatih İNANÇ » 7 – I2C Modülü

  3. Geri izleme: 7 – I2C Modülü « MCU Turkey

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir