SPI Haberleşmede sinyal şekilleri hakkında ?

Katılım
18 Ocak 2008
Mesajlar
1,067
Puanları
156
Yaş
39
Değerli ustalarım herkese selamun aleyküm bazı projeleri es kaza yapmama rağmen mantığını çözmek için epeyce zamandır fırsat buldukça çalışmalar yapmaktaydım... Benim için önemli olan devrenin çalışması değil o çalışma şeklindeki mantığıdır çünkü bir devreyi kopyala yapıştır ile yapmaktansa hiç yapmamak daha iyisidir...

Konumuz Spi haberleşme mantığındaki modlar ve datasheetinde çizilmiş sinyal diyagram şekillerini okuyabilmek...

Bunun için mantıklı olur diye daha önceden yapıp projesini yine burada paylaştığım bir konuyu ele alalım Max7219 ile spi haberleşme konunun linkini vereyim : https://www.kontrolkalemi.com/forum/konu/max7219-ve-pic16f877a-ile-yaptığım-8-hane-7-segment-display-sürmek-için-örnek-bir-proje.130322/

Bu projede elektroniği iyi bilen abilerimizden ustalarımızdan yardım rica ettik onlardan birisi de sadece şu satırın yazılması gerektiğini söyledi
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

Ama bu satır nedir ne işe yarar vs hiç bir şekilde yardımcı olmadı belki de olamadı...

Ben bu programı mikroC ile yazmaya çalışıyordum sadece öğrendiğim şey spi haberleşme komutları ile çalışırken özellikle modları ayarlaman gerekeceği için en doğrusu spi1 kanalını kullanmak çünkü pic in donanımsal olarak spi iletişimini yapmayı sağlayan komut olduğunu öğrendim ve modları da burada ayarlamaya olanak verdiğini gördüm aynı zamanda mikroc nin veri sayfası üzerinde de şu ifade mevcut :
SPI'yı yapılandırır ve başlatır . SPI Kitaplığı'nın diğer işlevleri kullanılmadan önce SPIx_Init veya SPIx_Init_Advanced öğelerinin çağrılması gerekir .

Bu yazıya göre SPIx_Init içinde de bu ayarları yapabilirmişiz ;)

Şimdi öncelikle şu yukarıda yazdığım kodun mod ayarlarının yapıldığı kısımı bi parçalamak istiyorum.

SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

_SPI_MASTER_OSC_DIV64 : Osilatör frekansı bölme oranı spi master dediği için picin osilatör frekansının 64 e bölünmesi

_SPI_DATA_SAMPLE_MIDDLE : Aralığın ortasında örneklenmiş giriş verileri clock sinyali verilerin tam ortasında aktif olması durumu

_SPI_CLK_IDLE_LOW : Sinyal iletişimi yokken saat sinyali boşta iken haberleşme yokken low seviyesinde olduğunu bildiriyor

_SPI_LOW_2_HIGH : Haberleşmenin clock hattının yükselen kenarında olduğunu yani düşükten yükselen kenara geçerken belirtiyor
Şimdi bir resim vereyim bu resim mikroc programının spi kütüphanesinden alıntıdır kaynak : https://download.mikroe.com/documents/compilers/mikroc/pic/help/spi_library.htm#spi1_init_advanced

NkEB4O.jpg


Bu resime göre spi yapılandırması yapılırken spi çalışma modu kısmında osc bölme oranını 4-16-64 olarak tanımlayabilirken Timer2 yi de kaynak olarak kullanabiliyormuşuz slave seçme ucunu da açık yada kapalı olarak ayarlayabiliyormuşuz...

Veri örnekleme aralığı kısmında verinin tam ortasında iletim yapılması yada sonunda iletim yapılmasını ayarlayabiliyormuşuz

Spi Clock ucunu veri iletimi yokken yukarıda yada aşağıda olarak ayarlayabiliyormuşuz.

İletim kenarı seçim kısmında ise veriyi clock darbesinin düşen kenarında mı yükselen kenarında mı olduğunu ayalayabiliyormuşuz.

En son olarak da spi modlarını anlatan bir kaynak paylaştıktan sonra da konuda benim için en önemli kısımı siz değerli ustalarıma sormak istiyorum.

gouCu6.jpg


Yukarıdaki resimde spi modlarını gösteren bir kaynak paylaştım evet ama şimdi asıl sorunum şu :

