搜索
bottom↓
回复: 4

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

[复制链接]

出100入0汤圆

发表于 2022-9-14 08:39:40 | 显示全部楼层 |阅读模式
坛友们,我在工程里添加了一个简单的SPI功能,只需要40ms向外发送一个3000字节的数组,但发送的时候总是一开始能发,之后在几分钟左右的时间内停止发送,程序还能执行到HAL_SPI_Transmit_IT(&hspi4,&array[0],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[0],3000);//40ms调用一次,一次发送3000字节



出20入186汤圆

发表于 2022-9-14 08:48:09 | 显示全部楼层
SPI发生了错误,清除错误即可,检查 一下状态寄存器

出15入178汤圆

发表于 2022-9-14 09:22:44 | 显示全部楼层
把发送间隔临时改大些,也许是时序问题。

出100入0汤圆

 楼主| 发表于 2022-9-14 09:45:56 | 显示全部楼层
yuyu87 发表于 2022-9-14 08:48
SPI发生了错误,清除错误即可,检查 一下状态寄存器
(引用自2楼)

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

出0入0汤圆

发表于 2022-9-14 15:51:09 | 显示全部楼层
发送3000字节这么多数据,直接使用DMA发送比SPI中断方便吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 15:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表