- SPI trong STM32F103C8
- SPI Pins trong Arduino
- Thành phần bắt buộc
- Sơ đồ mạch và kết nối cho STM32 SPI Hướng dẫn
- Lập trình SPI STM32
- Giải thích lập trình SPI Master STM32
- Giải thích lập trình Slave Arduino SPI
Trong các bài hướng dẫn trước đây, chúng ta đã tìm hiểu về giao tiếp SPI và I2C giữa hai bo mạch Arduino. Trong hướng dẫn này, chúng tôi sẽ thay thế một bảng Arduino bằng bảng Blue Pill là STM32F103C8 và sẽ giao tiếp với bảng Arduino bằng cách sử dụng bus SPI. Trong Ví dụ STM32 SPI này, chúng ta sẽ sử dụng Arduino UNO làm Slave và STM32F103C8 làm Master với Hai màn hình LCD 16X2 được gắn vào nhau riêng biệt. Hai chiết áp cũng được kết nối với STM32 (PA0) và Arduino (A0) để xác định các giá trị gửi (0 đến 255) từ chính đến phụ và phụ đến chính bằng cách thay đổi chiết áp.
SPI trong STM32F103C8
So sánh bus SPI trong board Arduino & STM32F103C8 Blue Pill, STM32 có 2 bus SPI trong khi Arduino Uno có một bus SPI. Arduino Uno có vi điều khiển ATMEGA328 và STM32F103C8 có ARM Cortex-M3 làm cho nó nhanh hơn Arudino Board.
Để tìm hiểu thêm về giao tiếp SPI, hãy tham khảo các bài viết trước của chúng tôi
- Cách sử dụng SPI trong Arduino: Giao tiếp giữa hai Bo mạch Arduino
- Giao tiếp SPI với Vi điều khiển PIC PIC16F877A
- Giao tiếp SPI qua Bit Banging
- Máy dò rò rỉ bồn nước nóng Raspberry Pi sử dụng Mô-đun SPI
- Đồng hồ thời gian thực ESP32 sử dụng Mô-đun DS3231
STM32 SPI Pins STM32F103C8
Dòng SPI1 | Ghim vào STM32F103C8 |
MOSI1 | PA7 hoặc PB5 |
MISO1 | PA6 hoặc PB4 |
SCK1 | PA5 hoặc PB3 |
SS1 | PA4 hoặc PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI Pins trong Arduino
Dòng SPI |
Ghim trong Arduino |
MOSI |
11 hoặc ICSP-4 |
MISO |
12 hoặc ICSP-1 |
SCK |
13 hoặc ICSP-3 |
SS |
10 |
Thành phần bắt buộc
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Chiết áp 10k - 4
- Breadboard
- Kết nối dây
Sơ đồ mạch và kết nối cho STM32 SPI Hướng dẫn
Bảng bên dưới cho thấy các Chân được kết nối cho giao tiếp STM32 SPI với Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Bảng dưới đây cho thấy các chân kết nối cho Hai màn hình LCD (16x2) với STM32F103C8 và Arduino riêng biệt.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Đến mã PIN của trung tâm chiết áp cho độ tương phản LCD |
Đến mã PIN của trung tâm chiết áp cho độ tương phản LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
K |
GND |
GND |
Quan trọng:
- Đừng quên kết nối Arduino GND và STM32F103C8 GND với nhau.
Lập trình SPI STM32
Lập trình tương tự như mã Arduino. Giống nhau
Trong Ví dụ STM32 SPI này, chúng ta sẽ sử dụng Arduino UNO làm Slave và STM32F103C8 làm Master với Hai màn hình LCD 16X2 được gắn vào nhau riêng biệt. Hai chiết áp cũng được kết nối với STM32 (PA0) và Arduino (A0) để xác định các giá trị gửi (0 đến 255) từ chính đến phụ và phụ đến chính bằng cách thay đổi chiết áp.
Đầu vào tương tự được lấy tại STM32F10C8 chân PA0 (0 đến 3,3V) bằng cách xoay chiết áp. Sau đó, giá trị đầu vào này được chuyển đổi thành giá trị Analog thành Digital (0 đến 4096) và giá trị kỹ thuật số này tiếp tục được ánh xạ tới (0 đến 255) vì chúng ta chỉ có thể gửi dữ liệu 8 bit (byte) thông qua giao tiếp SPI cùng một lúc.
Tương tự ở phía Slave, chúng tôi lấy giá trị đầu vào tương tự tại chân A0 của Arduino từ (0 đến 5V) bằng cách sử dụng chiết áp. Và một lần nữa giá trị đầu vào này được chuyển đổi thành giá trị Tương tự thành Giá trị kỹ thuật số (0 đến 1023) và giá trị kỹ thuật số này được ánh xạ thêm thành (0 đến 255)
Hướng dẫn này có hai chương trình một cho STM32 chính và một cho Arduino nô lệ. Các chương trình hoàn chỉnh cho cả hai bên được đưa ra ở cuối dự án này với một Video trình diễn.
Giải thích lập trình SPI Master STM32
1. Trước hết chúng ta cần bao gồm thư viện SPI để sử dụng các chức năng giao tiếp SPI và thư viện LCD để sử dụng các chức năng LCD. Cũng xác định các chân LCD cho LCD 16x2. Tìm hiểu thêm về giao tiếp LCD với STM32 tại đây.
#include
2. Trong thiết lập void ()
- Bắt đầu giao tiếp nối tiếp ở tốc độ Baud 9600.
Serial.begin (9600);
- Tiếp theo bắt đầu giao tiếp SPI
SPI.begin ();
- Sau đó đặt Bộ chia đồng hồ cho giao tiếp SPI. Tôi đã đặt bộ chia 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Tiếp theo đặt chân SS CAO vì chúng tôi không bắt đầu chuyển sang arduino nô lệ.
digitalWrite (SS, HIGH);
3. Trong vòng lặp void ()
- Trước khi gửi bất kỳ giá trị nào đến slave, chúng ta cần THẤP giá trị chọn của slave để bắt đầu chuyển sang slave từ master.
digitalWrite (SS, LOW);
- Tiếp theo đọc giá trị analog từ POT STM32F10C8 chính được gắn vào chân PA0.
int pot = analogRead (PA0);
Sau đó, chuyển đổi giá trị này dưới dạng một byte (0 thành 255).
byte MasterSend = map (pot, 0,4096,0,255);
- Đây là bước quan trọng, trong câu lệnh sau, chúng tôi gửi giá trị POT đã chuyển đổi được lưu trữ trong biến Mastersend tới Arduino nô lệ, đồng thời nhận giá trị từ Arduino nô lệ và lưu trữ giá trị đó trong biến mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Tiếp theo, hiển thị các giá trị nhận được từ arduino nô lệ với độ trễ là 500 micro giây và sau đó liên tục nhận và hiển thị các giá trị.
Serial.println ("Slave Arduino sang Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive trễ) (500); digitalWrite (SS, HIGH);
Lưu ý: Chúng tôi sử dụng serial.println () để xem kết quả trong Động cơ nối tiếp của Arduino IDE.
Giải thích lập trình Slave Arduino SPI
1. Tương tự như master, trước hết chúng ta cần bao gồm thư viện SPI để sử dụng các chức năng giao tiếp I2C và thư viện LCD để sử dụng các chức năng LCD. Cũng xác định các chân LCD cho LCD 16x2.
#include
2. Trong thiết lập void ()
- Chúng tôi bắt đầu giao tiếp nối tiếp với tốc độ truyền 9600.
Serial.begin (9600);
- Câu lệnh dưới đây đặt MISO là OUTPUT (Phải gửi dữ liệu đến Master IN). Vì vậy, dữ liệu được gửi qua MISO của Slave Arduino.
pinMode (MISO, OUTPUT);
- Bây giờ hãy bật SPI ở Chế độ nô lệ bằng cách sử dụng Đăng ký điều khiển SPI
SPCR - = _BV (SPE);
- Sau đó, BẬT ngắt cho giao tiếp SPI. Nếu một dữ liệu được nhận từ chính, Quy trình Dịch vụ Ngắt được gọi và giá trị nhận được sẽ được lấy từ SPDR (Thanh ghi dữ liệu SPI)
SPI.attachInterrupt ();
- Giá trị từ cái chính được lấy từ SPDR và được lưu trữ trong biến Slaverenition . Điều này diễn ra trong chức năng Quy trình ngắt sau.
ISR (SPI_STC_vect) {Nô lệ = SPDR; nhận được = true; }
3. Tiếp theo trong vòng lặp void ()
- Đọc giá trị tương tự từ Slave Arduino POT được gắn vào chân A0.
int pot = analogRead (A0);
- Chuyển đổi giá trị đó theo một byte dưới dạng 0 thành 255.
Slavesend = bản đồ (pot, 0,1023,0,255);
- Bước quan trọng tiếp theo là gửi giá trị đã chuyển đổi đến Master STM32F10C8, vì vậy hãy đặt giá trị vào thanh ghi SPDR. Thanh ghi SPDR được sử dụng để gửi và nhận các giá trị.
SPDR = Slavesend;
- Sau đó hiển thị giá trị nhận được ( SlaveReceive ) từ Master STM32F103C8 trên LCD với độ trễ 500 micro giây rồi liên tục nhận và hiển thị các giá trị đó.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 đến Slave Arduino"); Serial.println (SlaveReceive); lcd.print (SlaveReceive); chậm trễ (500);
Bằng cách xoay Potentiometer ở một bên, bạn có thể thấy các giá trị khác nhau trên màn hình LCD ở một bên:
Vì vậy, đây là cách giao tiếp SPI diễn ra trong STM32. Bây giờ bạn có thể giao tiếp bất kỳ cảm biến SPI nào với bảng STM32.
Mã hóa hoàn chỉnh cho Master STM32 và Slave Arduino được cung cấp bên dưới với một video trình diễn