Stm32 SPI状态未得到更新

Stm32 SPI状态未得到更新,stm32,spi,Stm32,Spi,我正在使用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; hs

我正在使用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\u SPI\u Init(&hspi3)
函数中,
hspi3
不会给出任何错误代码,它进入
hspi->State=HAL\u SPI\u State\u READY
. 但是在watch窗口中,
hspi3
状态不会得到更新;它保持在HAL\U SPI\U STATE\U 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);
}
当I
HAL\u SPI\u传输(&hspi3,(uint8\u t*)数据\u on\u SPI,3,1)
时,它将转到错误处理程序,因为它将SPI状态识别为
HAL\u SPI\u state\u RESET
。 需要帮助来理解为什么会发生这种情况

编辑:我认为问题在于,当我尝试执行
HAL\u SPI\u传输(&hspi3,(uint8\u t*)数据\u on\u SPI,3,1)
时,即使
HAL\u LOCK(hspi)
完成,锁仍保持解锁状态

  • 不要在中断处理程序中以轮询模式传输。 原因:因为它消耗很多时间。这些HAL功能依赖于在另一个中断中增加的滴答值,该中断可能不会发生,因为中断优先级
    你启用SPI时钟了吗?我在你的代码片段中找不到这个。我的手表窗口有时会出现问题,显示的枚举值不正确。尝试查找内存地址并重新检查其中的值。您正在使用哪个调试器?@A.R.C.-是的,spi时钟在“HAL_spi_MspInit(spi_HandleTypeDef*hspi)”函数中作为“HAL_RCC_SPI3_CLK_ENABLE()”启用。我正在使用Keil uVision 5。我也尝试使用“HAL_SPI_Transmit_DMA”和“HAL_SPI_Transmit_IT”来代替“HAL_SPI_Transmit”,但它仍然输入错误代码。然而,当我在定时器中断之外使用SPI时,它似乎工作得很好。我将用另一种方式说:不要在中断内部使用HAL传输功能。STM32 HAL中关于具有顺序状态的外围设备部分的中断处理确实相当复杂。通常,人们要么手工制作整个ISR,要么查看HAL示例的具体操作方式,因为HAL这一部分的工作方式的设计充其量是“不直观的”。