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.
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.
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.
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