Spi haberleşme protokolü, spi.h kütüphanesi ile ana cihaz olarak Arduino ve SPI cihazlarıyla iletişim kurmanızı sağlar. Bu kütüphaneyi kullanmak için kod:
#include <SPI.h>
Seri Çevresel Arabirim'e (SPI) Kısa Bir Giriş
Seri Çevresel Arabirim (SPI), mikro denetleyiciler tarafından kısa mesafelerde bir veya daha fazla çevresel aygıtla hızlı bir şekilde iletişim kurmak için kullanılan senkronize bir seri veri protokolüdür. İki mikrodenetleyici arasındaki iletişim için de kullanılabilir. Bir SPI bağlantısı ile her zaman çevresel aygıtları kontrol eden bir ana aygıt (genellikle bir mikro denetleyici) vardır. Genellikle tüm aygıtlar için ortak üç hat(pin) vardır:
- MISO (Master In Slave Out) - Master'a veri göndermek için Slave hattı,
- MOSI (Master Out Slave In) - Çevre birimlere veri göndermek için Master hattı,
- SCK (Seri Saat) - Master tarafından üretilen veri iletimini senkronize eden saat darbeleri.
ve her cihaza özel bir hat:
- SS (Slave Select) - Master'ın belirli cihazları etkinleştirmek ve devre dışı bırakmak için kullanabileceği her cihazdaki pimdir.
Bir cihazın Slave Select pini
low olduğunda, master ile iletişim kurar.
High olduğunda master'ı yok sayar. Bu, aynı
MISO,
MOSI ve
CLK hatlarını paylaşan birden fazla SPI cihazına sahip olmanızı sağlar. Yeni bir SPI cihazının kodunu yazmak için birkaç şeye dikkat etmeniz gerekir:
- Cihazınızın kullanabileceği maksimum SPI hızı nedir? Bu SPISettings'deki ilk parametre tarafından kontrol edilir. 15 MHz olarak derecelendirilmiş bir yonga kullanıyorsanız, 15000000 kullanın. Arduino, SPISettings ile kullandığınız sayıya eşit veya daha az olan en iyi hızı otomatik olarak kullanır.
- Veriler önce En Önemli Bit (MSB) veya En Az Önemli Bit (LSB) içinde mi kaydırılıyor? Bu, MSBFIRST veya LSBFIRST adlı ikinci SPISettings parametresi tarafından denetlenir. Çoğu SPI yongası MSB ilk veri sırasını kullanır.
- Veri saati High veya low olduğunda boşta mı? Numuneler saat darbelerinin yükselen veya düşen kenarında mı? Bu modlar SPISettings içindeki üçüncü parametre tarafından kontrol edilir.
SPI kütüphanesi standardı gevşektir ve her cihaz biraz farklı uygular. Bu, kodunuzu yazarken cihazın veri sayfasına özellikle dikkat etmeniz gerektiği anlamına gelir. Genel olarak, dört iletim şekli vardır. Bu modlar, verinin veri saat sinyalinin yükselen veya düşen kenarında (saat fazı olarak adlandırılır) kaydırılıp kaydırılmayacağını ve saatin
High veya
low olduğunda (saat polaritesi olarak adlandırılır) boşta olup olmadığını kontrol eder. Dört mod, polarite ve fazı bu tabloya göre birleştirir:
SPI parametrelerinizi aldıktan sonra, SPI bağlantı noktasını kullanmaya başlamak için
SPI.beginTransaction () öğesini kullanın. SPI bağlantı noktası tüm ayarlarınızla yapılandırılacaktır.
SPISettings'i kullanmanın en basit ve etkili yolu doğrudan
SPI.beginTransaction () içinde yer alır.
Örneğin:
SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)); Diğer kütüphaneler SPI'yı kullanırsa
SPI.endTransaction() kullanılana kadar erişmeler engellenir.
SPI.endTransaction() ile başlayan işlemler de ayarlar değişmez.
beginTransaction ayarları muhafaza eder.
SPI.endTransaction() Programınız SPI kullanan diğer kitaplıklarla birlikte kullanılıyorsa, en iyi uyumluluk için
SPI.endTransaction () öğesini çağırmadan önce arasındaki süreyi en aza indirmeye çalışmalısınız. Çoğu SPI cihazında, SPI.beginTransaction () kodundan sonra Slave pini
LOW yazar, veri aktarmak için istediğiniz sayıda
SPI.transfer () öğesini çağırır, ardından SS pinini
HIGH yazar ve son olarak
SPI.endTransaction () öğesini çağırırsınız. SPI hakkında daha fazla bilgi için
Wikipedia'nın SPI sayfasına bakın.
Bağlantılar
Aşağıdaki tablo, farklı Arduino kartlarında SPI hatlarının hangi pimleri kullandığını gösterir:
MISO, MOSI ve SCK'nın ICSP başlığında fiziksel konumunun bulunduğunu unutmayın; Bu pinler, her kart için uygun shield'ı çalıştırır.
AVR Tabanlı Kartlardaki Slave Select (SS) Pimi Hakkında Not:
Tüm AVR tabanlı kartlar, harici bir master tarafından kontrol edilen bir SS pinine sahiptir. Kütüphane yalnızca ana modu desteklediğinden, bu pim her zaman OUT olarak ayarlanmalıdır, aksi takdirde SPI arayüzü donanım tarafından otomatik olarak bağımlı moda geçerek kütüphaneyi çalışmaz hale getirir. |
Bununla birlikte, cihazlar için Slave Select (SS) olarak herhangi bir pimi kullanmak mümkündür. Örneğin,
Arduino Ethernet Shield, yerleşik SD karta SPI bağlantısını kontrol etmek için pin 4'ü ve Ethernet denetleyicisine bağlantıyı kontrol etmek için pin 10'u kullanır.
Örnekler
- Barometrik Basınç Sensörü : SPI protokolünü kullanarak bir sensörden hava basıncını ve sıcaklığı okuyun.
- Dijital Pot Kontrolü : SPI protokolünü kullanarak bir AD5206 dijital potansiyometreyi kontrol edin.
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 / SS) her 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:
- Sarı çizgi CS. Bunun nedeni, SPI aktarımı tamamlandıktan önce alçaltılması ve yükseltilmesidir.
- Yeşil çizgi SCK. Gönderilen her bayt için 8 kez salınım yapar.
- 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:
- SPI'yi başlat.
- CS'yi çıkış pini olarak başlat.
- CS'yi HIGH olarak ayarla.
Aktarma için:
- CS'yi LOW olarak ayarla.
- SPI mesajı gönder.
- 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.