Ich versuche, eine einfache SPI-Kommunikation auf STM32 Discovery durchzuführen, HAL lib wird verwendet. Ich versuche, einige Daten über SPI1 zu senden und dieselben Daten über SPI3 zu empfangen (SPI1 = Full Duplex Master, SPI3 = Full Duplex Slave). Zum Senden wird das Polling-Verfahren verwendet und zum Empfangen DMA-Circular. Die Kommunikation erfolgt auf 1 Gerät (nur eine Erkennung wird verwendet). Code bleibt hier hängen:
while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
Kann mir jemand erklären, warum der Code dort hängen bleibt?
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);
}
}
Wenn ich nur Daten sende (Receive Initialize ist kommentiert), habe ich das auf dem Logikanalysator bekommen, im Grunde fehlt ein kleines Intervall zwischen zwei Bytes.
Sie sollten sich die API-Dokumentation oder den Code ansehen. Wenn Sie dem SPI3 mitteilen, 10 Bytes über DMA zu empfangen, ist der Status BUSY_RX, bis es diese Bytes empfangen hat. Deshalb ist der Staat nicht bereit.
Zyklon125
HAL_SPI_GetState()
und sehen, was tatsächlich vor sich geht. Übrigens, warum wartest du aufHAL_SPI_STATE_READY
danachHAL_SPI_Receive_DMA()
?if
Ihr SPI-Empfänger ist bereits ordnungsgemäß initialisiert und bereit, was Sie zuvor überprüft habenHAL_SPI_Receive_DMA()
.