发布时间:2026/9/4 13:37:29
复旦微FM33 MCU 底层开发指南——SPI 前言本系列基于复旦微FM33LC0系列MCU的DataSheet编写提供基于寄存器开发指南、应用技巧、注意事项等本文章及本系列其他文章将持续更新本系列其它文章请跳转↓↓↓复旦微FM33 MCU 底层开发指南——总集篇本文章最后更新日期2026/09/03文章目录前言GPIO配置SPI配置1. SPI的寄存器2. SPI的时钟3. SPI的工作模式3.1 主机和从机3.2 单发送模式和单接收模式3.3 工作模式3.4 片选控制4. SPI的时序控制4.1 时钟极性和时钟相位4.2 MISO的时序4.3 SPI两帧之间的时间间隔4.4 SPI帧格式5. SPI的复位SPI发送接收1. SPI的状态标志位2. 等待标志位发送或接收3. 使用中断发送或接收4. 通过DMA发送或接收注意事项1. SPI单接收模式通过DMA接收数据多产生两个时钟周期2. SPI从机模式的注意事项GPIO配置要使用SPI功能需要将使用的引脚配置为数字功能写GPIO寄存器时要注意打开GPIO时钟。有的引脚需要配置额外数字功能寄存器DFS详见GPIO章节【复旦微FM33 MCU 外设开发指南】外设篇1——GPIO通常我们会将MISO、MOSI和CLK引脚配置为数字功能而将CS引脚配置为GPIO输出功能以实现软件片选。可以在SPIx-CR1寄存器中交换MOSI和MISO引脚。SPI配置1. SPI的寄存器SPIx-CR1控制寄存器1用于选择SPI主机/从机、SPI时钟、信号时序SPIx-CR2控制寄存器2用于控制SPI使能、数据字长配置、片选配置SPIx-CR3控制寄存器3用于清空发送缓冲区、清空接收缓冲区、清除错误标志SPIx-IER中断使能寄存器用于发送中断、接收中断、错误中断的使能和关闭SPIx-ISR中断标志寄存器用于SPI BUSY标志、接收缓冲区满标志、发送缓冲区满标志、错误标志等的读取SPIx-TXBUF发送缓冲区用于单次发送数据时写入通过DMA传输的话会自动写入SPIx-RXBUF接收缓冲区用于单次读取数据时写入通过DMA传输的话会自动读取2. SPI的时钟要使用SPI要在RCC-PCLKCR3寄存器中开启SPI外设的时钟使能。SPI外设挂载在APB总线上因此要调整SPI外设的工作时钟可以通过对APBCLK预分频也可以调整SPI的预分频。有关时钟的配置详见【复旦微FM33 MCU 外设开发指南】系统篇——时钟FM33LC0 SPI外设的预分频在SPIx-CR1寄存器中配置最高为APBCLK的二分频3. SPI的工作模式3.1 主机和从机SPI的时序由主机产生。FM33LC0 SPI外设的主机/从机模式选择在SPIx-CR1寄存器中配置注有关Slaver模式有一些注意事项详见文末章节。3.2 单发送模式和单接收模式SPI是全双工通讯因此在读取数据的时候也必须发送数据以产生时钟信号。但我们使用的过程中一般是异步的。比如从一块SRAM中读取数据只需发送一个命令帧告诉SRAM要从哪里读读多长就可以了之后SRAM返回其中保存的数据这种时候主机每一帧发送的数据是无效的。单发送和单接收就可以应用在类似的场景中。可以在SPIx-CR2寄存器中使能或关闭单发送模式/单接收模式。3.3 工作模式可以在SPIx-CR2寄存器中控制SPI的工作模式。SPI有很多种工作模式常用四线全双工模式除此之外有四线半双工一个MISO/MOSI引脚用于区分命令帧和数据帧和三线半双工删除一个MISO/MOSI引脚等四线半双工常见的应用就是SPI显示屏3.4 片选控制可以在SPIx-CR2寄存器中控制片选。当然我日常喜欢使用软件片选而且不通过寄存器去改变片选状态而是将引脚配置为GPIO输出模式写GPIOx-DO寄存器来改变其引脚状态。4. SPI的时序控制4.1 时钟极性和时钟相位SPI时序控制最基本的即为时钟极性和时钟相位SPI的主机和从机应配置为相同的时钟极性和时钟相位。一般MCU作为SPI的主机使用从机的时钟极性和时钟相位一般是固定死的根据从机的DataSheet要求配置即可。FM33LC0 SPI外设的时钟极性和时钟相位在SPIx-CR1寄存器中配置4.2 MISO的时序除了时钟极性和时钟相位还可以在SPIx-CR1寄存器中调整MISO的时序4.3 SPI两帧之间的时间间隔SPI传输时接上示波器可以观察两个时钟周期之间有时间间隔。1.如果是多次的单次传输直接向TXBUF中写入数据然后启动SPI传输那么这个时间间隔主要是软件等待标志位产生的2.如果是通过DMA的连续传输那么这个时间间隔会变得很短。我们用SPI来和显示屏通讯会发现使用DMA的刷屏速率会比不用DMA快很多主要是省下了大量的两帧之间的时间间隔。可以在SPIx-CR1寄存器中调整SPI的两帧数据之间的等待时间。但我认为这个只对DMA传输影响显著因为多次的单次传输SPI两帧的时间间隔实在是太久了4.4 SPI帧格式可以在SPIx-CR2寄存器中调整SPI单帧的传输字长。可以在SPIx-CR1寄存器中调整SPI的帧格式为大端或者小端。5. SPI的复位SPI2的复位在RCC-AHBRSTCR1寄存器中。SPI1的复位在RCC-AHBRSTCR2寄存器中。注意这里的复位不是说写1就复位了复位好了之后要写0取消复位。SPI发送接收1. SPI的状态标志位SPI的状态标志位在SPIx-ISR寄存器中查询。虽说这个寄存器叫中断状态标志位但没开启中断的时候这个标志位也会置位只是不响应中断罢了。SPIx-ISR寄存器中常用的三个标志位RXBF和TXBE标志位对应SPIx-IER寄存器中可以开启的接收完成中断和发送完成中断即开启中断后如果TXBE和RXBF置位就会进入中断服务函数在中断服务函数中可以判断中断来源。那RXBF和TXBE什么时候置位根据描述来看是接收缓存满或者发送缓冲区空的时候。但必须注意接收缓存满不代表接收完成发送缓冲区空也不代表发送完成。通过文首结构框图可以看到不仅有发送/接收缓冲区也有发送/接收移位寄存器。在写入SPIx-TXBUF后数据会从SPIx-TXBUF传入发送移位寄存器中这时SPIx-TXBUF空并置位TXBE标志进入中断服务函数。但这时发送移位寄存器的值还没有发送出去。BUSY标志位才能代表当前是否有数据传输只有在移位寄存器空才会清零BUSY标志位代表SPI当前没有数据传输如果没有意识到这点在写软件的时候会经常遇到一些错误比如接收数组里没有最后一帧。2. 等待标志位发送或接收在发送时向SPIx-TXBUF寄存器写入然后等待BUSY标志在接收时向SPIx-TXBUF寄存器写入任意数据因为SPI是全双工然后等待BUSY标志读取SPIx-RXBUF多字节的发送/接收就是重复这个过程。这种方式最简单缺点是效率很低而且软件死等的方式在软件开发中很危险如果等不到标志程序就死在那里了除非看门狗复位。3. 使用中断发送或接收在发送时使能发送中断向SPIx-TXBUF寄存器写入在中断服务函数中等待BUSY标志为0即为发送完成如果还要继续写入数据在中断服务函数中可以不等待BUSY标志为0直接向SPIx-TXBUF写入以实现连续的发送。当然进入中断之后要判断产生中断的原因是发送完成中断、接受完成中断还是错误中断。4. 通过DMA发送或接收这里DataSheet上写的很好不做过多阐述。注意事项1. SPI单接收模式通过DMA接收数据多产生两个时钟周期应用场景主机使用单发送模式向从机发送命令字节随后开启单接收模式通过DMA接收从机回发数据问题描述用示波器看波形会发现多了两个时钟周期配置spi字长为8bit就会多出两个8bit时钟配置spi字长为16bit就会多出两个16bit时钟调试记录1.收到的数据无误2.使能SPI后时钟线立刻产生了两个时钟周期因此和DMA无关可能是SPI单接收模式的问题3.如SPI不使用单接收模式而使用全双工接收数据相同情况下时钟线不会产生两个时钟周期。确认是单接收模式的问题推测原因在分析原因之前重复一下SPI外设的特性SPI是全双工通信主机即使只接收数据也要向TX缓冲区写数据时钟产生并开启传输。即使将SPI配置为单接收模式也是SPI外设自动向TX缓冲区填写数据时钟产生并开启传输SPI外设有缓冲区和移位寄存器从机返回的数据将先进入移位寄存器再进入接收缓冲区。在接收缓冲区非空的时候移位寄存器的数据是无法进入接收缓冲区的。因此如果主机接收缓冲区读的不及时接收缓冲区非空移位寄存器无法写入接收缓冲区则SPI传输中止时序由主机提供根据以上特性可以分析出原因当读取完一组数据后SPI还在单接收模式中继续往TX缓冲区填写数据因此继续产生时钟有时钟就有接收到的数据如果从机不响应则接收到的就是全0但是SPI主机没有继续读取RX缓冲区的数据因为已经收到了设定长度的数据导致RX缓冲区满进而导致移位寄存器无法写入接收缓冲区。因此多出的第一个时钟周期的数据在接收缓冲区中第二个时钟周期的数据在移位寄存器中最终因为移位寄存器满而停止传输解决办法在DMA传输下不使用单接收模式使用全双工模式。这是因为DMA接收时会自动写TXBUF不需要再配置单接收模式。2. SPI从机模式的注意事项手册对从机模式基本没有相关描述故以下内容都是靠调试得出的结论必须连接对应的硬件片选引脚时钟频率实测最高16MHz而非手册写的最大波特率在通过DMA发送的时候或许也应该打开DMA接收通道

