最近有个需求是需要使用 华大 MCU(HC32F460) 的 SPI 作为从机来接收数据,无奈搞了两天死活不可用。配置完 SPI 的从机模式后,只要启动主机端的发送就出现如下图所示的错误:

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

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

从机模式

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

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

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

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

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

从机 SPI 配置

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

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

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

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

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

分析总结

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

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

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

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

参考

  1. HC32F460系列用户手册Rev1.21.pdf
  2. HC32F460 驱动库示例代码

华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)相关推荐

  1. 华大 MCU 之三 时钟控制器(CMU)配置记录

      今天在新项目(MCU 为华大 HC32F460)中不再使用外部晶振,转而要使用 HC32F460 内部的 HRC,之前在使用外部晶振时,对华大 MCU 的时钟配置有过一些了解,但是,由于使用内部晶 ...

  2. STM32之SPI从机DMA例程

    #include "stm32f10x.h" /* RCC时钟配置 */ void RCC_config(void) {  ErrorStatus HSEStartUpStatus ...

  3. 华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑

    缘起   在最近的项目测试中发现,SPI 通信总是莫名其妙的失败,查看寄存器发现 SPI 已经被停止了.根据手册,SPI 在异常情况下会被强制停止(SPI 的使能为被清零),而根据波形显示通信过程没有 ...

  4. 基于SYSBIOS GIO接口的uart通信DMA模式

    基于SYSBIOS GIO接口的uart通信DMA模式(不定长接收) 硬件:TMS320C6748 (创龙开发板) bsp: bios_6_37_03_30 相对裸机版的Uart dma配置,SYSB ...

  5. 基于TI SYSBIOS GIO 接口封装的SPI DMA模式

    基于TI SYSBIOS GIO 接口封装的SPI DMA模式 硬件:TMS320C6748 (创龙开发板) bsp: bios_6_37_03_30 注意: DMA模式需要先使能EMDA3 TC/C ...

  6. ESP32学习笔记(20)——SPI(从机)接口使用

    一.SPI简介 SPI(Serial Peripheral Interface) 协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC.LCD ...

  7. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  8. SPI四种工作模式时序图

    1.SPI总线简介 SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种同步串行接口.它用于CPU与各种外围器件进行全双工.同步串 ...

  9. 华大 MCU 之四 使用问题记录

      在最近使用华大 MCU 时,遇到了不少坑,这里记录一下,以方便在以后升级驱动库!其中,有些问题仅仅是在由 ST 切换到 华大之后不太适于的问题,有些是驱动库的更改问题!   如果您发现我说的问题是 ...

最新文章

  1. 洛谷专题训练 ——【算法1-1】模拟与高精度
  2. 【GPU推荐】高性价比GPU平台,3090赶紧入手!(11.11种草狂欢)
  3. 南宁师范大学计算机与信息工程学院研究生,南宁师范大学计算机与信息工程学院(专业学位)职业技术教育保研...
  4. Linux笔记-inode基本概念
  5. linux脚本能轮循吗,通过Linux定时任务实现定时轮询数据库及发送Http请求
  6. JS-以鼠标位置为中心的滑轮放大功能demo1
  7. 【三十二】thinkphp之连接数据库、实例化模型
  8. 企业为什么需要BI决策系统?
  9. 使用videojs播放rtmp视频
  10. matlab里面求出两条曲线的交点问题
  11. 华为HCIE证书含金量
  12. 【树莓派】登入树莓派
  13. 批处理+Linux书籍+黑客编程+脚本攻防+逆向工程书籍+海量资源(pdf+chm电子书)
  14. 11、Altiris cms 7.0 系统监控
  15. 全网最精减、安装最简单、无头疼配置的Katago教程,大小才168M,职业水平,散仙订制版
  16. Python入门-Day5
  17. 前NASA气象学家洛夫洛克宣判地球死刑
  18. CS5268/CS5265/CS5266 Type-C转HDMI设计方案|替代CS5268/CS5265/CS5266芯片|GSV2201可完全替代兼容CS5268/CS5265/CS5266
  19. 以太网、令牌环、FDDI、ATM、WLAN
  20. OS - Bitcode App 瘦身中间码

热门文章

  1. 基于环信的仿QQ即时通讯的简单实现
  2. Postgresql 字符串操作函数
  3. 程序员Web面试之JSON
  4. 预测分析:R语言实现2.6 特征选择
  5. 视觉直观感受7种常用的排序算法
  6. OPMS项目管理系--新增加项目报表统计
  7. jQuery Lightbox图片放大预览
  8. 基础才是重中之重~.net中的显式事务与隐式事务
  9. SharePoint 2010 新体验7 - Managed Metadata (托管元数据)
  10. 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题