Yayın2 dk okuma
SPI Nedir
SPI (Serial Peripheral Interface), mikrodenetleyiciler ve diğer cihazlar arasında hızlı ve senkron bir veri iletişim protokolüdür. Motorola tarafından geliştirilmiş olan bu protokol, çoğu modern elektronik cihazda kullanılır. SPI, sensörler, hafıza birimleri, ekran kontrolörleri ve çeşitli periferal cihazlarla haberleşmek için yaygın bir şekilde kullanılır.
SPI’nın Temel Yapısı
SPI, master-slave yapısında çalışır. Bir SPI haberleşme hattında bir master (genellikle bir mikrodenetleyici) ve bir veya daha fazla slave cihaz bulunabilir. SPI, dört ana hat kullanır:
- MOSI (Master Out Slave In): Master cihazdan slave cihaza veri iletmek için kullanılır.
- MISO (Master In Slave Out): Slave cihazdan master cihaza veri iletmek için kullanılır.
- SCK (Serial Clock): Master cihazın, haberleşme için saat sinyalini sağladığı hattan sorumludur.
- SS (Slave Select): Master cihazın belirli bir slave cihazı etkinleştirmek için kullandığı hattı temsil eder.
SPI’nın Avantajları
- Hızlı Veri Transferi: SPI, diğer senkron protokollere göre daha hızlıdır.
- Basit Donanım Yapısı: Hattaki cihaz sayısı ve yapısı basittir.
- Tam Dupleks Haberleşme: Aynı anda veri gönderip alma yeteneğine sahiptir.
SPI’nın Dezavantajları
- Slave Seçim Karmaşıklığı: Birden fazla slave cihaz kullanılıyorsa, çok sayıda SS hattı gerekebilir.
- Uzun Mesafeler için Uygun Değil: SPI, uzun kablo mesafelerinde özellikle parazitlere hassas olabilir.
STM32’de SPI Kullanımı
STM32 mikrodenetleyicilerinde SPI modülü, dahili donanım desteği sayesinde kolayca kullanılabilir. İşte STM32 ile SPI haberleşmesi kurmanın temel adımları:
- Donanım Bağlantısı: SPI’ya bağlanacak cihazların MOSI, MISO, SCK ve SS pinleri STM32’nin ilgili pinlerine bağlanır.
2. SPI’yı Konfigüre Etmek: STM32 CubeMX kullanarak SPI modülünü etkinleştirin ve hız, çalışma modu gibi parametreleri ayarlayın.
- Kodlama: STM32 HAL kütüphanesi kullanarak SPI haberleşmesini başlatın.
SPI_HandleTypeDef hspi1;
// SPI1 Initialization Function
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi1);
}
4. Veri Gönderimi:
uint8_t dataToSend = 0x55;
HAL_SPI_Transmit(&hspi1, &dataToSend, 1, HAL_MAX_DELAY);
5. Veri Alımı:
uint8_t receivedData;
HAL_SPI_Receive(&hspi1, &receivedData, 1, HAL_MAX_DELAY);
ATmega’da SPI Kullanımı
ATmega mikrodenetleyicilerinde SPI, donanımsal olarak desteklenir ve kolayca konfigüre edilebilir:
- Donanım Bağlantısı: MOSI, MISO, SCK ve SS pinleri uygun şekilde bağlanır.
- SPI’yı Konfigüre Etmek: SPI kontrol registerı (SPCR) ayarlanır.
Master Modu Ayarı:
#include <avr/io.h>
void SPI_MasterInit(void)
{
// MOSI, SCK ve SS çıkış olarak ayarlanır
DDRB |= (1<<PB3) | (1<<PB5) | (1<<PB2);
// MISO giriş olarak ayarlanır
DDRB &= ~(1<<PB4);
// SPI etkinleştirilir, Master modu, Fclk/16
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
// Veri SPI Data Register’a yazılır
SPDR = cData;
// Veri transferi tamamlanana kadar beklenir
while(!(SPSR & (1<<SPIF)));
}
3. Veri Gönderimi ve Alımı:
char SPI_MasterReceive(void)
{
SPI_MasterTransmit(0xFF); // Dummy byte gönderilir
while(!(SPSR & (1<<SPIF)));
return SPDR; // Alınan veri döndürülür
}
Sonuç
SPI, hızlı ve etkili bir haberleşme protokolü olarak modern elektronik tasarımlarda vazgeçilmezdir. STM32 ve ATmega gibi mikrodenetleyicilerde SPI kullanımı, sağladığı basitlik ve hız sayesinde geliştiricilere çok yönlü çözümler sunar.