Hôm nay mình chia sẻ Lập trình Test hoạt động SPI Arduino STM32
- SCLK -> Đồng hồ nối tiếp
- MOSI -> Đầu vào Slave đầu ra chính (Dữ liệu từ Master đến Slave)
- MISO -> Master Input Slave Output (Dữ liệu từ Slave đến Master)
- SS -> Chọn Thiết bị
Tín hiệu Chọn Slave được sử dụng để kích hoạt một nô lệ cụ thể bằng cách làm cho tín hiệu SS ở mức THẤP. Trong cấu hình nhiều phụ kiện, mỗi thiết bị phụ có Tín hiệu SS riêng từ Chính và tại bất kỳ thời điểm nào, chỉ một thiết bị phụ có thể hoạt động.
Phần cứng bên trong của SPI Communication rất đơn giản. Nó bao gồm một thanh ghi dịch chuyển và một chốt dữ liệu. Một điểm quan trọng cần nhớ là thiết bị Chính chịu trách nhiệm tạo ra Tín hiệu Đồng hồ trên Đường SCLK.
SPI trên STM32
SPI in ArduinoSPI1
SS1 PA4 PA15
SCLK1
PA5 PB3
MISO1
PA6 PB4
MOSI1 PA7 PB5
SPI2
SS2 PB12 – SCLK2
PB13 –
MISO2
PB14 –
MOSI2 PB15
Sơ đồ kết nối SPI với ArduinoSPI Signal
Arduino Pin
SS
Digital IO 10
MOSI
Digital IO 11
MISO
Digital IO 12
SCK
Digital IO 13
Sơ đồ nối như sau
ở đây STM32 là master ,Arduino Là salveSPI Pin
STM32 Blue Pill Arduino UNO
SS
PA4 Digital IO 10
SCLK
PA5 Digital IO 13
MISO
PA6 Digital IO 12
MOSI
PA7 Digital IO 11
- CODE STM32
#include<SPI.h>
#define SS PA4
#define ledPin PC13
#define buttonPin PA0void setup (void)
{
pinMode(SS, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16);
digitalWrite(SS, HIGH);
digitalWrite(ledPin, LOW);
}void loop(void)
{
int masterSend, masterReceive;masterSend = digitalRead(buttonPin);
digitalWrite(SS, LOW);
masterReceive = SPI.transfer(masterSend);
delay(500);
digitalWrite(SS, HIGH);if (masterReceive == HIGH)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);}
}Code Arduino AVR
#include<SPI.h>
const int ledPin = 13;
const int buttonPin = 6;volatile boolean received;
volatile int slaveReceive, slaveSend;void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(MISO, OUTPUT);digitalWrite(ledPin, LOW);
/* Turn on SPI in Slave Mode */
SPCR |= _BV(SPE);
received = false;
/* Interupt ON is set for SPI Commnunication */
SPI.attachInterrupt();
}/* SPI ISR */
ISR (SPI_STC_vect)
{
/* Value received from master STM32F103C8T6 is stored in variable slaveReceive */
slaveReceive = SPDR;
received = true;
}void loop()
{
slaveSend = digitalRead(buttonPin);
/* Send the slaveSend value to master STM32F103C8T6 via SPDR */
SPDR = slaveSend;if(received == true)
{
if(slaveReceive == HIGH)
{
digitalWrite(ledPin, HIGH);
}else
{
digitalWrite(ledPin, LOW);
}
}
}Chú ý Với Board Black STM32 SPI mặc định Cổng PB3,PB4,PB5 ,PA15