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.
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;