- SPI em STM32F103C8
- Pinos SPI no Arduino
- Componentes necessários
- Diagrama de circuito e conexões para STM32 SPI Tutorial
- STM32 SPI Programming
- Explicação de programação Master STM32 SPI
- Explicação da programação SPI do Slave Arduino
Em nossos tutoriais anteriores, aprendemos sobre a comunicação SPI e I2C entre duas placas Arduino. Neste tutorial, substituiremos uma placa Arduino pela placa Blue Pill que é STM32F103C8 e nos comunicaremos com a placa Arduino usando o barramento SPI. Neste exemplo STM32 SPI, usaremos Arduino UNO como escravo e STM32F103C8 como mestre com dois monitores LCD 16X2 conectados um ao outro separadamente. Dois potenciômetros também são conectados com STM32 (PA0) e Arduino (A0) para determinar os valores de envio (0 a 255) do mestre para o escravo e do escravo para o mestre variando o potenciômetro.
SPI em STM32F103C8
Comparando o barramento SPI no Arduino e a placa STM32F103C8 Blue Pill, o STM32 possui 2 barramentos SPI, enquanto o Arduino Uno possui um barramento SPI. Arduino Uno tem microcontrolador ATMEGA328 nele, e STM32F103C8 tem ARM Cortex-M3 que o torna mais rápido do que a placa Arudino.
Para saber mais sobre a comunicação SPI, consulte nossos artigos anteriores
- Como usar SPI no Arduino: comunicação entre duas placas Arduino
- Comunicação SPI com microcontrolador PIC PIC16F877A
- Comunicação SPI via Bit Banging
- Detector de vazamento de tanque de água quente Raspberry Pi usando módulos SPI
- ESP32 Real Time Clock using DS3231 Module
Pinos STM32 SPI STM32F103C8
SPI Line1 | Pino em STM32F103C8 |
MOSI1 | PA7 ou PB5 |
MISO1 | PA6 ou PB4 |
SCK1 | PA5 ou PB3 |
SS1 | PA4 ou PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pinos SPI no Arduino
Linha SPI |
Pin no Arduino |
MOSI |
11 ou ICSP-4 |
MISSÔ |
12 ou ICSP-1 |
SCK |
13 ou ICSP-3 |
SS |
10 |
Componentes necessários
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potenciômetro de 10k - 4
- Tábua de pão
- Fios de conexão
Diagrama de circuito e conexões para STM32 SPI Tutorial
A tabela abaixo mostra os pinos conectados para comunicação STM32 SPI com o Arduino.
PIN SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISSÔ |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
A tabela abaixo mostra os pinos conectados para Dois LCD (16x2) com STM32F103C8 e Arduino separadamente.
Pino de LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Para o PIN central do potenciômetro para contraste do LCD |
Para o PIN central do potenciômetro para contraste do LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
UMA |
+ 5V |
+ 5V |
K |
GND |
GND |
Importante:
- Não se esqueça de conectar o Arduino GND e o STM32F103C8 GND juntos.
STM32 SPI Programming
A programação é semelhante ao código do Arduino. O mesmo
Neste exemplo STM32 SPI, usaremos Arduino UNO como escravo e STM32F103C8 como mestre com dois monitores LCD 16X2 conectados um ao outro separadamente. Dois potenciômetros também são conectados com STM32 (PA0) e Arduino (A0) para determinar os valores de envio (0 a 255) do mestre para o escravo e do escravo para o mestre variando o potenciômetro.
A entrada analógica é obtida no pino PA0 do STM32F10C8 (0 a 3,3 V) girando o potenciômetro. Em seguida, esse valor de entrada é convertido em valor analógico para digital (0 a 4096) e esse valor digital é posteriormente mapeado para (0 a 255), pois podemos enviar apenas dados de 8 bits (bytes) por meio da comunicação SPI de uma vez.
Da mesma forma, no lado escravo, pegamos o valor da entrada analógica no pino A0 do Arduino de (0 a 5 V) usando o potenciômetro. E novamente este valor de entrada é convertido em valor analógico para digital (0 a 1023) e este valor digital é posteriormente mapeado para (0 a 255)
Este tutorial tem dois programas, um para o STM32 mestre e outro para o Arduino escravo. Programas completos para ambos os lados são fornecidos no final deste projeto com um vídeo de demonstração.
Explicação de programação Master STM32 SPI
1. Em primeiro lugar, precisamos incluir a biblioteca SPI para usar as funções de comunicação SPI e a biblioteca LCD para usar as funções LCD. Defina também os pinos de LCD para LCD 16x2. Saiba mais sobre a interface do LCD com o STM32 aqui.
#incluir
2. Na configuração vazia ()
- Inicie a comunicação serial na taxa Baud 9600.
Serial.begin (9600);
- Em seguida, comece a comunicação SPI
SPI.begin ();
- Em seguida, defina o divisor de relógio para comunicação SPI. Eu configurei o divisor 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Em seguida, defina o pino SS para ALTO, pois não iniciamos nenhuma transferência para o arduino escravo.
digitalWrite (SS, HIGH);
3. Em loop vazio ()
- Antes de enviar qualquer valor para o escravo, precisamos BAIXAR o valor de seleção do escravo para iniciar a transferência do mestre para o escravo.
digitalWrite (SS, LOW);
- Em seguida, leia o valor analógico do POT STM32F10C8 mestre conectado ao pino PA0.
pot int = analogRead (PA0);
Em seguida, converta esse valor em termos de um byte (0 a 255).
byte MasterSend = map (pot, 0,4096,0,255);
- Aí vem a etapa importante, na instrução a seguir enviamos o valor convertido do POT armazenado na variável Mastersend para o Arduino escravo, e também recebemos o valor do Arduino escravo e o armazenamos na variável mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Em seguida, exiba os valores recebidos do arduino escravo com um atraso de 500 microssegundos e, em seguida, receba e exiba continuamente os valores.
Serial.println ("Slave Arduino para Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive delay (500); digitalWrite (SS, HIGH);
Nota: Usamos serial.println () para visualizar o resultado no Serial Motor do Arduino IDE.
Explicação da programação SPI do Slave Arduino
1. Da mesma forma que o mestre, em primeiro lugar, precisamos incluir a biblioteca SPI para usar as funções de comunicação I2C e a biblioteca LCD para usar as funções LCD. Defina também os pinos de LCD para LCD 16x2.
#incluir
2. Na configuração vazia ()
- Iniciamos a comunicação serial na taxa Baud 9600.
Serial.begin (9600);
- A instrução abaixo define MISO como OUTPUT (tem que enviar dados para Master IN). Assim, os dados são enviados via MISO do Slave Arduino.
pinMode (MISO, OUTPUT);
- Agora ligue o SPI no modo escravo usando o registro de controle SPI
SPCR - = _BV (SPE);
- Em seguida, ligue a interrupção para comunicação SPI. Se um dado for recebido do mestre, a rotina de serviço de interrupção é chamada e o valor recebido é obtido do SPDR (Registro de dados SPI)
SPI.attachInterrupt ();
- O valor do master é retirado do SPDR e armazenado na variável Slavereceived . Isso ocorre na seguinte função de rotina de interrupção.
ISR (SPI_STC_vect) {Slavereceived = SPDR; recebido = verdadeiro; }
3. Próximo no loop vazio ()
- Leia o valor analógico do Slave Arduino POT conectado ao pino A0.
pote int = AnalRead (A0);
- Converta esse valor em termos de um byte de 0 a 255.
Slavesend = mapa (pote, 0,1023,0,255);
- O próximo passo importante é enviar o valor convertido para o Master STM32F10C8, então coloque o valor no registrador SPDR. O registro SPDR é usado para enviar e receber valores.
SPDR = envio escravo;
- Em seguida, exiba o valor recebido ( SlaveReceive ) do Mestre STM32F103C8 no LCD com um atraso de 500 microssegundos e, em seguida, receba e exiba continuamente esse valor.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 para Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); atraso (500);
Ao girar o potenciômetro de um lado, você pode ver os valores variando de LCD em um outro lado:
Portanto, é assim que a comunicação SPI ocorre no STM32. Agora você pode conectar qualquer sensor SPI com a placa STM32.
A codificação completa para Master STM32 e Slave Arduino é fornecida abaixo com um vídeo de demonstração