SPI no STM32: Guia Completo de Configuração e Exemplo

Índice

Introdução🔗

A comunicação SPI (Serial Peripheral InterfaceInterface com memórias externas (Flash/EEPROM) via SPI no STM32Interface com memórias externas (Flash/EEPROM) via SPI no STM32Descubra como integrar memórias Flash SPI e EEPROM SPI com STM32, utilizando técnicas avançadas de otimização e depuração para sistemas embarcados.) é uma das interfaces mais eficientes para conectar microcontroladores STM32 a sensores, memórias e displays. Este artigo combina fundamentos teóricos, configurações práticas, exemplos de código e estratégias avançadas de debug, garantindo uma implementação robusta. Abordaremos desde a inicialização via STM32CubeMX até técnicas de otimizaçãoGerenciamento de energia e modos de baixo consumo no STM32Gerenciamento de energia e modos de baixo consumo no STM32Aprenda a reduzir o consumo de energia com os modos STM32, garantindo eficiência e prolongando a vida útil de baterias em sistemas embarcados. com DMA, sempre mantendo o foco em aplicações do mundo real.

Fundamentos do SPI🔗

O SPIUsando displays OLED com STM32 via I2C ou SPIUsando displays OLED com STM32 via I2C ou SPIDescubra como integrar e otimizar displays OLED com STM32 utilizando I2C e SPI, com dicas práticas para hardware, código e troubleshooting. é um protocolo síncrono e full-duplex que utiliza quatro linhas:

1. SCK (Serial Clock): Gerado pelo mestre para sincronização.

2. MOSI (Master Out Slave In): Dados enviados do mestre ao escravo.

3. MISO (Master In Slave Out): Dados recebidos pelo mestre.

4. NSS (Slave Select): Seleção do dispositivo escravo (ativo em nível baixo).

graph LR Master[STM32 Master] -->|SCK| Slave[Sensor SPI] Master -->|MOSI| Slave Slave -->|MISO| Master Master -->|NSS| Slave

Modos de Operação

Dois parâmetros críticos definem o comportamento do clock:

  • CPOL (Clock Polarity): Nível do clock em repouso (0 = baixo, 1 = alto).
  • CPHA (Clock Phase): Borda de amostragem de dados (0 = primeira borda, 1 = segunda borda).
ModoCPOLCPHA
000
101
210
311

Configuração do SPI no STM32🔗

Via STM32CubeMX

1. Habilite o periférico SPIUsando displays OLED com STM32 via I2C ou SPIUsando displays OLED com STM32 via I2C ou SPIDescubra como integrar e otimizar displays OLED com STM32 utilizando I2C e SPI, com dicas práticas para hardware, código e troubleshooting. (ex: SPI1).

2. Configure:

3. Ative as GPIOsImplementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! correspondentes (MOSI, MISO, SCK, NSS).

Cálculo do Baud RateUART no STM32: Comunicação serial básica para debug e integraçãoUART no STM32: Comunicação serial básica para debug e integraçãoDescubra os segredos da UART no STM32 com exemplos práticos, configuração via HAL, DMA e dicas de troubleshooting para comunicação serial eficiente.

$$ \text{Baud Rate} = \frac{\text{Clock do Periférico (Hz)}}{2 \times \text{Prescaler}} $$

Configuração de Hardware

Código com HAL Library

SPI_HandleTypeDef hspi1;
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_8;
  HAL_SPI_Init(&hspi1);
}

Exemplo Prático 1: Comunicação com Sensor MAX6675🔗

Conexão Física:

  • SCK: PA5
  • MOSI: PA7 (não usado, mas necessário para inicialização)
  • MISO: PA6
  • NSS: PA4 (controle manual via software)

Leitura de Temperatura:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // Ativa NSS
uint8_t tx_data[2] = {0};
uint8_t rx_data[2];
HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // Desativa NSS
uint16_t temp = (rx_data[0] << 8) | rx_data[1];
float temperatura = (temp >> 3) * 0.25;

Exemplo Prático 2: Transmissão Genérica com HAL🔗

void Transmitir_Dados(void) {
  uint8_t txData[3] = {0xAA, 0xBB, 0xCC};
  if (HAL_SPI_Transmit(&hspi1, txData, sizeof(txData), HAL_MAX_DELAY) != HAL_OK) {
    Error_Handler();
  }
}

DMA e Otimização de Desempenho🔗

O DMAConfigurando e usando o ADC no STM32Configurando e usando o ADC no STM32Este tutorial para STM32 ensina a configurar o ADC via registradores e HAL, explicando calibração, DMA, filtragem e resolução de problemas práticos. permite transferências grandes sem consumo de CPU:

HAL_SPI_TransmitReceive_DMA(&hspi1, tx_buffer, rx_buffer, 128);
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) {
  // Processa dados recebidos
}

Vantagens:

  • Ideal para streams contínuos (áudio, vídeo).
  • Reduz overhead em sistemas multitarefa.

Tratamento de Erros e Técnicas de Debug🔗

Problemas Comuns

1. Clock Não Gerado: Verifique prescalerUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. e modo mestre.

2. Dados Corrompidos:

  • Ajuste CPOL/CPHA conforme o periférico.
  • Use osciloscópio para analisar sinais.

3. NSS Mal Controlado: Implemente controle manual se necessário.

Fluxo de Comunicação

sequenceDiagram participant M as STM32 participant S as Sensor M->>S: NSS ativo (baixo) M->>S: Clock + Dados via MOSI S-->>M: Resposta via MISO M->>S: NSS inativo (alto)

Debug com Registradores

if (__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_OVR)) {
  __HAL_SPI_CLEAR_OVRFLAG(&hspi1); // Limpa flag de overrun
}

Considerações Finais🔗

A comunicação SPIUsando displays OLED com STM32 via I2C ou SPIUsando displays OLED com STM32 via I2C ou SPIDescubra como integrar e otimizar displays OLED com STM32 utilizando I2C e SPI, com dicas práticas para hardware, código e troubleshooting. no STM32 exige atenção a detalhes como sincronização de clock, configuração de pinosImplementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! e gerenciamento de erros. Utilize as ferramentas disponíveis (STM32CubeMXImplementando um sistema multitarefa com STM32 e RTOSImplementando um sistema multitarefa com STM32 e RTOSAprenda a migrar de código bare-metal para multitarefa robusta usando FreeRTOS no STM32. Descubra técnicas avançadas e exemplos práticos., HAL, DMA) para simplificar o desenvolvimento e adote práticas de debug como análise com osciloscópio e validação de registradores. Com os exemplos e técnicas apresentados, você estará apto a integrar periféricos SPI de forma eficiente e confiável em seus projetos.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados