SPI状态未更新

问题描述 投票:1回答:1

我正在使用STM32L496微控制器,其中我按照以下方式初始化hspi3-

void MX_SPI3_Init()
{
    SPI_HandleTypeDef hspi3;

    /* SPI3 parameter configuration*/
    hspi3.Instance = SPI3;
    hspi3.Init.Mode = SPI_MODE_MASTER;
    hspi3.Init.Direction = SPI_DIRECTION_2LINES;
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi3.Init.NSS = SPI_NSS_SOFT;
    hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi3.Init.CRCPolynomial = 7;
    hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init(&hspi3) != HAL_OK)
    {
        Error_Handler();
    }
}

在我的HAL_SPI_Init(&hspi3)函数内部,hspi3没有给出任何错误代码,它转到hspi->State = HAL_SPI_STATE_READY;IMAGE。但是在监视窗口中,hspi3状态不会得到更新。它保持在HAL_SPI_STATE_RESET。因此,当我尝试如下所示使用SPI发送一些数据时,它失败-

void TIM3_IRQHandler(void)
{
    static uint16_t sinTableIndex = 0;
    uint8_t data_on_spi[3];
    SysTime_mainFunction();
    if (getOperatingState() == CONTROL){
            data_on_spi[0]=sinTable[sinTableIndex] & MASK_LOW_BYTE;
            data_on_spi[1]=sinTable[sinTableIndex] & MASK_MID_BYTE;
            data_on_spi[2]=sinTable[sinTableIndex] & MASK_HIGH_BYTE;

            HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_RESET);
            if(HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1) != HAL_OK)
            {
                    /* Transfer error in transmission process */
                    Error_Handler();
            }
            HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);
            sinTableIndex++;
            if (sinTableIndex >= maxTableSize)
            {
                    sinTableIndex = 0;
            }
    }
  HAL_TIM_IRQHandler(&htim3);
}

当我HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)时,它将进入错误处理程序,因为它将SPI状态识别为HAL_SPI_STATE_RESET。需要帮助以了解为什么会发生这种情况。

编辑:我认为问题是,当我尝试执行HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)时,即使完成__HAL_LOCK(hspi),LOCK也会保持解锁状态。

stm32 spi
1个回答
1
投票
  1. 请勿在中断处理程序中以轮询模式进行传输。原因:因为它消耗大量时间。那些HAL函数根据滴答值进行中继,该滴答值在另一个中断中增加,由于中断优先级可能不会发生。
© www.soinside.com 2019 - 2024. All rights reserved.