[综合信息] SPI 从机 DMA 模式 配置(不能正常接收问题处理)

[复制链接]
6212|5
 楼主| nawu 发表于 2021-9-1 12:57 | 显示全部楼层 |阅读模式
最近有个需求是需要使用 华大 MCU(HC32F460) 的 SPI 作为从机来接收数据,无奈搞了两天死活不可用。配置完 SPI 的从机模式后,只要启动主机端的发送就出现如下图所示的错误:
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pDU2hvdUNTRE4=,size_16,color_FFFFFF,t_70.jpg
下面是 SPI 主机发送数据的时序图(黄色为 CS,绿色为 CLK):
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pDU2hvdUNTRE4=,size_16,color_FFFFFF,t_70.jpg
比较特殊的是,SPI 主机要求只发送数据,不进行接收(主机只有数据输出引脚)! 这就要求在从机 SPI 可以不发送数据,节省一个 MCU 的 IO。正是这一点,导致我在配置从机 SPI 时掉入了坑里(从机 SPI 只配置了接收!!!)。下面我们重点说一说我的经历,让大家少进坑。
 楼主| nawu 发表于 2021-9-1 12:58 | 显示全部楼层
从机模式

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

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


63778612f086ad268a.png

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


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


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


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



 楼主| nawu 发表于 2021-9-1 12:59 | 显示全部楼层
从机 SPI 配置

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

28967612f08857f623.png

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


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


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


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



 楼主| nawu 发表于 2021-9-1 13:00 | 显示全部楼层
分析总结

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


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


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


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


bcrachel 发表于 2021-9-2 09:29 | 显示全部楼层
可以加精了,感谢楼主
琢华 发表于 2021-10-16 16:30 | 显示全部楼层
本帖最后由 琢华 于 2021-10-29 15:57 编辑
nawu 发表于 2021-9-1 13:00
分析总结  HC32F460 的 SPI 从机模式并没有只接收这种配置(ST的 SPI 可以配置仅接收),这就意味着,不 ...

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

本版积分规则

73

主题

3308

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部