工程文件参考——STM32+HAL+SPI主从机通讯

news2025/1/13 13:32:10

文章目录

  • 前言
  • CubeMX设置
    • SPI设置
    • NSS设置
  • SPI从机代码
  • SPI主机代码


前言

关于如何简单的写一个稳定的SPI主从机通讯,思路很简单
1、SPI高速传输的时候很容易出现错位之类的问题,CRC的校验首先是必要的。在STM32中SPI使用DMA通讯可以自动执行CRC的校验,只需要在CubeMX设置SPI的CRC和DMA
2、从机的NSS用硬件模式不是很好用,使用外部中断可以提供更多灵活的编写方式
3、有个很坑的点,如果中间出现断连等问题,很容易出现数据错位,而且错了一次会一直错下去,所以检测到CRC错误后要自己将SPI模块的时钟重置


CubeMX设置

SPI设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我选的16bit传输,具体可以根据自己的硬件需求再改

NSS设置

选一个引脚做外部中断触发,上下沿都要
在这里插入图片描述
注意这个代码生成后要手动在gpio.c文件中把HAL_NVIC_EnableIRQ(XXX);给屏蔽掉,不然刚开机这个端口就开始跳中断,提前跑了一些不该跑的,会出一些比较操蛋的错误

SPI从机代码

放在哪里都行

//下降沿触发接收分析,校验数据是否正确
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)//虚函数定义,HAL库会自动调用过来
{
	if(GPIO_Pin == SPI1_NSS_Pin)
	{
		if((HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_READY) && HAL_SPI_GetError(&hspi1) == HAL_SPI_ERROR_NONE)
		{
			//数据正确,执行数据搬运
		}
		else//数据错误,重置SPI时钟
		{
			HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);//注意改成自己的触发源
			HAL_SPI_DMAStop(&hspi1);
			__HAL_RCC_SPI1_FORCE_RESET();
			__HAL_RCC_SPI1_RELEASE_RESET();
			//HAL_SPI_DeInit(&hspi1);
			HAL_SPI_Init(&hspi1);
			HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
		}
	}
}
//上降沿触发准备接收
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == SPI1_NSS_Pin)
	{
		HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t*)spi1_tx_buf, (uint8_t*)spi1_rx_buf, 4);//1-2us
	}
}

SPI主机代码

主机直接定时跑就够了

HAL_GPIO_WritePin(GPIOX, GPIO_PIN_X, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t*)spi1_tx_buf, (uint8_t*)spi1_rx_buf, 4);
HAL_GPIO_WritePin(GPIOX, GPIO_PIN_X, GPIO_PIN_SET);

CRC校验会自动在DMA传输完后自动再传输

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由器原理和静态路由配置

一、路由器的工作原理 根据路由表转发数据 接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口 二、路由表的形成 它是路由器中维护的路由条目的集合,路由器根据路由表做路径选择,里面记录了网段ip地址和对应下一跳接口的接口号。…

人工智能实训室建设的必要性

在当今科技迅猛发展的时代,人工智能(AI)已不再局限于科幻电影的虚构情节,而是作为一股颠覆性力量,深刻影响着全球经济、社会乃至文化的发展。随着《新一代人工智能发展规划》等政策的出台,中国已明确将人工…

RA6M5——GPIO

文章目录 GPIO输入输出RASC图形化配置输出模式:输入模式:配置选项: 接口函数实例代码: GPIO输入输出 RASC图形化配置 输出模式: 输入模式: 配置选项: 配置项取值/描述Model “Input mode”&a…

疾病防控|基于springBoot的疾病防控综合系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 在如今社会上,关于信息上面的处理,没有任何…

离线安装bitnami-gitlab8.8.4+汉化

注意: 常规安装gitlab需要联网,而按装bitnami-gitlab无需联网(bitnami-gitlab用于内网环境无法联网时安装gitlab,两者是一个东西只是名字不一样)bitnami-gitlab-8.8.4版本可以汉化成功新用户注册账户无需激活也可以直接登录,因为…

thingsboard3.8的运行使用——设备管理与遥感数据测试

1、首先增加设备配置,如下: 建立一个定位器的设备,临时先用默认规则链,不过正常应该建立单独的定位器规则链 传输配置如下: 使用MQTT协议,相应的topic采用默认的方式 这里告警先不设置,后续到…

十二、数据库其他调优策略

