STM32 Spi-Empfangsproblem

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.Geben Sie hier die Bildbeschreibung ein

Was ist der tatsächliche SPI-Statuscode? Sie können den Code des tatsächlichen SPI-Status mit lesen HAL_SPI_GetState()und sehen, was tatsächlich vor sich geht. Übrigens, warum wartest du auf HAL_SPI_STATE_READYdanach HAL_SPI_Receive_DMA()? ifIhr SPI-Empfänger ist bereits ordnungsgemäß initialisiert und bereit, was Sie zuvor überprüft haben HAL_SPI_Receive_DMA().

Antworten (1)

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.