STM32F4xx barebones SPI (inicialización HAL)

1

Estoy trabajando en una pieza de software para un dispositivo STM32F4xx que comenzó a partir de un proyecto generado por STM32CubeMX.

Estoy usando el periférico SPI que se ha inicializado con la biblioteca HAL. Este es un ejemplo de una función de escritura SPI que funciona:

void spi_write(uint8_t data) {
    HAL_SPI_Transmit(&hspi2,&data,1,HAL_MAX_DELAY);
}

Si quiero enviar datos usando el SPI sin usar la biblioteca HAL, pero hacerlo de forma autónoma en los registros (porque es más rápido) no funciona. Esta es mi implementación:

void spi_write(uint8_t data) {
    (&hspi2)->Instance->DR = data;
    while (!((&hspi2)->Instance->SR & ((uint16_t)0x0002))); //Check TXE flag (SPI_I2S_FLAG_TXE)
    while ((&hspi2)->Instance->SR & ((uint16_t)0x0080)); // Check busy flag (SPI_I2S_FLAG_BSY)
}

¿Alguna idea de por qué la segunda implementación no funciona? ¡Gracias!

    
pregunta Cezar Chirila

1 respuesta

0

dependiendo de la implementación del SPI probablemente necesites realizar el lanzamiento correctamente

*(volatile uint8_t *)&SPIx -> DR = data;

Entonces, esperar por ambas banderas después del envío no tiene sentido. Usar los números mágicos es simplemente ridículo.

void spi_write(uint8_t data) 
{
    while (!(hspi2.Instance->SR & SPI_SR_TXE)));  // check  the CMSIS definition for you uC
    *(volatile uint8_t *)&hspi2.Instance->DR = data;
}

La última comprobación es necesaria solo si va a desactivar el SPI o si cambia manualmente el estado del pin CS y tiene que esperar hasta que se transmitió la última.

Otros errores: el registro SR es de 32 bits no 16. ¿Cuál es el punto de usar HAL para la inicialización si quiere usarlo de la manera más sencilla?

    
respondido por el P__J__

Lea otras preguntas en las etiquetas