has_artvin_li ( TA3TCM )
Usta Üye
- Katılım
- 18 Ocak 2008
- Mesajlar
- 1,078
- Puanları
- 156
- Yaş
- 40
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
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.
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 )
Ş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.
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
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.
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 )
Ş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: