STM32 Spi проблема с приемом

Я пытаюсь выполнить простую связь SPI на STM32 Discovery, используется HAL lib. Я пытаюсь отправить некоторые данные через SPI1 и получить те же данные через SPI3 (SPI1 = Full Duplex Master, SPI3 = Full Duplex Slave). Для передачи используется метод опроса, а для приема циклический DMA. Связь идет на 1 устройство (используется всего один Discovery). Код застрял здесь:

в то время как (HAL_SPI_GetState (& hspi3)! = HAL_SPI_STATE_READY) {}

Может кто-нибудь объяснить мне, почему код застрял там?

uint8_t rxSpi[10] = {0};
uint8_t txSpi[10] = "123456788";
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();

        MX_GPIO_Init();
        MX_DMA_Init();
        MX_SPI1_Init();
        MX_SPI3_Init();
        MX_USART2_UART_Init();

        if(HAL_SPI_Receive_DMA(&hspi3, rxSpi, 10) != HAL_OK)
        {
            Error_Handler();
        }
        while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}

        while (1)
        {
            if(HAL_SPI_Transmit(&hspi1, txSpi, 10, 100) != HAL_OK)
            {
                Error_Handler();
            }
            while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
            HAL_Delay(1000);
        }
    }

Если я просто отправляю данные (инициализация приема закомментирована), на логическом анализаторе я получаю это, в основном отсутствует небольшой интервал между двумя байтами.введите описание изображения здесь

Каков фактический код состояния SPI? Вы можете прочитать код фактического состояния SPI с помощью HAL_SPI_GetState()и посмотреть, что на самом деле происходит. Кстати, почему вы ждете HAL_SPI_STATE_READYпосле HAL_SPI_Receive_DMA()? Ваш приемник SPI уже правильно инициализирован и готов, как вы уже проверяли ifранее HAL_SPI_Receive_DMA().

Ответы (1)

Вы должны посмотреть документацию или код API. Если вы скажете SPI3 получить 10 байтов через DMA, состояние будет BUSY_RX, пока он не получит эти байты. Поэтому государство не готово.