相关新闻

2026/9/4 13:37:29

EG8030三相逆变器设计:SPWM控制与硬件实现详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 13:37:29

把微信聊天记录导出成文件:WeChatMsg 从零到出结果的完整流程

把微信聊天记录导出成文件:WeChatMsg 从零到出结果的完整流程 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…

2026/9/4 13:37:29

安卓APP逆向进阶:动态调试、算法还原与协议破解实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 14:27:34

Pixelle-Video:从一句话到成片的 AI 短视频生成路径

Pixelle-Video:从一句话到成片的 AI 短视频生成路径 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 周五下班前要交 7 条 60…

2026/9/4 14:27:34

双目相机标定与排查全攻略:从开箱到高精度测距

双目相机买回来,很多人第一件事就是接上电、打开官方SDK,看到深度图出来了就欢呼“能用了”。但真到项目里一较真,误差大到怀疑人生。我的看法很明确:开箱即用的双目相机基本不存在,没有做过标定和排查,深度…

2026/9/4 14:27:34

Python+OpenCV实战:从零构建视频移动目标检测与轨迹跟踪系统

简介:本资源是一个基于Python的轻量级视频目标跟踪实践项目,面向计算机视觉初学者与算法工程师,解决动态场景下移动物体的鲁棒检测与连续轨迹追踪问题。项目支持用户交互式框选目标,结合HOG特征提取与帧间匹配机制,在光…