Örnek olarak yine daha önce yaptığım projedeki aktör olan max7219 entegresinin haberleşme sinyal diyagramını ele alalım ( datasheet'inden ekran resmi olarak alıntıdır )

nPXDZU.jpg


Şimdi yukarıdaki diyagram a baktığım zaman CS pininin haberleşme yok iken high seviyesinde olduğunu görüyorum bu da benim yazdığım yazılımdaki

Chip_select=0;

spi1_write(0x01);//KOD ÇÖZME MODU KAYIT ÖRNEKLERİ REGİSTERİ

spi1_write(0x08);

Chip_select=1; ///++++++++

Komutlarda Chip_select=0; diyip haberleşmeyi başlattığım ve haberleşme bittikten sonra Chip_select=1; dediğim ile örtüşüyor.

Clock sinyali açısından baktığımız zaman clock sinyalinin yükselen kenarında haberleşme yaptığını görüyoruz ki bu da bizim
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
ayar kısmındaki _SPI_LOW_2_HIGH, komutundan anlaşılıyor.

Clock sinyalinin düşükten yükseğe geçtiği anda veri iletiminin tam ortasına denk geldiğini görebiliyorum. bu durumu da yine ayar kısmında _SPI_DATA_SAMPLE_MIDDLE olarak ayarladığımdan dolayı emin olabiliyorum.

Clock sinyali haberleşme yok iken low yani düşük yani 0 da olduğunu görüyoruz ki bunu da yine _SPI_CLK_IDLE_LOW şeklinde yaptığımız ayar doğruluyor.

Son olarak bizim haberleşme şeklimiz : mod 1 olarak ayarlandığını doğrulayabilir miyiz ?

Bir de başka spi iletişime sahip entegrelerin haberleşme diyagramlarına baktığımız zaman nelere dikkat etmemiz gerekir hangi konular spi haberleşmenin olmazsa olmazlarıdır ? ve bir timing diagram denen diyagramı nasıl okumalıyız örnekler ile bir kaç tane açıklama yapmanız mümkün müdür ?

Ben diyagramlara bakarak haberleşmede ne yapmam gerektiğini anlamayı öğrenmek istiyorum.
 
Son düzenleme:
Elinize emeginize saglık.Benimde eklemek istediklerim var.Daha önceleri sadece assembly dilini kullandıgım için bende sizin gibi calısma mantıgını mümkün oldugunca anlayarak yapmaya calısıyordum.Şimdilerde ise arm işlemciye gectim ve cubeide yardımı ile yapmak istediklerimi gayet kolay bir sekilde yapmaktayım.Sizlerede tavsiyem bir an önce arm işlemciye ve bu konuda oldukca çok dökümana sahip st serisi chiplere gecmeniz.youtubede oldukca fazla örnek var.
Gelelim spi haberleşmesine.
Benim spi den anladıgım:
8 bitlik shift registerli bir ic düsünün,her clock sinyali verdiginizde datain pinindeki datayı içine alır(en sol tarafa) ve bu sıradada dataout pinindeki datayıda(en sagdaki) dısarı verir.Bu sayede eger 8 adet clok sinyali gönderirsek bizim verdiklerimiz registerin içine girer ve aynı andada registerin içindeki data dışarı cıkar(saga kayma yaparak). işte bu yüzden sadece okuma yapmak istiyorsak dumy(sahte byte) göndermek ve registerin içindekileri okumak zorundayız.Eger bir registerin içindeki datayı yeni data ile degiştirmek ve eski datayıda okumak istersek,bu sefer sahte(dumy)byte degilde içerisine koymak istedigimiz datayı yazıyoruz ve aynı andada cıkanı okuyoruz.
Yani işin özü,chip i sec,girise istedigin biti koy,clock sinyali uygula,çıkıstan içerdeki bitin en sagını oku.Bu işlemi 8 kez yaptınmı bir byte okumus olursun.
Tek dikkat etmen gereken chiplerin cevap verme hızları ve senin clock sinyalinin frekansı.
 
Öncelikle güzel bir konuya değinmişsiniz.

8 bitlik bir kaydırma yazmacı 8 tane saat sinyali ile tetiklenen iki durumludan ("flip flop") oluşuyor.

D-FF-Shift-Register.gif


Dikkat ederseniz burada bir veri girişi var. Buradan girilen veriler 0 veya 1 saat sinyali ile kaydırılarak 0'ıncı bite doğru hareket ediyor.

Yani bir bayt veri iletimi 8 saat darbesi ile gerçekleşiyor.

Bu örneği ücretsiz Logisim yazılımı ile kurup kendiniz deneyebilirsiniz.

Basit olsun diye kaydırma yazmacını şu şekilde de gösterebiliriz.

Shift_Register.gif

Örneğin burada bir gönderici bir tane de verici var. Yükle düğmesi ile veri yükleniyor. Kaydırma yazmacı ile 4 saat darbesinde veri vericiden alıcıya gönderiliyor.

Serial-Com.gif

O kılavuzlardan konuyu anlamak biraz zor olabilir.

SPI-Daisy-Chain-Configuration.webp

Yukarıdakilerden şunu anlıyoruz. 8 saat darbesinde her yardımcı birim girilen veriyi çıkışa kopyalıyor.

Daha da konunun detayları var. Merak edenler buradan inceleyebilir.

https://deepbluembedded.com/spi-tutorial-with-pic-microcontrollers
 

Forum istatistikleri

Konular
127,954
Mesajlar
913,892
Kullanıcılar
449,604
Son üye
baba pero

Yeni konular

Geri
Üst