STM32 Spi recibe problema

Estoy tratando de hacer una comunicación SPI simple en STM32 Discovery, se usa HAL lib. Estoy tratando de enviar algunos datos a través de SPI1 y recibir los mismos datos en SPI3 (SPI1 = Full Duplex Master, SPI3 = Full Duplex Slave). Para transmitir se utiliza el método de sondeo y para recibir DMA circular. La comunicación está en 1 dispositivo (solo se usa un Discovery). Código atascado aquí:

while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}

¿Alguien puede explicarme por qué el código se atascó allí?

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);
        }
    }

Si solo envío datos (se comenta la inicialización de recepción), en el analizador lógico obtuve esto, básicamente falta un pequeño intervalo entre dos bytes.ingrese la descripción de la imagen aquí

¿Cuál es el código de estado SPI real? Puede leer el código del estado SPI real HAL_SPI_GetState()y ver lo que realmente está sucediendo. Por cierto, ¿por qué esperas HAL_SPI_STATE_READYdespués HAL_SPI_Receive_DMA()? Su receptor SPI ya está inicializado correctamente y listo, lo que ha verificado ifantes HAL_SPI_Receive_DMA().

Respuestas (1)

Debe consultar la documentación o el código de la API. Si le dice al SPI3 que reciba 10 bytes a través de DMA, el estado será BUSY_RX hasta que haya recibido esos bytes. Por eso el Estado no está preparado.