SPI protokolü Motorola firması tarafından geliştirildi. Protokol kullanışlı olunca bir çok entegrenin ve gömülü sistemin dahali haberleşmesi için kullanılmaya başlandı.  Artık çoğu elektronik cihazların ve entegrelerin veri transferleri bu protokolle gerçekleştiriliyor.

413332

SPI protokolü hakkındaki teknik bilgiler için bu yazıya bakabilirsiniz.

 

Protokolü çoğu programcı bilse de tam olarak nasıl çalıştığını bilemeyebilir. Çünkü protokol için yazılmış çok fazla kütüphane mevcut. Bu protokode veri transferini tam olarak anlayabilmek için biraz daha temel düzey programlama ve elektronik bilmek gerekiyor.  Bu gün bu protokolde Assembly dilinde veri transferinin nasıl gerçekleştiğini anlatmaya çalışacağım.

SPI protokolünde iki tip cihaz vardır. Master ve Slave olarak tabir edilir.  Master cihaz haberleşmeyi kontrol eder slave cihaz ise haberleşme hattında bulunan ve bir den fazla olabilen cihazdır.  Şimdi yazacağımız programda mikro denetleyiciyi master cihaz olarak seçiyoruz. Bu, clock sinyalinin de mikro denetleyici tarafından üretileceği anlamına geliyor.  SPI protokolü verileri en büyük bitinden en küçük bite doğru gönderir ve üretilen clock sinyalinin her bir yükselen ve ya alçalan kenarında okur. Bu sayede senkronizasyon sağlanmış olur.  Gönderilecek verilerin önünde her zaman 8 bitlik bir adres bilgisi vardır. Bu 8 bitlik adresten sonra veri gönderilir. Ve alıcı veriyi gönderilen adrese yazar.  Burada adres byte’ının en büyük biti önem arz eder. Eğer en büyük bit “0” ise okuma işleminin gerçekleşeceği, eğer “1” ise yazma işleminin gerçekleşeceği bildirilir.  Ve eğer okuma işlemi yapılacak ise gönderilen adres verisinden sonra alıcı cihaz o adresteki veriyi, adresi gönderen cihaza gönderir.

Yazma işlemi için ilk önce CE pini “high” yapılır. Daha sonra adres byte’ının en büyük biti “1” yapılarak veriler “Working Register” den “SSPBUF” kaydedicisine kaydedilir.  Bu kaydedici otomatik olarak veriyi pic’in SDO pininden slave cihazlara yollar.   Daha sonra CE=”0″ yapılarak gönderim işlemi sonlandırılır.

bbb

 

Okuma işlemi için ise CE=1 yapıldıktan sonra adres byte’ının en büyük biti “0” yapılır ve veri “SSPBUF” kaydedicisine kaydedilerek gönderilir.  Ve gelecek data beklenir. Bunun için SSPSTAT kaydedicisinin  0.biti olan BF bitinin 1 olması beklenir. Eğer bu bit “1” olduysa veri alınmış demektir. Eğer “0” ise veri alınmak için beklenir.

SPI-recieve

Ayrıyeten bir de SSPCON1 kaydedicisi vardır. Bu kaydedici protokol ile ilgili bazı bilgiler barındırır.  Örneğin haberleşme için kullanılacak clock sinyalinin frekansı d3-d0 0010 yapılarak  focc/4 ayarlanır.  Ayrıca SPI pinlerinin aktif olabilmesi için D5 “1” olmalıdır.

 

MOVLW 0x00              ; SSPSTAT kaydedicisini haberleşme için sıfırlıyoruz
MOVWF SSPSTAT           ; Veriyi Kaydediciye kopyalıyoruz
MOVLW 0x22              ; SSPCON1 kaydedicisini fosc/64 SPI olarak ayarlıyoruz
MOVWF SSPCON1           ; Veriyi kaydediciye kopyalıyoruz
CLRF TRISC              ; C portunu çıkış yapıyoruz
BSF TRISC SDI           ; SDI pini hariç

BSF PORTC, RC2          ; CE=1 yaparak veri transferini başlatıyoruz
MOVLW 0x80              ; Gönderilmek üzere adres verisini Wreg'e kaydediyoruz
CALL SPI                ; Veriyi Gönderiyoruz
MOVLW 0x12              ; Esas veriyi gönderilmek üzere Wreg'e kaydediyoruz
CALL SPI                ; Veriyi Gönderiyoruz

SPI MOVWF SSPBUF        ; Wreg deki veriyi gönderdik
BEKLE BTFSS SSPSTAT, BF ; SSPSTAT BF biti "1" olana kadar bekliyoruz
GOTO BEKLE
MOVF SSPBUF, w          ; Veri geldiyse Wreg'e yazıyoruz
RETURN

END

 

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz