8 votos

SPI en STM32 no funcionará sin resistencias pullup e incluso entonces funciona mal

He estado tratando de conseguir la SPI1 en el STM32F103C8 (Píldora Azul de la junta) funciona correctamente durante algún tiempo ahora. Como apenas estoy comenzando a aprender el BRAZO, simplemente estoy tratando de datos de desplazamiento a un integrado 74hc595 registro de desplazamiento y pestillo a la luz de un byte de LEDs. Yo no estoy leyendo ningún dato, por lo que sólo tengo MOSI, SCK y SS líneas.

Al principio yo no estaba consiguiendo nada, pero de la lectura de algunos ejemplos en línea yo podría solucionar estos primeros problemas para conseguir la comunicación (que yo necesitaba para establecer correctamente GPIOA pines y el conjunto de software SS).

El principal problema ahora mismo es que si yo no incluyen las resistencias pull-up en todas las líneas (MOSI, SCK, y SS), el microcontrolador no salida de cualquier cosa, en cualquier línea (marcada con un ámbito de aplicación). En la parte superior de este, después de la adición de las resistencias pull-up el tiempo de subida del pulso es muy lento, así que no puedo usar una frecuencia muy alta (con 10 kΩ pull-up resistencias estoy limitada a alrededor de 250 kHz SCK, y el cambio de 330 Ohm aproximadamente 4 MHz). Estoy trabajando en un protoboard, pero incluso entonces con AVR y messier cableado podía conseguir un 4 MHz SPI de trabajo no hay problema sin ningún añadido de las resistencias y las formas de onda se limpiador.

Aquí hay dos fotos (lo siento por el deplorable estado de mi ámbito de aplicación de la pantalla) y transmite el byte 0b01110010 en un 250 kHz reloj. La parte superior de la traza es SCK y la parte inferior es MOSI. La primera foto es con 10 kΩ resistencias pull-up y el segundo con 330 Ohm resistencias pull-up que hacen que las formas de onda mucho más agradable (pero no debería ser necesario).

Te agradecería un poco de ayuda para averiguar lo que está pasando.

10 kΩ pull-up resistors and 250 kHz clock

330 Ω pull-up resistors and 250 kHz make waveform a lot nicer

Las partes relevantes de mi código son:

#define SS_LOW        GPIOA->BSRR |= 1 << 4 + 16;
#define SS_HIGH        GPIOA->BSRR |= 1 << 4;

// SPI GPIO configuration
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRL |= 0b0011 << 4 * 4;    // Set pin A4 as PP out 50mHz for SS
GPIOA->CRL |= 0b1011 << 5 * 4;    // Set pin A5 AltFunc PP out 50mHz for SCK
GPIOA->CRL |= 0b1011 << 7 * 4;    // Set pin A7 AltFunc PP out 50mHz for MOSI
SS_HIGH;

// SPI1 configuration
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;        // Enable SPI1 clock
SPI1->CR1 |= SPI_CR1_SSM;        // Software SS
SPI1->CR1 |= SPI_CR1_SSI;
SPI1->CR1 |= SPI_CR1_BR_0;        // Set prescaler
SPI1->CR1 |= SPI_CR1_BR_1;
SPI1->CR1 |= SPI_CR1_BR_2;
SPI1->CR1 |= SPI_CR1_MSTR;        // Master mode
SPI1->CR1 |= SPI_CR1_SPE;        // Enable SPI

// Transmit byte
SS_LOW;
SPI1->DR = 0b01110010;
while(!(SPI1->SR & SPI_SR_TXE));
while(SPI1->SR & SPI_SR_BSY);
SS_HIGH;

12voto

Stefan Arentz Puntos 151

Debe restablecer el valor de los pines que está cambiando antes de configurar los bits.

El valor de restablecimiento de GPIOA_CRL es 0x4444 4444. Por lo tanto, cada pin se inicializa con 0b0100, si haces un | = 0b0011, terminas con 0b0111 que es una salida de drenaje abierto. Lo mismo con 0b1011 se convierte en 0b1111 y esa es una función alternativa de drenaje abierto.

Así que necesitas hacer algo como esto:

 // Reset pin configuration
GPIOA->CRL &= ~(0b1111 << 4 * 4);  // Reset Pin A4
GPIOA->CRL &= ~(0b1111 << 5 * 4);  // Reset Pin A5
GPIOA->CRL &= ~(0b1111 << 7 * 4);  // Reset Pin A7
GPIOA->CRL |= 0b0011 << 4 * 4;  // Set pin A4 as PP out 50mHz for SS
GPIOA->CRL |= 0b1011 << 5 * 4;  // Set pin A5 AltFunc PP out 50mHz for SCK
GPIOA->CRL |= 0b1011 << 7 * 4;  // Set pin A7 AltFunc PP out 50mHz for MOSI
 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X