- STM32F103C8'de SPI
- Arduino'daki SPI Pinleri
- Gerekli Bileşenler
- STM32 SPI Eğitimi için Devre Şeması ve Bağlantılar
- STM32 SPI Programlama
- Master STM32 SPI Programlama Açıklaması
- Slave Arduino SPI Programlama Açıklaması
Önceki eğitimlerimizde, iki Arduino kartı arasındaki SPI ve I2C iletişimini öğrendik. Bu eğitimde bir Arduino kartını STM32F103C8 olan Blue Pill kartı ile değiştireceğiz ve SPI veriyolu kullanarak Arduino kartı ile iletişim kuracağız. Bu STM32 SPI Örneğinde, Arduino UNO'yu Slave olarak ve STM32F103C8'i Master olarak, birbirine ayrı ayrı bağlanmış İki 16X2 LCD ekran ile kullanacağız. Potansiyometreyi değiştirerek master'dan slave'e ve slave'den master'a gönderme değerlerini (0-255) belirlemek için iki Potansiyometre de STM32 (PA0) ve Arduino (A0) ile bağlanır.
STM32F103C8'de SPI
Arduino ve STM32F103C8 Blue Pill kartındaki SPI veriyolunu karşılaştıran STM32'de 2 SPI veri yolu varken Arduino Uno'da bir SPI veri yolu bulunur. Arduino Uno'nun içinde ATMEGA328 mikrodenetleyicisi vardır ve STM32F103C8, Arudino Board'dan daha hızlı olmasını sağlayan ARM Cortex-M3'e sahiptir.
SPI iletişimi hakkında daha fazla bilgi edinmek için önceki makalelerimize bakın
- Arduino'da SPI nasıl kullanılır: İki Arduino Kartı arasında iletişim
- PIC Mikrodenetleyici PIC16F877A ile SPI İletişimi
- Bit Banging aracılığıyla SPI iletişimi
- Raspberry Pi Sıcak Su Deposu Sızıntı Dedektörü SPI Modülleri Kullanarak
- DS3231 Modülünü kullanan ESP32 Gerçek Zamanlı Saat
STM32 SPI Pinleri STM32F103C8
SPI Satır1 | STM32F103C8 pimi |
MOSI1 | PA7 veya PB5 |
MISO1 | PA6 veya PB4 |
SCK1 | PA5 veya PB3 |
SS1 | PA4 veya PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Arduino'daki SPI Pinleri
SPI Hattı |
Arduino'daki pin |
MOSI |
11 veya ICSP-4 |
MİSO |
12 veya ICSP-1 |
SCK |
13 veya ICSP-3 |
SS |
10 |
Gerekli Bileşenler
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k Potansiyometre - 4
- Breadboard
- Kabloların Bağlanması
STM32 SPI Eğitimi için Devre Şeması ve Bağlantılar
Aşağıdaki Tablo, Arduino ile STM32 SPI iletişimi için Bağlı Pinleri göstermektedir.
SPI Pimi |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MİSO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Aşağıdaki tablo , STM32F103C8 ve Arduino ile İki LCD (16x2) için bağlanan pimleri ayrı ayrı göstermektedir.
LCD pimi |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
LCD kontrastı için Potansiyometre Merkez PIN'ine |
LCD kontrastı için Potansiyometre Merkez PIN'ine |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
Bir |
+ 5V |
+ 5V |
K |
GND |
GND |
Önemli:
- Arduino GND ve STM32F103C8 GND'yi birbirine bağlamayı unutmayın.
STM32 SPI Programlama
Programlama, Arduino koduna benzer. Aynısı
Bu STM32 SPI Örneğinde, Arduino UNO'yu Slave olarak ve STM32F103C8'i Master olarak, birbirine ayrı ayrı bağlanmış İki 16X2 LCD ekran ile kullanacağız. Potansiyometreyi değiştirerek master'dan slave'e ve slave'den master'a gönderme değerlerini (0-255) belirlemek için iki Potansiyometre de STM32 (PA0) ve Arduino (A0) ile bağlanır.
Analog giriş, potansiyometre döndürülerek STM32F10C8 pin PA0'da (0 - 3.3V) alınır. Daha sonra bu giriş değeri Analogdan Dijital değere dönüştürülür (0 ila 4096) ve bu dijital değer ayrıca (0 ila 255) eşleştirilir, çünkü SPI iletişimi aracılığıyla aynı anda yalnızca 8 bit (bayt) veri gönderebiliriz.
Benzer şekilde Slave tarafında potansiyometre kullanarak Arduino pin A0'da analog giriş değerini (0'dan 5V'a) alıyoruz. Ve yine bu giriş değeri Analogdan Dijital değere (0 ila 1023) dönüştürülür ve bu dijital değer ayrıca (0 ila 255) ile eşlenir.
Bu eğitimde biri ana STM32 için diğeri bağımlı Arduino için olmak üzere iki program vardır. Her iki taraf için eksiksiz programlar bu projenin sonunda bir tanıtım videosu ile verilmiştir.
Master STM32 SPI Programlama Açıklaması
1. Öncelikle, SPI iletişim işlevlerini kullanmak için SPI kitaplığını ve LCD işlevlerini kullanmak için LCD kitaplığını eklememiz gerekir. Ayrıca 16x2 LCD için LCD pinleri tanımlayın. LCD ile STM32 arasında arayüz oluşturma hakkında daha fazla bilgiyi burada bulabilirsiniz.
#Dahil etmek
2. Geçersiz kurulumda ()
- Baud Rate 9600'de Seri İletişimi Başlatın.
Serial.begin (9600);
- Ardından SPI iletişimine başlayın
SPI.begin ();
- Ardından SPI iletişimi için Saat bölücüyü ayarlayın. Bölücü 16'yı ayarladım.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Sonra, slave arduino'ya herhangi bir transfer başlatmadığımız için SS pinini HIGH olarak ayarlayın.
digitalWrite (SS, YÜKSEK);
3. Boş döngüde ()
- Slave'e herhangi bir değer göndermeden önce, master'dan slave'e transfer etmeye başlamak için slave seçim değerini DÜŞÜKLEMEK gerekir.
digitalWrite (SS, DÜŞÜK);
- Daha sonra PA0 pinine takılı ana STM32F10C8 POT'un analog değerini okuyun.
int pot = analogRead (PA0);
Sonra bu değeri bir bayt cinsinden (0'dan 255'e) dönüştürün.
bayt MasterSend = harita (pot, 0,4096,0,255);
- İşte önemli adım geliyor, aşağıdaki ifadede, Mastersend değişkeninde depolanan dönüştürülmüş POT değerini slave Arduino'ya gönderiyoruz ve ayrıca slave Arduino'dan değer alıp mastereceive değişkeninde saklıyoruz .
Mastereceive = SPI.transfer (MasterSend);
- Daha sonra bağımlı arduino'dan alınan değerleri 500 mikrosaniye gecikmeyle görüntüleyin ve ardından değerleri sürekli olarak alıp görüntüler.
Serial.println ("Arduino'dan Master STM32'ye"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive gecikmesi (500); digitalWrite (SS, YÜKSEK);
Not: Sonucu Arduino IDE'nin Seri Motorunda görüntülemek için serial.println () kullanıyoruz.
Slave Arduino SPI Programlama Açıklaması
1. Master ile aynı, her şeyden önce I2C iletişim işlevlerini kullanmak için SPI kitaplığını ve LCD işlevlerini kullanmak için LCD kitaplığını eklememiz gerekir. Ayrıca 16x2 LCD için LCD pinleri tanımlayın.
#Dahil etmek
2. Geçersiz kurulumda ()
- Baud Rate 9600'de Seri İletişimi Başlatıyoruz.
Serial.begin (9600);
- Aşağıdaki ifade, MISO'yu OUTPUT olarak ayarlar (Master IN'e veri göndermek zorundasınız) Bu nedenle veri, Slave Arduino'nun MISO'su aracılığıyla gönderilir.
pinMode (MISO, OUTPUT);
- Şimdi SPI Kontrol Kaydını kullanarak Bağımlı Modda SPI'yı açın
SPCR - = _BV (SPE);
- Ardından SPI iletişimi için kesmeyi AÇIN. Master'dan bir veri alınırsa, Interrupt Service Routine çağrılır ve alınan değer SPDR'den (SPI data Register) alınır.
SPI.attachInterrupt ();
- Master'dan gelen değer SPDR'den alınır ve Slavereceived değişkeninde saklanır. Bu, aşağıdaki Interrupt Routine fonksiyonunda gerçekleşir.
ISR (SPI_STC_vect) {Slavereceived = SPDR; alındı = doğru; }
3. Sonraki boşluk döngüsünde ()
- A0 pinine takılı Slave Arduino POT'dan analog değeri okuyun.
int pot = analogRead (A0);
- Bu değeri bir bayt cinsinden 0'dan 255'e çevirin.
Slavesend = harita (pot, 0,1023,0,255);
- Bir sonraki önemli adım, dönüştürülen değeri Ana STM32F10C8'e göndermektir, bu nedenle değeri SPDR yazmacına yerleştirin. SPDR kaydı, değerleri göndermek ve almak için kullanılır.
SPDR = Slavesend;
- Ardından 500 mikrosaniye gecikmeyle LCD'de Master STM32F103C8'den alınan değeri ( SlaveReceive ) görüntüleyin ve ardından bu değeri sürekli olarak alıp görüntüleyin.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32'den Slave Arduino'ya"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); gecikme (500);
By bir tarafında Potansiyometre dönen, başka tarafta LCD'de değişen değerlerini görebilirsiniz:
Yani bu SPI iletişim STM32 gerçekleşir nasıl. Artık herhangi bir SPI sensörünü STM32 kartıyla arayüzleyebilirsiniz.
Master STM32 ve Slave Arduino için tam kodlama aşağıda bir tanıtım videosu ile verilmiştir.