首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ST32 HAL SPI从中断中的溢出

ST32 HAL SPI从中断中的溢出
EN

Stack Overflow用户
提问于 2017-08-28 15:14:54
回答 1查看 4K关注 0票数 0

我在使用ST32F030和从属SPI时遇到了困难

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

主机发送0x05,从机以7字节数组响应。它在第一次工作,但后来失去了同步,并获得了OVR位设置。我不知道为什么。

以下是代码:-

代码语言:javascript
复制
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);
}

感谢您提出的任何建议

EN

回答 1

Stack Overflow用户

发布于 2017-08-30 20:36:35

您的问题是,您一直在尝试从SPI读取数据,而没有完成之前的操作,这就是出现溢出(OVR位)的原因。试着更好地排序。

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

代码语言:javascript
复制
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,或者根本不使用interrupt。在第一种情况下,要小心再次排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45913600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档