2017-02-16 345 views
1

我有一个简单的项目,使用CubeMX创建外围设备初始化。STM32F0 SPI接收中断没有触发

SPI处于从机模式,似乎被正确初始化,但是当我时钟8位数据时,中断不会被调用。

下面的代码

/* SPI1 init function */ 
static void MX_SPI1_Init(void) 
{ 

    hspi1.Instance = SPI1; 
    hspi1.Init.Mode = SPI_MODE_SLAVE; 
    hspi1.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi1.Init.NSS = SPI_NSS_SOFT; 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi1.Init.CRCPolynomial = 7; 
    hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; 
    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; 

    if (HAL_SPI_Init(&hspi1) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) 
{ 

    GPIO_InitTypeDef GPIO_InitStruct; 
    if(hspi->Instance==SPI1) 
    { 
    /* USER CODE BEGIN SPI1_MspInit 0 */ 

    /* USER CODE END SPI1_MspInit 0 */ 
    /* Peripheral clock enable */ 
    __HAL_RCC_SPI1_CLK_ENABLE(); 

    /**SPI1 GPIO Configuration  
    PA5  ------> SPI1_SCK 
    PA6  ------> SPI1_MISO 
    PA7  ------> SPI1_MOSI 
    */ 
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; 
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

    /* Peripheral interrupt init */ 
    HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(SPI1_IRQn); 
    /* USER CODE BEGIN SPI1_MspInit 1 */ 

    /* USER CODE END SPI1_MspInit 1 */ 
    } 

} 

void SPI1_IRQHandler(void) 
{ 
    /* USER CODE BEGIN SPI1_IRQn 0 */ 

    /* USER CODE END SPI1_IRQn 0 */ 
    HAL_SPI_IRQHandler(&hspi1); 
    /* USER CODE BEGIN SPI1_IRQn 1 */ 
    spi_interrupt(); 
    /* USER CODE END SPI1_IRQn 1 */ 
} 

spi_interrupt()是我中断动作特定代码,并在一个断点永远不会触发。

我在CLKIN引脚上有一个范围,它的确有8个时钟。

+1

您是否在代码中的任何位置调用过'HAL_SPI_Receive_IT'?因为实际启用中断,你必须调用这个宏__HAL_SPI_ENABLE_IT(hspi,(SPI_IT_RXNE | SPI_IT_ERR));''HAL_SPI_Receive_IT'为你调用它,IRQ处理程序在收到给定字节数后禁用它。 –

+0

谢谢你本斯,这是正确的解决方案:) – OXO

+0

很高兴在这里,我会把它放在答案然后。 –

回答

2

ST的HAL库不会在初始化函数中启用实际的外设中断。

对于几乎所有的外设,都必须调用一个附加函数,它总是具有以下名称结构HAL_<peripheral>_<action>_IT,因此在SPI RX的情况下,它被称为HAL_SPI_Receive_IT

这实际上允许通过使用名为__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR))的宏设置正确的位来接收SPI RX中断。

注意,如果达到(这个值在HAL_SPI_Receive_IT由用户通过)预期的字节数,则HAL_SPI_IRQHandler将禁止SPI RX再次中断,因此需要在新接收的情况下重复HAL_SPI_Receive_IT通话。