硬汉嵌入式论坛

 找回密码
 立即注册
查看: 431|回复: 13
收起左侧

[SPI/QSPI] STM32H523测试HAL_SPI_TransmitReceive_DMA会不进入中断

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-6-25 17:17:14 | 显示全部楼层 |阅读模式





在main循环里重复调用HAL_SPI_TransmitReceive_DMA发送接收两个字节,同时获取HAL状态,并将hspi1结构体添加到watch1查看,当循环进入到s != HAL_OK时,可见hspi1的状态和spi寄存器状态如图

其中hspi1的State状态为HAL_SPI_STATE_BUSY_TX_RX,这也是一直导致HAL状态为HAL_BUSY的原因,通过定位SPI的HAL库函数,目前我发现State需要在HAL_SPI_IRQHandler中切换为HAL_SPI_STATE_READY状态,因此我对HAL_SPI_IRQHandler函数打断点调试,发现会出现不触发中断的情况,因此HAL_SPI_IRQHandler自然无法运行并切换为HAL_SPI_STATE_READY状态。

我不太清除为什么会导致这个情况,是否有中断相关配置有冲突,或者SPI配置有问题


回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-6-25 17:48:35 | 显示全部楼层
main代码
[C] 纯文本查看 复制代码
  while (1)
  {
		HAL_StatusTypeDef s = HAL_SPI_Transmit_IT(&hspi1,a,2);
		if(s == HAL_OK){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		}
		if(s != HAL_OK){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		}
			
		//HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-6-25 17:49:59 | 显示全部楼层
然后关闭DMA,仅使用SPI中断方式HAL_SPI_Transmit_IT,中断触发也会有失败的时候,SPI配置
[C] 纯文本查看 复制代码
void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  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_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 0x7;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
  hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_LOW;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-26 09:55:19 | 显示全部楼层

回帖奖励 +2 个金币

Rosireity 发表于 2025-6-25 17:49
然后关闭DMA,仅使用SPI中断方式HAL_SPI_Transmit_IT,中断触发也会有失败的时候,SPI配置
[mw_shl_code=c ...

HAL库的SPI中断和DMA操作,正确姿势是在它的传输完成回调里面做标志,这个标志置位了,可以开启新的操作。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-6-27 15:25:01 | 显示全部楼层
eric2013 发表于 2025-6-26 09:55
HAL库的SPI中断和DMA操作,正确姿势是在它的传输完成回调里面做标志,这个标志置位了,可以开启新的操作 ...

不能信任HAL库的State状态切换吗。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-28 09:57:12 | 显示全部楼层
Rosireity 发表于 2025-6-27 15:25
不能信任HAL库的State状态切换吗。。

State变量状态有点乱,很多时候不知道那里开了,那里关闭了
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-6-30 10:36:48 | 显示全部楼层
eric2013 发表于 2025-6-28 09:57
State变量状态有点乱,很多时候不知道那里开了,那里关闭了

我用RxTxComplete的中断回调做了个标志位,代码如下
[C] 纯文本查看 复制代码
  while (1)
  {

		if(done){
		 HAL_SPI_TransmitReceive_IT(&hspi2,a,b,2);
			done=0;
		}
		if(s == HAL_OK){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		}
		if(s != HAL_OK){
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
		}

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

以上为主循环代码,GPIO是指示灯
[C] 纯文本查看 复制代码
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi){

	if(hspi == &hspi2){
		done = 1;
	}

}

以上为中断回调标志位操作。
这样测试下来,也会有中断不触发的情况,特别是全速运行,即标志位无法设置为1,我还是第一次遇到这种情况,很棘手,这个情况会跟硬件有关系吗。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-6-30 11:07:02 | 显示全部楼层
eric2013 发表于 2025-6-28 09:57
State变量状态有点乱,很多时候不知道那里开了,那里关闭了

我把spi的分频设置为256,并用逻辑分析仪捕捉了SCK的波形,发波数量是正常的,波形看着也没什么问题,但是就是会不触发中断。。

中断不触发前最后一个SCK波

中断不触发前最后一个SCK波

从上电到中断不触发停止发送的所有SCK波形

从上电到中断不触发停止发送的所有SCK波形
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-1 08:48:22 | 显示全部楼层
Rosireity 发表于 2025-6-30 10:36
我用RxTxComplete的中断回调做了个标志位,代码如下
[mw_shl_code=c,true]  while (1)
  {

可以把你SPI接口上目标芯片先去掉,什么芯片都不接的i情况下,这个函数也可以正常执行的。排除硬件问题
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-1 10:39:46 | 显示全部楼层
eric2013 发表于 2025-7-1 08:48
可以把你SPI接口上目标芯片先去掉,什么芯片都不接的i情况下,这个函数也可以正常执行的。排除硬件问题

已经测试,我将spi1和spi2的目标芯片全部去掉,分别测试,中断还是会不触发中断。因此我进一步关闭了SPI以外的外设来测试,我发现,如果我屏蔽了LPUART1、UART4、UART5三个串口的初始化,测试了5分钟,中断也是正常触发的,如果我打开任意一个串口的初始化,都会出现中断不触发的情况,但我只是用cubemx生成了三个串口的初始化,并没有使用它们。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-1 10:45:23 | 显示全部楼层
eric2013 发表于 2025-7-1 08:48
可以把你SPI接口上目标芯片先去掉,什么芯片都不接的i情况下,这个函数也可以正常执行的。排除硬件问题

这使我注意到前面也是调这个板子的I2C,如果我把串口初始化保留,I2C就经常死锁,然后我只初始化I2C的外设,去掉其他的外设,在主循环1ms间隔持续运行就基本没问题,当然因为没有使用标志位偶尔也会造成死锁问题,所以我决定跳过硬件I2C,用软件模拟,但结合现在的情况,应该是串口初始化对运行有干扰,这是三个串口的配置,dma和中断是没有打开的
微信图片_2025-07-01_104408_621.png
微信图片_2025-07-01_104426_904.png
微信图片_2025-07-01_104436_411.png
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-1 20:38:07 | 显示全部楼层
eric2013 发表于 2025-7-1 08:48
可以把你SPI接口上目标芯片先去掉,什么芯片都不接的i情况下,这个函数也可以正常执行的。排除硬件问题

硬汉你感兴趣吗,要是感兴趣我可以把板子寄给你,我准备换mcu了,搞不定
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-2 08:08:26 | 显示全部楼层
Rosireity 发表于 2025-7-1 20:38
硬汉你感兴趣吗,要是感兴趣我可以把板子寄给你,我准备换mcu了,搞不定

1、H5系列的HAL库肯定是有bug的,毕竟刚发布没多久,就是不知道你用的这些是否存在bug
2、H5系列我也不熟。如果是H7的话,可以帮你测测
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-2 08:26:27 | 显示全部楼层
eric2013 发表于 2025-7-2 08:08
1、H5系列的HAL库肯定是有bug的,毕竟刚发布没多久,就是不知道你用的这些是否存在bug
2、H5系列我也不 ...

好的,多谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 00:41 , Processed in 0.168866 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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