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.