硬汉嵌入式论坛

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

[SPI/QSPI] 请教一下关于STM32H7 SPI DMA从接收数据问题。

[复制链接]

44

主题

564

回帖

701

积分

金牌会员

积分
701
发表于 2022-10-20 22:26:26 | 显示全部楼层 |阅读模式
请教一下关于STM32H7 SPI DMA从接收数据问题,STM32H7作为从机接收数据。跑freertos系统,就是这个从机spi应该在哪里接收数据,是在spi中断服务程序里调用 HAL_SPI_Receive_DMA 接收数据还是在任务里调用 HAL_SPI_Receive_DMA 接收数据。或是其他更好的方法。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-10-21 00:38:01 | 显示全部楼层
参考我们那个SPI从机例子V7-071_SPI DMA双机通信(从机)

中断函数有对应的传输完成回调函数HAL_SPI_TxRxCpltCallback,HAL_SPI_RxCpltCallback或者HAL_SPI_TxCpltCallback,里面设置个传输完成标志,或者直接调用FreeRTOS的FromISR结尾的消息同步API给你的任务发消息即可。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2022-10-21 09:27:45 | 显示全部楼层
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
 楼主| 发表于 2022-10-21 11:11:56 | 显示全部楼层
eric2013 发表于 2022-10-21 00:38
参考我们那个SPI从机例子V7-071_SPI DMA双机通信(从机)

中断函数有对应的传输完成回调函数HAL_SPI_TxRxC ...

好的,我试一下,我还是不太理解你说的这个意思,输完成回调函数这个是转完标示,就从机来说,SPI是不是需要调用接收函数 HAL_SPI_Receive_DMA 才能读到数据呢。
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
 楼主| 发表于 2022-10-21 11:12:25 | 显示全部楼层
王海靖 发表于 2022-10-21 09:27
看看我这个 https://club.rt-thread.org/ask/article/c91146d03f664cf5.html

好的,我学习一下,手头正好也有块ART-PI板子
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-10-21 14:47:26 | 显示全部楼层
ou513 发表于 2022-10-21 11:11
好的,我试一下,我还是不太理解你说的这个意思,输完成回调函数这个是转完标示,就从机来说,SPI是不是 ...

对于从机来说,调用你这个API即可。然后全部是SPI主机控制从机收发的。
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
 楼主| 发表于 2022-10-21 15:31:15 | 显示全部楼层
eric2013 发表于 2022-10-21 14:47
对于从机来说,调用你这个API即可。然后全部是SPI主机控制从机收发的。

对的,调试了一下,这个这个函数就是接收数据。HAL_SPI_RxCpltCallback是完成标示。调试了一下大致理解这个接收的流程。
现在就是想spi中断接收数据,然后在回调中发送消息通知任务拷贝数据。还没调试,不知道可行与否。
        void SPIx_IRQHandler(void)
        {
                HAL_SPI_IRQHandler(&hspi);
               
                HAL_SPI_Receive_DMA(&hspi, (uint8_t*)g_spiRxBuf, 4);
        }       

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
        xQueueSend(  xQueue,  &g_spiRxBuf,0);       
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-10-21 15:45:03 | 显示全部楼层
ou513 发表于 2022-10-21 15:31
对的,调试了一下,这个这个函数就是接收数据。HAL_SPI_RxCpltCallback是完成标示。调试了一下大致理解这 ...

对,就是这个思路,然后这个HAL_SPI_Receive_DMA(&hspi, (uint8_t*)g_spiRxBuf, 4);要放在任务里面执行一次就行了,执行一次,然后SPI主机发起一次操作,这个函数流程就走玩了,以后在用,再启动。
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
 楼主| 发表于 2022-10-21 16:45:27 | 显示全部楼层
eric2013 发表于 2022-10-21 15:45
对,就是这个思路,然后这个HAL_SPI_Receive_DMA(&hspi, (uint8_t*)g_spiRxBuf, 4);要放在任务里面执行一 ...

好的,谢谢,按这个来进行调试程序
回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2022-10-24 13:19:23 | 显示全部楼层
我这边的思路是使用CS 上升沿作为触发结束DMA接收,这个思路需要开辟比较大的接收缓存,立即启动DMA接收活动,CS上升沿作为结束标志
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 01:10 , Processed in 0.202931 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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