STM32 SPI связь - PullRequest
       108

STM32 SPI связь

0 голосов
/ 02 ноября 2018

Я пытаюсь установить связь SPI с помощью STM32F411VE. У меня проблемы с коммуникацией SPI. Я слежу за передачей и получением от этого конкретного кода

http://www.handsonembedded.com/stm32f103-spl-tutorial-5/

Я использую SPI4. Моя инициализация SPI выглядит следующим образом:

/* SPI4 init function */
void MX_SPI4_Init(void)
{

  hspi4.Instance = SPI4;
  hspi4.Init.Mode = SPI_MODE_MASTER;
  hspi4.Init.Direction = SPI_DIRECTION_2LINES;
  hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi4.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi4.Init.NSS = SPI_NSS_SOFT;
  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi4.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

Вот код:

uint8_t SPISend(uint8_t data)
{
    SPI4->DR = data;
    while (!(SPI4->SR & SPI_SR_TXE));
    while (!(SPI4->SR & SPI_SR_RXNE));
    while (!(SPI4->SR & SPI_SR_BSY));
    return(SPI4->DR);
}

В этом конкретном SPISend() методе управление никогда не доходит до конца. Он застрял в петле while (!(SPI4->SR & SPI_SR_TXE));.

Мой фукционный звонок такой:

void write8(char reg, unsigned char data)
{
    uint8_t retVal;
    enableChip;
    reg|=0x80;
    retVal = SPISend(reg);
    retVal = SPISend(data);
    disableChip;
}

Любые предложения.

1 Ответ

0 голосов
/ 02 ноября 2018

Вне моей головы, SPI_CR1_SPE и / или SPI_CR1_SSI должны быть включены в SPI4->CR1. HAL_SPI_Init() не устанавливает одно или другое, но делает функцию передачи HAL SPI, вы должны сделать это самостоятельно, если используете свой собственный код передачи.

UPDATE

Если вы включите биты SPE и SSI в enableChip, он никогда не будет вызван, потому что это не вызов функции без скобок.

Эти две строки

SPI4->DR = data;
while (!(SPI4->SR & SPI_SR_TXE));

в неправильном порядке. Сначала вы ждете TXE != 0, что означает, что очередь передатчика готова для получения дополнительных данных, а затем записываете данные.

Вторая строка здесь

while (!(SPI4->SR & SPI_SR_RXNE));
while (!(SPI4->SR & SPI_SR_BSY));

, вероятно, будет бесконечным циклом, потому что к тому времени, когда SPI_SR_RXNE станет 1, или вскоре после этого, SPI_SR_BSY изменится с 1 на 0.

...