2026/9/4 14:22:34

通用大模型能当门店陪练用吗?垂直 AI 陪练的选型岔路

选 AI 陪练时,很多老板会先冒出同一个念头:"现在 ChatGPT 这类通用大模型这么强,让它直接当陪练不就行了,为什么还要买专门的垂直产品?"这个念头很自然,但它把两件不同的事混成了一件事&#xff…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/4 0:00:58

STM32H743 SPI从机DMA双缓冲通信实战

简介:本资源是面向嵌入式开发工程师与STM32进阶学习者的SPI DMA双机通信从机端完整实现方案,聚焦STM32H743高性能Cortex-M7单片机在工业控制与高速数据交互场景下的从机通信开发痛点。压缩包含1355个文件,主体为599个C源码与321个头文件&…

2026/9/4 0:00:58

CPU开盖降温教程:20元成本让温度直降30度的原理与实践

最近很多朋友都在抱怨,自己的电脑一到夏天就变成"烤箱",玩游戏时CPU温度动不动就飙到90度以上,风扇噪音堪比直升机。更让人头疼的是,明明配置不错,却因为高温降频导致性能大打折扣。如果你也遇到了类似问题&…

2026/9/4 0:00:58

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验 App 14「运动场地预约」场地 Tab(Func1Tab),是整 App 交互最丰富的页面——场地横向切换 三色图例 渐变预约预览卡 快捷模板 今日场次 Grid(可选/已选/已满三态&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…