Передача STM32 SPI

Я использую STM32F103C8, некоторое время пытаясь получить интерфейс SPI. Использовал Atollic TrueStudio. Я все еще новичок в этом вопросе, поэтому, если это глупый вопрос, надеюсь, вы меня простите.

Кажется, я не могу ничего передать через интерфейс SPI, что бы я ни пытался. Я просмотрел руководство и подумал, что все сделал правильно, но, очевидно, нет. Из того, что я читал, похоже, это:

  • Включить часы SPI в RCC APB2ENR
  • Настройте регистр SPI CR1
  • Включите SPI с помощью бита SPE
  • Передача путем загрузки данных в регистр SPI-> DR
  • Получение путем чтения данных из регистра SPI-> DR, поскольку есть буфер передачи и приема, связанный с SPI-> DR

Я попытался зациклить вывод MOSI на вывод MISO и выполнить запись, но ничего не получил. Затем я подключил логический анализатор, и тактовый вывод SPI даже ничего не делает. Соответствующий код ниже, если кто-то может помочь, это было бы здорово:

void PrintStrToUART(char str[])
{
char *pointertostr;
for (pointertostr = &str[0]; *pointertostr != '\0'; pointertostr++){
    USART1 -> DR = (*pointertostr & USART_DR_DR);
    while ((USART1 -> SR & USART_SR_TXE) == 0){
        ; 
        }
    }
}

void PrintCharArrayToUART(unsigned char str[], int arraysize){
int j;
unsigned char buffer[((5*arraysize)-2)];
unsigned char *positionpointer = &buffer[0];

for(j=0; j <= (arraysize-1); j++){
    if(j){
        positionpointer += sprintf(positionpointer, ", ");
    }
    positionpointer += sprintf(positionpointer, "%d", str[j]);
}

int newarrayend;
newarrayend = (positionpointer - &buffer[0]);

PrintStrToUART("[");
for(j = 0; j <= newarrayend; j++){ 
    USART1 -> DR = (buffer[j] & USART_DR_DR);
    while ((USART1 -> SR & USART_SR_TXE) == 0){
        ;
    }
}
PrintStrToUART("]\n\r");
}

void SelfSPIInit(void){ //because the Mx one is not working
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Enable SPI clock

//Set baud prescaler
SPI1->CR1 = SPI_CR1_BR; //Slowest SPI I can have

//CPHA CPOL
SPI1-> CR1 &= ~(SPI_CR1_CPOL | SPI_CR1_CPHA);

//8 bit data format
SPI1->CR1 &= ~(SPI_CR1_DFF);

//Full duplex mode
SPI1->CR1 &= ~(SPI_CR1_BIDIMODE);
SPI1->CR1 &= ~(SPI_CR1_RXONLY);

//MSB first
SPI1->CR1 &= ~(SPI_CR1_LSBFIRST);

//Master mode
SPI1->CR1 |= SPI_CR1_MSTR;

//Software NSS mode off
SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;

//Enable
SPI1->CR1 |= SPI_CR1_SPE;

//Enable the SPI GPIO pins

}

int main(void)
{
int i;
HAL_Init();

/* Configure the system clock */
SystemClock_Config(); //config to run at the correct speed

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
MX_CRC_Init();
MX_USART2_UART_Init();
MX_ADC1_Init();
MX_TIM3_Init();
//MX_SPI1_Init();
SelfSPIInit();

TIM1 -> CR1 |= TIM_CR1_CEN;
TIM2 -> CR1 |= TIM_CR1_CEN;
I2C1 -> CR1 |= I2C_CR1_PE; //peripheral enable
SPI1 -> CR1 |= SPI_CR1_SPE;

unsigned char newchararray[21] = {0x41};
unsigned char *pnewchararray = &newchararray[0];

unsigned char recarray[7] = {127};
unsigned char *precarray = &recarray[0];

while (1)
{

  GPIOC -> BSRR |= GPIO_BSRR_BR13;
  GPIOA -> BSRR |= GPIO_BSRR_BR6;
  MilliSecondDelay(500);
  GPIOC -> BSRR |= GPIO_BSRR_BS13;
  GPIOA -> BSRR |= GPIO_BSRR_BS6;
  MilliSecondDelay(500);
  SPI1->DR = *pnewchararray;
  while((SPI1->SR & SPI_SR_TXE) == 0){
      //while transmit buffer not empty, wait
      ;
  }
  while((SPI1->SR & SPI_SR_RXNE) == 0){
      ;//while receive buffer not empty
  }
  *precarray = SPI1->DR;
  PrintCharArrayToUART(precarray, 7);
 }
}

Извините за отступы, как я уже сказал, я все еще новичок в этом, но это код, который компилируется и запускается. Любая помощь приветствуется, спасибо!

Изменить: не был уверен, следует ли включать функции USART, то есть просто для печати на моем ноутбуке, чтобы я мог видеть, что есть в регистре данных SPI. Но я подумал, что если я включу его, программа будет иметь больше смысла.


person Andrew Wheatley    schedule 03.06.2018    source источник
comment
Между USART и SPI очень большая разница. Это два совершенно разных протокола. Какой из них вы пытаетесь реализовать?   -  person Hein Wessels    schedule 03.06.2018


Ответы (2)


Взгляните на http://www.handsonembedded.com/stm32f103-spl-tutorial-5/. Есть полный пример spi для stm32f103.

person mich1985    schedule 03.06.2018

И еще один: похоже, вы забыли о мультиплексировании контактов.

person user2043854    schedule 03.06.2018