文章目录 1. 数据库调优的措施1.1 调优的目标1.2 如何定位调优问题1.3 调优的维度和步骤1.3.1 选择合适的DBMS1.3.2 优化表设计1.3.3 优化逻辑查询1.3.4 优化物理查询1.3.5 使用 Redis 或 Memcached 作为缓存1.3.6 库级优化2. 优化MySQL服务器2.1 优化服务器硬件2.2 优化MySQL的…

Piktures 2.17 | 高效相册管理工具

Piktures是一款专注于简洁、高效、隐私保护的安卓相册管理应用。凭借其简洁美观的用户界面、强大的功能和出色的隐私保护能力,已成为众多安卓用户的首选工具。支持云存储同步、多样化的文件管理方式、安全保险箱以及无广告的纯净体验,不仅提高了用户的管…

使用IDEA和vecode创建vue项目并启动

一、使用IDEA创建Vue项目 一、打开IDEA下载Vue插件 打开IDEA的设置找到插件并查找到下载Vue.js这个插件 二、用IDEA创建Vue项目 新建项目并选择到Vue生成器 我这是IDEA自带的 创建项目非常迅速 端口号(默认):5173 版本是3.x 启动项目…

Linux,busybox构建根文件,详细讲如何,配置etc/init.d/rcS*,etc/rc.d/rc*.d,inittab,fstab(二)

上面一篇,etc/init.d/rcS,inittab,fstab,讲的稍微不够仔细 一、BusyBox简介 在构建根文件系统之前,我们先来看一下根文件系统里面大概都有些什么内容,以Ubuntu为例,根文件系统的目录名字为‘/…

数据库实验3视图

10-1 创建视图计算学生课程平均分 现有一个学生数据库,内包含学生表(Student)、课程表(Course)和选修表(SC)。 在每一学年,学生处需要统计每位学生的学习情况,以便进行…

sicp每日一题[2.45]

Exercise2.45 r i g h t − s p l i t right-split right−split and u p − s p l i t up-split up−split can be expressed as instances of a general splitting operation. Define a procedure s p l i t split split with the property that evaluating (define right-…

探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』

文章目录 摘要引言智能体介绍和亮点展示介绍亮点展示 如何制作智能体可能会遇到的几个问题快速调优指南总结未来展望 摘要 本文将详细介绍如何使用智能体平台开发一款名为“小众旅游探险家”的旅游智能体。通过这款智能体,用户可以探索冷门旅游路线和独特的旅行体验…

Element-ui官方示例(Popover 弹出框)

Element-ui官方示例(Popover 弹出框),好用的弹出框。 使用 vue-cli3 我们为新版的 vue-cli 准备了相应的​Element 插件​,你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模版&#…

Pastemate:从高效复制到精准倒数日,重塑时光体验

下载地址:PasteMatePasteMatehttp://119.45.216.236/ 在信息如潮奔涌的时代,复制粘贴工具 Pastemate 早已成为我们得力的助手。如今,它更是大胆创新,融入倒数日功能,宛如一场科技与生活的奇妙交融,即将开启…

大商创(移动端) -- day01

插件:npm i axios less less-loader vue-router3 amfe-flexible postcss postcss-pxtorem vant2 移动端的适配 使用 postcss postcss-pxtorem 这个插件是用来把px转换成rem 使用amfe-flexible 插件兼容不同设备 使用步骤 1.下载这两个插件 2.在mian.js中引入 …

Rust 语言持续崛起,即将冲击 TIOBE 指数前十,能否成为编程语言新王者?

Rust 语言持续崛起,即将冲击 TIOBE 指数前十,能否成为编程语言新王者? 2024 年 10 月,全球编程语言 TIOBE 排行榜再次更新,各大编程语言在各自领域中继续发挥着独特的优势。官方的标题是: Rust排名稳步攀升…

自监督行为识别-时空线索解耦(论文复现)

自监督行为识别-时空线索解耦(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 自监督行为识别-时空线索解耦(论文复现)引言论文概述核心创新点双向解耦编码器跨域对比损失的构建结构化数据增强项目部署准备工作数据…

GDB基本使用指南

什么是 GDB? GDB(GNU Debugger)是一个强大的调试工具,主要用于调试 C、C 和其他语言编写的程序。 它让我们可以监控、控制程序的执行,从而查找并修复错误。 安装 GDB ubuntu上一条命令可以搞定: sudo …

STM32-ADC模数转换

一、概述 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间输入电压范围:0~3.3V&#xff…