lrqblack 发表于 2022-9-14 08:39:40

STM32使用SPI中断发送,一段时间后不进中断,大哥们帮我看看

坛友们,我在工程里添加了一个简单的SPI功能,只需要40ms向外发送一个3000字节的数组,但发送的时候总是一开始能发,之后在几分钟左右的时间内停止发送,程序还能执行到HAL_SPI_Transmit_IT(&hspi4,&array,3000);,但SPI中断并不会再进,我现在就是判断它一旦停止发送,就重新进行一次SPI初始化,就又能发送了。用示波器抓了时钟线的波形,15Mbit/s,和实际配置SPI速率一致,波形还行,几分钟后波形突然停止,这应该是软件上的问题吧。
我的程序跑了UCOSIII,开了一些优先级更高的中断,但我觉得SPI被打扰后不是该回来继续执行吗?怎么就永久罢工了呢?
请各位坛友们帮我看看是什么问题导致的SPI中断发送异常,谢谢!

/*SPI部分配置代码,如下*/
hspi4.Instance = SPI4;                                                                                                       
hspi4.Init.Mode = SPI_MODE_MASTER;                                                                       
hspi4.Init.Direction = SPI_DIRECTION_2LINES;                                               
hspi4.Init.DataSize = SPI_DATASIZE_8BIT;                                                                       
hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;                                                       
hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;                                                               
hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;                                                                               
hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;       
hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;                                                                       
hspi4.Init.TIMode = SPI_TIMODE_DISABLE;                                                                       
hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;               
hspi4.Init.CRCPolynomial = 0x0;                                                                                                       
hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;                                                       
hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;                                       
hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;                       
hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;                                                                 
hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;                 
hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;                                         
hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;                                         
hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;                                                                                                                                 

/*SPI中断服务函数*/
void SPI4_IRQHandler(void)
{
//OSIntEnter();

HAL_SPI_IRQHandler(&hspi4);

//OSIntExit();
}

/*SPI发送代码仅用一行*/
HAL_SPI_Transmit_IT(&hspi4,&array,3000);//40ms调用一次,一次发送3000字节



yuyu87 发表于 2022-9-14 08:48:09

SPI发生了错误,清除错误即可,检查 一下状态寄存器

2nd 发表于 2022-9-14 09:22:44

把发送间隔临时改大些,也许是时序问题。

lrqblack 发表于 2022-9-14 09:45:56

yuyu87 发表于 2022-9-14 08:48
SPI发生了错误,清除错误即可,检查 一下状态寄存器
(引用自2楼)

按您说的,我监控了SPI寄存器,发现SPI状态寄存器32位突然全部置0,进行一次SPI初始化后可恢复,老哥请问为什么SPI会发生如此频繁的异常?明明只是一个最基本的中断发送。

denike 发表于 2022-9-14 15:51:09

发送3000字节这么多数据,直接使用DMA发送比SPI中断方便吧
页: [1]
查看完整版本: STM32使用SPI中断发送,一段时间后不进中断,大哥们帮我看看