打印
[综合信息]

SPI 从机 DMA 模式 配置(不能正常接收问题处理)

[复制链接]
5627|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nawu|  楼主 | 2021-9-1 12:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近有个需求是需要使用 华大 MCU(HC32F460) 的 SPI 作为从机来接收数据,无奈搞了两天死活不可用。配置完 SPI 的从机模式后,只要启动主机端的发送就出现如下图所示的错误:

下面是 SPI 主机发送数据的时序图(黄色为 CS,绿色为 CLK):

比较特殊的是,SPI 主机要求只发送数据,不进行接收(主机只有数据输出引脚)! 这就要求在从机 SPI 可以不发送数据,节省一个 MCU 的 IO。正是这一点,导致我在配置从机 SPI 时掉入了坑里(从机 SPI 只配置了接收!!!)。下面我们重点说一说我的经历,让大家少进坑。

使用特权

评论回复
沙发
nawu|  楼主 | 2021-9-1 12:58 | 只看该作者
从机模式

  无论是用了多年的 STM32 系列 ,还是切换后的华大 MCU 系列,SPI 从机模式本次是第一次使用。也因此,我对于从机 SPI 的配置也不是很了解。首先,去手册中查找从机 SPI 的相关介绍:

也不是很了解。首先,去手册中查找从机 SPI 的相关介绍:


HC32F460 的 SPI 支持 4 线式 SPI 模式和 3 线式时钟同步运行模式,这里我需要使用 4 线式 SPI 运行模式。至于 3 线时钟同步运行模式,感兴趣的自行去看手册。


标准里的 SPI 3 线制不是指的 MOSI 和 MISO 合并一个么?和华大手册里的 3 线制不是一个东西啊


从机模式时使用 MOSI 接收,MISO 发送


上图中红色圈出来的地方需要注意,根据我的试用,从机模式下也有欠载错误检测。



使用特权

评论回复
板凳
nawu|  楼主 | 2021-9-1 12:59 | 只看该作者
从机 SPI 配置

  在看了手册的相关介绍之后,接下来就是实际写代码进行配置了。SPI 的配置还是比较简单的,我这里使用了 DMA 进行接收数据。我们直接调用库函数即可。如下:

在配置 IO 的时候,我这里不配置 MISO,因为我的需求里面不需要从机发送。


配置复用之前,我先把 IO 配成输入,且带上拉。这主要是为了保证 IO 的初始电平。这个与硬件设计有关!


举个例子:对于串口,协议规定默认的电平为高电平。如果硬件没有配置上拉,则我们必须先把 IO 配置带上拉,否则可能导致无法接收数据


注意上面的红色框中的代码,这个是用来发送数据的!在一开始配置时,我并没有配置发送 DMA,因为我一直认为作为从机,我不需要发送数据,自然我也不需要配置 SPI 的发送,所以在最初的配置中没有上图中红色框中的内容。这就导致陷入了**开始说的误区。



使用特权

评论回复
地板
nawu|  楼主 | 2021-9-1 13:00 | 只看该作者
分析总结

  HC32F460 的 SPI 从机模式并没有只接收这种配置(ST的 SPI 可以配置仅接收),这就意味着,不管我们用不用 SPI 从机发送功能,都必须要配置发送。


如果不使用发送,则可以不去配置 SPI 从机发送引脚(MISO),节省出来的 IO 可以作为普通 IO 去使用。


  在不使用发送功能时,配置的发送可以根据需要发送任意一个字节即可。例如,上面我的 DMA 发送中,仅仅就是循环发送一个字节 00。否则将导致本文开篇截图的欠载错误!我的理解是,因为 HC32F460 不能配置单独接收(对比 STM32 系列的 SPI 可以配置 仅接收、仅发送等模式),所以默认从机是收发都启用(工作)的状态。



  根据手册的说明,在产生欠载错误后,会主动停止 SPI,因此实际使用中,需要处理欠载错误等异常的情况!而且,MCU 并没有提供关闭这个错误检测的配置项!!!因此,一旦出错或者说 DMA 停止了发送,这必然导致出现上面的错误!!


使用特权

评论回复
5
bcrachel| | 2021-9-2 09:29 | 只看该作者
可以加精了,感谢楼主

使用特权

评论回复
6
琢华| | 2021-10-16 16:30 | 只看该作者
本帖最后由 琢华 于 2021-10-29 15:57 编辑
nawu 发表于 2021-9-1 13:00
分析总结  HC32F460 的 SPI 从机模式并没有只接收这种配置(ST的 SPI 可以配置仅接收),这就意味着,不 ...

顶顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3307

帖子

3

粉丝