IAR ile STM8S – SPI

  • 8 ay önce, Baran EKREM yazdı.
  • 2 Yorum
  • 536 Kişi Okudu

Özellikle sensör ve çeşitli modülleri kullanmaya çalıştığınızda görmekten kusacağınız 2 haberleşmeden biri olan SPI, ufak tefek detaylarıyla başımızı çok ağrıttığını söyleyebilirim. Merak etmeyin ağrı kesiciniz bu yazıda. Yüksek hızları, çoklu cihaz haberleşebilme özelliği ile çok yaygın hale gelip her denetleyicinin içinde yer alan bu protokol, ufak ama önemli detaylar ile dolu. Fazla dikkate alınmayan 4 farklı modu yüzünden çalışmayan haberleşmenin kullanıcılara çok fazla zaman kaybettirdiğini söyleyebilirim. Genellikle PCB üstü kurulan bu haberleşme ile sensör ve çeşitle modülleri rahatlıkla kullanabiliriz. Birazdan SPI’ın aslında bir Shift Register olduğunu göreceksiniz. Hazırsanız başlayalım.

Serial Peripheral Interface (SPI) olarak bilinen bu haberleşme Master – Slave ilişkisine dayanır.

Bu iletişimde standart olarak 4 bağlantı yapılır.

  • SCLK = Serial Clock
  • MOSI = Master Out Slave In
  • MISO = Master In Slave Out
  • CS(SS) = Chip Select(Slave Select)

Eğer biz tek bir Slave ile haberleşecek olsaydık. Şu bağlantıyı kullanırdık.


Çoklu iletişim için şu bağlantıyı kullanırız.


Bu bağlantıda kontrolü sağlayan pin CS(SS) pinidir. Biz hangi CS(SS) pinini LOW yaparsak o slave ile iletişime geçeriz. Buna “Aktif sıfır” da denir. Bu pin ters çalıştığı için CS(SS) pini üzerinden bir çizgi işareti vardır. Haberleşmede tek bir Slave var ise CS pini direk LOW yapılabilir. Bu sayede 1 pinden tasarruf edebilirsiniz ama bunun güvenli olduğunu söylemek pek mümkün değildir. Peki nasıl oluyor da bu veri seri hat’a çıkıyor gelin buna bakalım.

Size aslında SPI’ın bir Shift Register olduğunu söylemiştim. Aşağıdaki kod MSB tarafından başlıyor. Bunun anlamı bitleri soldan sağa doğru yolluyor. Buna “MSB First” adı verilir. Eğer sağdan başlasaydı “LSB First” adı verilirdi.

Bu yapı size bir yerden tanıdık geliyor olabilir. 75HC595 Shift Register’ı benzer yöntem ile sürülür.

Aslı önemli detay çalışma modlarıdır. Bu konuda çok önemli bir ayrıntı vardır. Microchip PIC denetleyicilerin de kullanılan mod ayarı ile STM8, STM32 denetleyicilerinde kullanılan mod standartları farklıdır. Bu yüzden bu hep karıştırılır. Bu dört mod CPOL ve CPHA adı verilen 2 ayar ile belirlenir.

Görüldüğü gibi sadece CKE, CPHA’nın tersidir. Bu detayı unutmadığınız sürece bu kısımda sorun yaşamayacaksınız.

CPOL yani Clock Polarity SCLK pinin karakteristiğini belirler. Kısaca pin boşta iken LOW yada HIGH konumundan hangisinde kalacağını belirler. Bu duruma göre yükselen yada düşen kenar olduğunu görebiliriz.

CPHA yani Clock Phase MISO pinin veriyi hangi kenarda kenarda alacağını belirler.

Bunlar haricinden bazı denetleyicilerde CRC özelliği de vardır. SPI aynı zamanda CRC hesabı da yapar fakat bizim uygulamalarımızda buna pek gerek duymuyoruz.

SPI kullanırken dikkat etmeniz gereken bir diğer unsur ise fiziksel hatların durumudur. SPI yüksek hızlı olduğundan uzun hatlar hemen clock sinyalini bozulmasını sağlar. Bu yüzden hatlarda mutlaka Pull-Up yada Pull-Down direnci kullanmalısınız. Hangi tipte direnç takacağınıza CPOL karar verecek. CPOL = 0 ise hattınız boştayken LOW konumunda demektir. Bu yüzden Pull-Down yapmalısınız. Eğer CPOL = 1 ise Pull-Up yapmanız gerekecek.

Kodlar geçerken ufak bir hatırlatma yapalım. Normalde CLK Register’ı ile Modüllerini Clock sinyallerini aktif etmemiz gerekiyor fakat bu ayarlar reset durumu olarak zaten 1 konumunda bu yüzden ekstra bir şey yapmanıza gerek kalmıyor. Emin olmak ve göz önünde bulunması için şu satırı keyfi olarak ekleyebilirsiniz.

SPI Config kısmını ise oldukça basit. Her zaman olduğu gibi tek satırda aktif ediliyor.

Yukarıda anlattığım ayarları bu satırda yapmalısınız. Burada Clock frekansının SPI_BAUDRATEPRESCALER değerine bölünerek bulunduğunu unutmayın. Ben 16 yaparak 1 MHz elde ettim. Bunun sebebei HSI aktif olması ve değerinin 16 MHz olmasıdır.

Son olarak gönderme ve TXE durumunu kontrol eden fonksiyonu yazmamız yeterli.

Bir test satırı ile doğrulama yapalım.


Şimdi yüksek hızda Pull-Down direncini sökeceğim ve Clock sinyaline bakın ne olacak.



Tekrardan Pull-Down ekleyelim.

Sence hangi Clock sinyali daha güzel ? Make your choice!

main.c

main.h

 

  1. muharrem çetinkaya dedi ki:

    Üstadım paylaşımların için çok teşekkür ederim. Vermiş olduğun bilgiler ve örnek kodlar ile STM8S’e çok rahat adapte oluyorum.
    Yukarda ki anlatım da
    “Asıl önemli detay çalışma modlarıdır. Bu konuda çok önemli bir ayrıntı vardır. Microchip PIC denetleyicilerin de kullanılan mod ayarı ile STM8, STM32 denetleyicilerinde kullanılan mod standartları farklıdır. Bu yüzden bu hep karıştırılır. Bu dört mod CPOL ve CPHA adı verilen 2 ayar ile belirlenir.

    Görüldüğü gibi sadece CKE, CPHA’nın tersidir. Bu detayı unutmadığınız sürece bu kısımda sorun yaşamayacaksınız.” demişsin.
    Ben tabloda CKE ile CPHA arasında bir fark göremedim, acaba ben mi yanlış yorumluyorum.

    Sormak istediğim başka bir soru var. Compile ettikten sonra STM8 in Rom ve Ram kısmının ne kadarını kullanmışız ne kadar geriye kullanabileceğimiz alan kalmış bunu nasıl görebiliriz.
    Output klasöründe .map uzantılı dosyaya baktım ama algılayamadım, bu konuda bilgi verebilir misiniz?
    Şimdiden ilginize teşekkür ederim

Bir Yorum Yazın