华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)
最近有个需求是需要使用 华大 MCU(HC32F460) 的 SPI 作为从机来接收数据,无奈搞了两天死活不可用。配置完 SPI 的从机模式后,只要启动主机端的发送就出现如下图所示的错误:
下面是 SPI 主机发送数据的时序图(黄色为 CS,绿色为 CLK):
比较特殊的是,SPI 主机要求只发送数据,不进行接收(主机只有数据输出引脚)! 这就要求在从机 SPI 可以不发送数据,节省一个 MCU 的 IO。正是这一点,导致我在配置从机 SPI 时掉入了坑里(从机 SPI 只配置了接收!!!)。下面我们重点说一说我的经历,让大家少进坑。
从机模式
无论是用了多年的 STM32 系列 ,还是切换后的华大 MCU 系列,SPI 从机模式本次是第一次使用。也因此,我对于从机 SPI 的配置也不是很了解。首先,去手册中查找从机 SPI 的相关介绍:
HC32F460 的 SPI 支持 4 线式 SPI 模式和 3 线式时钟同步运行模式,这里我需要使用 4 线式 SPI 运行模式。至于 3 线时钟同步运行模式,感兴趣的自行去看手册。
标准里的 SPI 3 线制不是指的 MOSI 和 MISO 合并一个么?和华大手册里的 3 线制不是一个东西啊
- 从机模式时使用 MOSI 接收,MISO 发送
- 上图中红色圈出来的地方需要注意,根据我的试用,从机模式下也有欠载错误检测。
从机 SPI 配置
在看了手册的相关介绍之后,接下来就是实际写代码进行配置了。SPI 的配置还是比较简单的,我这里使用了 DMA 进行接收数据。我们直接调用库函数即可。如下:
- 在配置 IO 的时候,我这里不配置 MISO,因为我的需求里面不需要从机发送。
配置复用之前,我先把 IO 配成输入,且带上拉。这主要是为了保证 IO 的初始电平。这个与硬件设计有关!
举个例子:对于串口,协议规定默认的电平为高电平。如果硬件没有配置上拉,则我们必须先把 IO 配置带上拉,否则可能导致无法接收数据
- 注意上面的红色框中的代码,这个是用来发送数据的!在一开始配置时,我并没有配置发送 DMA,因为我一直认为作为从机,我不需要发送数据,自然我也不需要配置 SPI 的发送,所以在最初的配置中没有上图中红色框中的内容。这就导致陷入了文章开始说的误区。
分析总结
HC32F460 的 SPI 从机模式并没有只接收这种配置(ST的 SPI 可以配置仅接收),这就意味着,不管我们用不用 SPI 从机发送功能,都必须要配置发送。
如果不使用发送,则可以不去配置 SPI 从机发送引脚(MISO),节省出来的 IO 可以作为普通 IO 去使用。
在不使用发送功能时,配置的发送可以根据需要发送任意一个字节即可。例如,上面我的 DMA 发送中,仅仅就是循环发送一个字节 00。否则将导致本文开篇截图的欠载错误!我的理解是,因为 HC32F460 不能配置单独接收(对比 STM32 系列的 SPI 可以配置 仅接收、仅发送等模式),所以默认从机是收发都启用(工作)的状态。
根据手册的说明,在产生欠载错误后,会主动停止 SPI,因此实际使用中,需要处理欠载错误等异常的情况!而且,MCU 并没有提供关闭这个错误检测的配置项!!!因此,一旦出错或者说 DMA 停止了发送,这必然导致出现上面的错误!!
参考
- HC32F460系列用户手册Rev1.21.pdf
- HC32F460 驱动库示例代码
还没有评论,来说两句吧...