Comunicación SPI en STM32: Guía Completa del Bus Serial

  • Formato de trama de datos de 8 o 16 bits, con opción para MSB (bit más significativo primero) o LSB (bit menos significativo primero)
  • Soporte para modo maestro y esclavo
  • Gestión configurable de la señal de selección de esclavo (NSS) mediante hardware o software
  • Función de verificación CRC integrada en hardware
  • Soporte para interrupciones y DMA
  • Compatibilidad con los modos Motorola y TI
  • Soporte para modo half-duplex (unidireccional de un solo cable y bidireccional de un solo cable)

Problemas con la Señal de Selección de Esclavo (NSS)

Al configurar SSM en 1, el control de los pines se realiza mediante programación de software, lo que es adecuado cuando hay múltiples esclavos. Al establecer SSM en 0, el control se realiza mediante hardware.

1. Salida NSS habilitada (SSM=0, SSOE=1)

Se aplica en configuraciones de un maestro y un esclavo, permitiendo que el módulo SPI hardware gestione automáticamente la señal de selección. Este modo presenta ciertas limitaciones.

2. Salida NSS deshabilitada (SSM=0, SSOE=0)

Esta configuración permite la operación con múltiples dispositivos maestros. Cuando M1 transmite datos, NSS se establece en bajo nivel. Después de que M2 recibe esta señal, comprende que un maestro está activo y se retira automáticamente. Cuando NSS vuelve a nivel alto, M2 puede reiniciar su operación. En este escenario, NSS actúa como señal de arbitraje entre maestros, resolviendo conflictos entre ellos.

Función de Verificación CRC

En presancia de interferenicas externas o cruces de señales en la placa, puede ocurrir que un bit cambie de estado (por ejemplo, de alto a bajo), lo que invalida un byte completo y, por ende, todo el paquete de datos. Para garantizar la precisión de los datos recibidos por el esclavo y detectar errores rápidamente, se emplea la verificación CRC.

Este proceso consiste en realizar una operación mixta entre los datos recibidos y un polinomio, obteniendo así datos de verificación. Después de enviar un trama de datos, se envían 1 o 2 bytes adicionales como datos de verificación. Si el resultado del cálculo no coincide con estos datos, indica la presencia de errores y todo el paquete debe descartarse.

Los tamaños de verificación más comunes son 8 y 16 bits, con diferentes niveles de complejidad. Ambos ofrecen suficiente capacidad para detectar errores en los datos.

Como ejemplo con CRC-16, el polinomio x16+x15+x2+1 significa: x16 indica que es CRC-16, y el cálculo de 215 + 22 + 1 resulta en 0x8005.

Manejo de Interrupciones

  • Las transmisiones y recepciones del bus SPI responden a interrupciones por byte. Cada interrupción se activa al enviar o recibir uno o dos bytes.
  • Las interrupciones de transmisión y recepción son más utilizadas, similares a las del puerto serie.
  • Las interrupciones de error son menos comunes en la práctica.

Comparación entre Modos Motorola y TI

La principal diferencia entre estos modos radica en la línea de señal NSS.

Modo Motorola

En el modo Motorola, NSS permanece en alto nivel en estado inactivo. Al bajar a nivel bajo, indica que el dispositivo ha sido seleccionado y puede comunicarse con el maestro. Una vez completada la transferencia de datos, NSS vuelve a nivel alto, retornando al estado inactivo.

Modo TI

En el modo TI, NSS permanece en bajo nivel en estado inactivo. Para seleccionar un dispositivo, primero se eleva a nivel alto durante un ciclo de reloj y luego se devuelve a bajo. Este pulso alto en NSS sirve como señal de inicio.

Análisis de Funciones de la Biblioteca HAL

1. Modo Consulta (bloqueante)


// Función de transmisión
HAL_StatusTypeDef SPI_Transmit_Data(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count, uint32_t wait_time)

// Función de recepción
HAL_StatusTypeDef SPI_Receive_Data(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count, uint32_t wait_time)

// Función de transmisión y recepción simultánea
HAL_StatusTypeDef SPI_Transmit_Receive(SPI_HandleTypeDef *spi_handler, uint8_t *tx_buffer, uint8_t *rx_buffer, uint16_t data_count, uint32_t wait_time)

Estas tres funciones básicamente realizan la misma operación, ya que SPI es de duplex completo. Durante la transmisión, también se reciben datos. La diferencia radica en que la función de transmisión ignora los datos recibidos, mientras que la función de recepción ignora los datos transmitidos.

2. Modo Interrupción


// Transmisión con interrupción
HAL_StatusTypeDef SPI_Transmit_Interrupt(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count)

// Recepción con interrupción
HAL_StatusTypeDef SPI_Receive_Interrupt(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count)

// Transmisión y recepción simultánea con interrupción
HAL_StatusTypeDef SPI_TransmitReceive_Interrupt(SPI_HandleTypeDef *spi_handler, uint8_t *tx_buffer, uint8_t *rx_buffer, uint16_t data_count)

Con las interrupciones habilitadas, cada transmisión o recepción de datos activa la función de devolución de llamada correspondiente.

3. Modo DMA


// Transmisión con DMA
HAL_StatusTypeDef SPI_Transmit_DMA(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count)

// Recepción con DMA
HAL_StatusTypeDef SPI_Receive_DMA(SPI_HandleTypeDef *spi_handler, uint8_t *data_buffer, uint16_t data_count)

// Transmisión y recepción simultánea con DMA
HAL_StatusTypeDef SPI_TransmitReceive_DMA(SPI_HandleTypeDef *spi_handler, uint8_t *tx_buffer, uint8_t *rx_buffer, uint16_t data_count)

El modo DMA se utiliza menos comúnmente en aplicaciones SPI, pero tiene casos específicos de aplicación:

  • Para ADC de alta velocidad, donde DMA puede recolectar continuamente datos del chip ADC en un buffer para su posterior procesamiento.
  • En osciloscopios, donde el modo DMA de transmisión envía los datos a mostrar, permitiendo la recolección de datos de múltiples canales.

Etiquetas: STM32 SPI HAL CRC DMA

Publicado el 6-18 02:12