SPI BUS

SPI, cihazlar arasında iletişim kurmak için kullanılan bir senkron seri iletişim protokolüdür. SPI, iletişim çerçevesini başlatan tek bir ana aygıtla bir master-slave mimarisi kullanır ve tam çift yönlü modda çalışır (veriler aynı anda gönderilir ve alınır). Dijital sistemlerde veriler 1 ve 0 şeklinde aktarılır. Donanımda, 1'ler ve 0'lar yüksek ve düşük voltajlar olarak temsil edilir. 3.3V kullanır, bu nedenle 1, bir tel üzerinde ~ 3.3V'ye karşılık gelir ve 0, ~ 0V'ye karşılık gelir. SPI senkronize bir iletişim protokolüdür, yani veriler saat darbeleriyle zamanlanır. Aynı anda gönderilir ve alınır. Bu, dört satırdan ikisinin (MISO, MOSI) veri için, satırlardan birinin (SCK) zamanlama için olduğu anlamına gelir. SPI iletişim kurmak için SPI veri yolu olarak adlandırılan dört kablo kullanır. Bir SPI veriyolundaki tüm cihazlar arasında üç hat (SCK, MOSI, MISO) paylaşılır. Dördüncü hat (CS / SSher bağımlı cihaz için benzersizdir ve tüm CS / SS hatları ana cihaza bağlanır. Ana cihaz, tüm cihazları senkronize etmek için her zaman SCK'ya (kaynak saati) kare bir dalga iletir. İletişimi başlatmak için ana cihaz, belirli bir cihaz için CS / SS (yonga seçimi / bağımlı seçimi) ayarını düşük yapar. Ana cihaz, MOSI (master çıkışı, slave girişi) satırındaki slave cihaza veri gönderir. Aynı zamanda, bağımlı cihaz MISO (master giriş, slave çıkış) hattındaki ana cihaza veri gönderir. İletişimi durdurmak için ana cihazlar CS / SS'yi tekrar HIGH ayarlar.

SCK / SCLK (Kaynak Saati)

Saat, veri hatlarını ve cihazları senkronize tutar. Saat, ana cihaz tarafından üretilen ve alıcı cihaza verileri ne zaman okuyacağını söyleyen salınımlı bir sinyaldir. Cihaz özelliklerine bağlı olarak, veriler SCK'nın yükselen / düşen kenarında gönderilir / alınır. 

MOSI (Master Out Slave In)

Bu, verilerin ana cihazdan bağımlı cihaza gönderildiği satırdır. Bu satır tüm bağımlı cihazlar tarafından paylaşılıyor.

MISO (Master In Slave Out)

Bu satırda veriler, master tarafından alınan bağımlı cihazdan gönderilir. Bu satır tüm bağımlı cihazlar tarafından paylaşılıyor.

CS / SS (Yonga Seçimi / Bağımlı Seçim)

Bu satıra dönüşümlü olarak CS veya SS denir. Aktif düşük, yani CS, LOW ayarlandığında bağımlı cihaz aktiftir. Bir seferde yalnızca bir CS LOW olabilir veya SPI veriyolunda çöp verisine neden olan çakışmalar olabilir. Varsayılan değeri ayarlamak için CS pininde bir çekme direnci kullanırız. Bir çekme direnci, VCC (bizim durumumuzda 3V3) ile başka bir pim arasında köprü oluşturan büyük bir dirençtir (tipik olarak 10K). Pime hiçbir yük uygulanmadığında, dirençten akım geçmez. Bu, CS pimi başka bir devre tarafından tahrik edilmediğinde CS'yi bilinen (3V3) durumda tutmamızı sağlar. Ardından, cihazı seçmek için CS hattında LOW (GND) başka bir pim kullanabiliriz. Akım dirençten geçecek ve 3.3V'ye düşecektir.

Donanım Sinyali

Bir osiloskopta SPI veri transferinin böyle görünmesi gerekir:

Aşağıdaki soruyu soracağım:

Hangi çizgiler hangileridir?
Bu resimde MISO ve MOSI arasında gerçekten ayrım yapamazsınız, ancak birini MOSI ve diğerini MISO olarak seçebilirsiniz. Ne gönderiliyor ve alınıyor? Cevap aşağıda verilmiştir.
Cevap:
  1. Sarı çizgi CS. Bunun nedeni, SPI aktarımı tamamlandıktan önce alçaltılması ve yükseltilmesidir.
  2. Yeşil çizgi SCK. Gönderilen her bayt için 8 kez salınım yapar.
  3. Pembe ve mavi MOSI ve MISO. Mavi çizgide 0x00 ve 0b10010101, pembe çizgide 0x00 ve 0b01010101 vardır.

Spi Kütüphanesi Kullanma

SPI mesajları göndermek için temel yazılım adımları. Kurmak için:
  1. SPI'yi başlat.
  2. CS'yi çıkış pini olarak başlat.
  3. CS'yi HIGH olarak ayarla.
Aktarma için:
  1. CS'yi LOW olarak ayarla.
  2. SPI mesajı gönder.
  3. CS'yi HIGH olarak ayarla.

CS Pimi

Mikrodenetleyicimizde her IO pininde onu kontrol eden üç kayıt bulunur. Sadece ikisini kullanmamız gerekecek. Pimin çıkışımıza girip girmediğini kontrol eden veri yönü kaydı ve pime HIGH veya LOW yazmanıza izin veren bağlantı noktası kaydı vardır. CS için hangi pimi kullandığınızı anladıktan sonra, pimin adını almak için mikro denetleyicinin veri sayfasını kontrol edebilirsiniz. Şekil 1, ATmega32m1 mikrodenetleyici için pim yapılandırmasını göstermektedir. 

Her birinde sekiz pim bulunan dört bağlantı noktası (B, C, D ve E) vardır. Dört bağlantı noktasının her biri için 8 bit veri yönü ve bağlantı noktası kayıtları vardır. Kayıttaki her bit ayrı bir pim içindir. Veri yön kaydına DDRx ve bağlantı noktası kaydına PORTx adı verilir, burada x bağlantı noktasıdır. PB6'yı çıktı olarak başlatmak istiyorsanız, kod aşağıdaki gibi olacaktır.

 

 

Makro _BV(PB6) kodu ile genişler ve PB6, adından da anlaşılacağı gibi 6'ya genişleyen bir makrodur. İşte PB6'da HIGH veya LOW yazma kodu 1 << PB6'dur.

SPI kütüphanemizde bunu sizin için yapacak fonksiyonlarımız vardır. Onları böyle kullanacağız

.

SPI'yi Başlat

init_spi(), SCK ve MOSI'yi OUT olarak başlatır ve SCK frekansını 8 MHz / 64 olarak ayarlar. 32M1'in dahili saat frekansı 8 MHz'dir.

SPI Mesajı Gönderme

SPI 8 bitlik mesajlar gönderir. Bir bayttan daha fazlasını göndermek istiyorsanız, art arda SPI mesajları gönderebilirsiniz. Bunu böyle yaparsınız. 

Örnek SPI Kodu

/*
Example from PAY:
Say we want to use the pin labelled PB5 on the 32M1 as the CS pin for the SPI device.
It uses pin 5 on DDR B (data direction register) and Port B (output).
*/

// This would be in a header file
#define CS PB5
#define CS_PORT PORTB
#define CS_DDR DDRB




// Setup: Just do this once

// Initialize SPI
init_spi();

// Initialize CS pin as an output pin
init_cs(CS, &CS_DDR);   // pin, DDR

// Set CS pin high (disable SPI device by default)
set_cs_high(CS, &CS_PORT);




// Transmission: do this every time you want to transmit

// Start transmission: set CS pin low (enable SPI device)
set_cs_low(CS, &CS_PORT);  // pin, port

// Send and/or receive data: call send_spi() for each byte
uint8_t received1 = send_spi(0xA4); // if you want to both send and receive
uint8_t received2 = send_spi(0x00); // if you just want to receive (send 0)
send_spi(0xA4);                     // if you just want to send (ignore received)

// End transmission: set CS pin high (disable SPI device)
set_cs_high(CS, &CS_PORT);

Bu, spi kütüphanesi 'nin mikro denetleyicide doğru çalıştığından emin olmak için başka bir tam SPI programıdır.

Tekrar tekrar gönderme kodu 10101010.

Spi Kütüphanesi için Saat Ayarları (Gelişmiş)

SPI, saat polaritesi (CPOL) ve faz (CPHA) için ayarlara sahiptir. Genellikle varsayılan ayarlar çalışır ve bunun için endişelenmenize gerek yoktur, ancak bazen bu ayarların değiştirilmesi gereken bir cihaz olabilir. Bir cihazın CPOL ve CPHA ayarlarının ne olması gerektiğini veri sayfasındaki SPI zamanlama şemalarına göre ayarlayabilirsiniz. Burada tanıtılan iki saat ayarı Clock Polarity ve Clock Phase'dır. Clock Phase (Saat Aşaması), verilerin veri saat döngüsünün yükselen veya düşen kenarına girip girmeyeceğini belirler. Saat Polaritesi, saatin HIGH veya LOW olduğunda boşta olup olmadığını belirler.