STM32 Standard Peripheral Library (SPL) - Modificar la configuración de SPI

1

Estoy utilizando la biblioteca STM32 SPL con un microcontrolador STM32F103C8. Como parte del proyecto, estoy usando el periférico SPI1 para interactuar con una tarjeta SD.

Inicialmente, la velocidad SPI debe mantenerse a menos de 400 kHz para la tarjeta SD. Mi código de inicialización SPI1 es

SPI_InitTypeDef spi;

//ENABLE THE CLOCK TO SPI1 PERIPHERAL
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

//SET SPI SPEED TO LOW SPEED MODE (~282KHZ)
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_NSS = SPI_NSS_Soft;

SPI_Init(SPI1, &spi);
SPI_Cmd(SPI1, ENABLE);

Por supuesto, una vez que se complete la inicialización inicial de la tarjeta SD, me gustaría acelerar el periférico SPI1.

No pude encontrar ninguna función en la SPL que pudiera devolver una estructura del tipo SPI_InitTypeDef que contenga las configuraciones actualmente configuradas de un periférico SPI.

¿Eso significa que tengo que crear una nueva estructura de este tipo (y repetir todos los valores de configuración incluso si solo deseo cambiar la velocidad y mantener el resto igual a lo configurado) y luego llamar a SPI_Init() con esta nueva estructura ?

    
pregunta Ankit

1 respuesta

3

Si encuentra el registro SPI_CR1 en Manual de referencia , puede ver que la velocidad está establecida por los bits BR (bits 5: 3 en SPI_CR1). Puede ajustar la velocidad en baudios sobre la marcha cambiando estos bits, siempre que no haya una transmisión actualmente en curso:

Convenientemente, el SPI_BaudRatePrescaler define provisto por el mapa de la Biblioteca Periférica Estándar directamente sobre los bits SPI_CR1.

Lo que hago es crear las siguientes # definiciones:

#define BAUD_RATE_BITMASK    0xFFC7                // Used to clear CR1->BR[2:0]
#define SPI_SPEED_LOW    SPI_BaudRatePrescaler_32  // 72/32 = 2.25MHz
#define SPI_SPEED_HIGH   SPI_BaudRatePrescaler_4   // 72/4 = 18MHz

Luego uso algo como esto para ajustar la velocidad (donde NewSpeed es una de las definiciones de SPL):

void spiSetSpeed(uint16_t NewSpeed)
{
    // Assert the new speed setting
    SPI1->CR1 &= BAUD_RATE_BITMASK;                // Clear the BR[2:0] bits
    SPI1->CR1 = (uint16_t)(SPI1->CR1 | NewSpeed);  // Set the bits
}
    
respondido por el bitsmack

Lea otras preguntas en las etiquetas