STM32F103 "BLUE PILL" SPI La señal del reloj no funciona

0

He intentado comunicarme con Arduino UNO a través de SPI1 del tablero de pastillas azules STM32F103. Estoy usando la biblioteca de periféricos estándar. He comprobado innumerables tutoriales y los he ejecutado en mi tablero. La señal del reloj no funciona y, además, la línea MOSI no tiene una transmisión adecuada. Estoy usando un analizador lógico para leer el bus antes de conectarlo a Arduino. Aquí está el código:

/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/


#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_rcc.h"


#define MOSI GPIO_Pin_7
#define MISO GPIO_Pin_6
#define SCLK GPIO_Pin_5
#define SS GPIO_Pin_1


void delay(){
    for(int i=0; i < 50; i++);
}




int main(void)
{
    RCC_PCLK2Config(RCC_HCLK_Div4);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);

    SPI_InitTypeDef spiSettings;
    SPI_StructInit(&spiSettings);
    spiSettings.SPI_Mode = SPI_Mode_Master;
    spiSettings.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
    spiSettings.SPI_NSS = SPI_NSS_Soft;

    SPI_Init(SPI1,&spiSettings);

    SPI_Cmd(SPI1,ENABLE);

    // Configure SCLK & MOSI & SS
    GPIO_InitTypeDef gpioPin;
    gpioPin.GPIO_Mode = GPIO_Mode_AF_PP;
    gpioPin.GPIO_Pin = (SCLK | MOSI);
    gpioPin.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&gpioPin);

    // Configure MISO
    gpioPin.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    gpioPin.GPIO_Pin = MISO;
    gpioPin.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&gpioPin);

    // Configure SS
    gpioPin.GPIO_Mode = GPIO_Mode_Out_PP;
    gpioPin.GPIO_Pin = SS;
    gpioPin.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&gpioPin);
    //GPIO_WriteBit(GPIOA,SS,SET);

    char data = 0x07;

    while(1){

            SPI1->DR = data;
            // Wait until transmit complete
            while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));
            // Wait until receive complete
            while (!(SPI1->SR & (SPI_I2S_FLAG_RXNE)));

            // Wait until SPI is not busy anymore
            while (SPI1->SR & (SPI_I2S_FLAG_BSY));

            (void)SPI1->DR;

    }
}

Aquí está la captura de pantalla del analizador lógico.

La línea del reloj no está en ciclo regular, la función de decodificación del analizador lógico no identifica los datos que funcionaron al leer el bus SPI de arduino por separado.

    

0 respuestas

Lea otras preguntas en las etiquetas