首页 文章

ST32 HAL SPI从机中断溢出

提问于
浏览
0

我对ST32F030和Slave SPI有困难

我正在尝试让它响应spi命令: -

Master发送0x05,slave响应7字节的数组 . 它第一次工作,但然后失去同步,并设置OVR位 . 我无法弄清楚为什么 .

下面是代码: -

int main(void)
{
   HAL_Init();
   /* Configure the system clock */
   SystemClock_Config();
   /* Initialize all configured peripherals */
   MX_SPI1_Init();
   spi_init();

   while (1)
   {
      HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
   }
}

/* 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;
   /* SPi priority interrupt configuration */
   HAL_NVIC_SetPriority(SPI1_IRQn, 1, 1);
   if (HAL_SPI_Init(&hspi1) != HAL_OK)
   {
      Error_Handler();
   }
}


void spi_init()
{
      HAL_SPI_Receive_IT(&hspi1, spiData, 1);
}

void SPI1_IRQHandler(void)
{
   HAL_SPI_IRQHandler(&hspi1);
}

uint8_t spiData[8];
uint8_t edgesmsg[7];

void spi_interrupt()
{
   uint8_t c;

   c = spiData[0];
   if ( c == 0x05)
      HAL_SPI_Transmit(&hspi1, edgesmsg, 7, 1000);
}

任何建议都感激不尽

1 回答

  • 0

    你的问题是你一直试图从SPI读取而没有完成前面的操作,这就是你得到溢出的原因(OVR位) . 尝试更好地排序事物 .

    例如,从主循环中删除 HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1); ,然后在中断处理程序中调用它 . 代码应该是:

    int main(void)
    {
       HAL_Init();
       /* Configure the system clock */
       SystemClock_Config();
       /* Initialize all configured peripherals */
       MX_SPI1_Init();
       spi_init();
    
       while (1)
       {
          //Do not call HAL_SPI_Receive_IT here
          //HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
       }
    }
    
    
    
    void spi_interrupt()
    {
       uint8_t c;
    
       c = spiData[0];
       if ( c == 0x05)
       {
           HAL_SPI_Transmit(&hspi1, edgesmsg, 7, 1000);
       }
    
       //Re-enable interrupt to read next sequence
       HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
    }
    

    这是原则 . 在处理完数据包后重新启用中断 . 但是,我不确定您的意图是什么,您可能需要调整上述代码 .

    另请注意,任何中断处理程序都应尽可能快 . 因此,在中断处理程序 spi_interrupt 中调用 HAL_SPI_Transmit (轮询函数)并不是真的可以接受 . 您应该调用 HAL_SPI_Transmit_IT 或者根本不使用中断 . 在第一种情况下,请再次注意排序 .

相关问题