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.
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.
ciclón125
HAL_SPI_GetState()
y ver lo que realmente está sucediendo. Por cierto, ¿por qué esperasHAL_SPI_STATE_READY
despuésHAL_SPI_Receive_DMA()
? Su receptor SPI ya está inicializado correctamente y listo, lo que ha verificadoif
antesHAL_SPI_Receive_DMA()
.