SPI已开启DMA但一直无法跳出循环

问题描述 投票:0回答:0
static HAL_StatusTypeDef SPI_Transmit(uint8_t* send_buf, uint16_t size)
{
//    return HAL_SPI_Transmit(&hspi1, send_buf, size, 100);
    HAL_StatusTypeDef state;
    
    state = HAL_SPI_Transmit_DMA(&hspi1, send_buf, size);
    while(hdma_spi1_tx.State != HAL_DMA_STATE_READY);
    return state;
}


static HAL_StatusTypeDef SPI_Receive(uint8_t* recv_buf, uint16_t size)
{
//   return HAL_SPI_Receive(&hspi1, recv_buf, size, 100);
    HAL_StatusTypeDef state;
   
    state =  HAL_SPI_Receive_DMA(&hspi1, recv_buf, size);
    while(hdma_spi1_rx.State != HAL_DMA_STATE_READY);
    return state;
}

我想为我的SPI开启DMA,但是在数据传输过程中断点调试“hdma_spi1_tx.State”已经变成了“HAL_DMA_STATE_READY”,但是还是跳不出while循环。为什么?

我试过直接DMA传输不等待,但是读取的数据是错误的。比如我用的是W25Q64内存条,在

uint16_t W25QXX_ReadID(void)
{
    uint8_t recv_buf[2] = {0}; //recv_buf[0] stores Manufacture ID, recv_buf[1] stores Device ID
    uint16_t device_id;
    uint8_t send_data[4] = {ManufactDeviceID_CMD,0x00,0x00,0x00}; //data to be sent, command + address
    
    /* enable chip select */
    HAL_GPIO_WritePin(W25Q64_CHIP_SELECT_GPIO_Port, W25Q64_CHIP_SELECT_Pin, GPIO_PIN_RESET);
    
    /* Send and read data */
    if (HAL_OK == SPI_Transmit(send_data, 4))
    {
        if (HAL_OK == SPI_Receive(recv_buf, 2))
        {
            device_id = (recv_buf[0] << 8) | recv_buf[1];
        }
    }
    
    /* cancel chip selection */
    HAL_GPIO_WritePin(W25Q64_CHIP_SELECT_GPIO_Port, W25Q64_CHIP_SELECT_Pin, GPIO_PIN_SET);
    
    return device_id;
}

但是读出来的确实是0x0000。按理说W25Q64的device_id应该是0XEF16。查看断点调试后,神奇的事情发生了。实际上读出了device_id。想了想,之前的

while (hdma_spi1_tx.State != HAL_DMA_STATE_READY); 
一直要等,但是等的结果就是出不来循环

c stm32 spi dma
© www.soinside.com 2019 - 2024. All rights reserved.