技术求助:STM32F429 SPI SLAVE中断方式接收数据时,SPI_SR_BSY状态位被置1,导致SPI slave接收异常

2019-07-20 02:30发布


用的是STM32F429IGT6,用 SPI2外设作为slave和其他设备通讯,通过中断方式接收外来的SPI数据,SPI通讯功能正常。
但是经常会发生在接收数据中途SPI_SR_BSY状态位一直被置1不变,导致SPI slave无法接收数据,并且重启SPI外设也没用,必须MCU复位才可以。看了手册PI_SR_BSY状态位是系统自动置1的,是硬件自动置位的,正常在数据完成接收之后就会置0。

这个问题一直找不到原因,是不是硬件哪里的配置问题。现在把SPI slave通讯相关的的代码贴上,还请大家帮忙找找可能是哪里的原因 谢谢了!
由于注释拷贝出来是乱码,就把注释删掉了。

以下是 SPI SLAVE配置代码
void SPI_COM_Init(void)
{
          uint8_t temp;
    SPI_COM_Handler.Instance=SPI_COM;                         //SPI2
    SPI_COM_Handler.Init.Mode=SPI_MODE_SLAVE;            
    SPI_COM_Handler.Init.Direction=SPI_DIRECTION_2LINES;  
    SPI_COM_Handler.Init.DataSize=SPI_DATASIZE_8BIT;      
    SPI_COM_Handler.Init.CLKPolarity=SPI_POLARITY_LOW;   
    SPI_COM_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;         
    SPI_COM_Handler.Init.NSS=SPI_NSS_HARD_INPUT;               
    SPI_COM_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;
    SPI_COM_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;      
    SPI_COM_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        
    SPI_COM_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;
    SPI_COM_Handler.Init.CRCPolynomial=7;               
    HAL_SPI_Init(&SPI_COM_Handler);

        __HAL_SPI_ENABLE_IT(&SPI_COM_Handler, SPI_IT_RXNE | SPI_IT_ERR );
        HAL_NVIC_SetPriority(SPI_COM_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(SPI_COM_IRQn);
       
         __HAL_SPI_ENABLE(&SPI_COM_Handler);         
         
}


SPI 硬件管脚配置
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Initure;

    SPI_COM_GPIO_CLK_ENABLE();      
    SPI_COM_CLK_ENABLE();      

    GPIO_Initure.Pin=SPI_COM_MISO_PIN | SPI_COM_NSS_PIN | SPI_COM_SCK_PIN | SPI_COM_MOSI_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;                          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;              
    GPIO_Initure.Alternate=SPI_COM_AF;         
    HAL_GPIO_Init(SPI_COM_GPIO_PORT,&GPIO_Initure);
}


SPI中断处理程序
void SPI_COM_IRQHandler(void)
{
        //HAL_SPI_IRQHandler(&SPI_COM_Handler);
          uint32_t tmp1 = 0,tmp2 = 0;
          uint8_t TMP_RxData;

        tmp1 = SPI_COM_Handler.Instance->SR;
         tmp2 = SPI_COM_Handler.Instance->CR2;
       
  if(tmp1 & SPI_SR_RXNE)
  {
                TMP_RxData = SPI_COM_Handler.Instance->DR;
                SPI_COM_RxBuff[SPI_COM_Cmd.RxCounter] = TMP_RxData;
                SPI_COM_Cmd.RxCounter++;               
        }
       

       
        if(tmp1& SPI_SR_OVR )
        {
                TMP_RxData = SPI_COM_Handler.Instance->DR;
                tmp1 = SPI_COM_Handler.Instance->SR;
                SPI_COM_Handler.Instance->SR = tmp1 |(~SPI_SR_OVR);
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。