【SPI】STM32 SPI 双机通信,SPI从机模式使用

news2024/12/29 10:11:18

文章目录

    • 一、SPI主机配置
    • 二、SPI从机配置
    • 三、双机通信
      • 1 轮询+中断(低速)
      • 2 轮询+DMA(低速)
      • 3 DMA+DMA(高速)
      • 4 开启CRC校验(自选)
    • 四、遇到的问题
      • 1 高速使用时,程序卡死,或者数据出错(已解决)
      • 2 数据莫名其妙乱码,主机发送正常,接收乱码等

最近要用到STM32的SPI从机模式,从其他板子读SPI数据过来,踩了2天坑,记录一下过程。

(因为hal库提供了三种函数,我调试的过程是阻塞、中断、DMA依次来调试学习的,这份代码为使用DMA方式的代码。

软件:keil5、STM32CubeMX

硬件:两块STM32F103C8T6最小系统

实现功能:两块板子进行SPI通信,一主一从,都是使用的SPI1。

代码下载github:https://github.com/wyfroom/SPI_Master_Slave_STM32(第一次编程过程中使用git管理代码)

代码下载蓝奏云:https://wwzr.lanzout.com/b04885ouf 密码:372j

强调!!!!!!!!!!!强调!!!!!!!!!!!!强调!!!!!!!!!!!!!

如果你SPI通了,但是莫名其妙数据乱码、能发不能收等问题,啥都别干了,先把杜邦线换新,一共5根线,一根共地线,四根SPI线。

image-20230628105858537

一、SPI主机配置

基础的工程配置,这边就不贴图了,可以看这个有详细的步骤:http://t.csdn.cn/Wpcpk

image-20230627210413145

直接看spi的配置,主要注意以下几点:

  • SPI模式选择
  • 片选选择
  • 大端小端选择
  • 通信速率
  • 采样模式配置(CPOL、CPHA)
  • CRC选择

image-20230627211841705

如果要用SPI中断,要勾选中断。

image-20230627213345312

如果要用DMA,要对DMA进行配置。

image-20230627212414628

补充:片选还是要选,不然高速传输会出问题。

image-20230628091705132

二、SPI从机配置

从机配置仅模式选择和主机不同,其他都一样且必须一样。

image-20230627213119402

如果使用中断,要勾选:

image-2023062721311940123

DMA配置:(和主机一样)

image-20230627213520055

补充:片选还是要选,不然高速传输时会出问题。

image-20230628091658095

三、双机通信

HAL库提供了三种SPI调用方式。都试了一遍,最后还是选用了DMA,高效,简洁。

//阻塞方式使用SPI
HAL_SPI_Transmit()
HAL_SPI_Receive()
HAL_SPI_TransmitReceive()
//中断方式使用SPI
HAL_SPI_Transmit_IT()
HAL_SPI_Receive_IT()
HAL_SPI_TransmitReceive_IT()
//DMA方式使用SPI
HAL_SPI_Transmit_DMA()
HAL_SPI_Receive_DMA()
HAL_SPI_TransmitReceive_DMA()

image-20230627215942390

1 轮询+中断(低速)

主机轮询,从机中断。

这个我就不演示了,就正常流程,注意就行,在main里启动中断,在中断函数里再次启动中断。

//main里启动中断
HAL_SPI_TransmitReceive_IT(&hspi1, sendData, receiveData, 8);

//中断回调函数
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
  // 数据发送完成回调函数
	if (hspi == &hspi1)
	{
		HAL_SPI_TransmitReceive_IT(&hspi1, sendData, receiveData, 8);
	}
}

2 轮询+DMA(低速)

主机使用阻塞函数,从机使用DMA函数。(原因是我试了主从全部使用DMA的话,速度太快了,会卡死和数据传输乱码。解决啦,可以看问题一,这一部分还是演示轮询+DMA

主机:
image-20230628094249979

从机:
image-20230628094315973

debug测试:

image-20230628094523589

3 DMA+DMA(高速)

之前高速使用时出现了程序卡死和数据乱码的现象。(高速使用:用阻塞函数while里不加延时、主从都用中断、主从都用DMA)

解决方法如下:

  • 1 片选要开启。我直接把两个板子的硬件片选打开,两边都使用DMA方式全双工发送读取,数据不在乱码,只是接收到的第一个数据不一定是发送的第一个数据。
  • 2 从机要比主机先启动程序。 解决上一步数据顺序不对的问题。在主机DMA程序启动前加一个延时2s。

image-20230628092722959

image-20230628092806945

直接Debug:(模拟实际上电,debug先点从机启动,再点主机启动)

image-20230628093140796

4 开启CRC校验(自选)

CRC计算生成的校验值可以用于检测数据在传输或存储过程中是否发生了错误或损坏。
image-20230627220307966

开启CRC后,使用DMA函数的话,SIZE要加一:

HAL_SPI_TransmitReceive_DMA(&hspi1, sendData, receiveData, 8+1);

image-20230627220412238

四、遇到的问题

1 高速使用时,程序卡死,或者数据出错(已解决)

  • 主机中断模式发送,从机中断模式接收,不停的收发清空标志,数据就会乱,可能是传的太快了??想当于是全速的在收发? 非得主机用轮询的方式,间隔个1ms什么的来读取,那这SPI速度咋算的?

  • 主机DMA发,从机DMA收,直接死机,DMA中断被刷爆,while里的程序没机会执行,可以屏蔽掉DMA中断,程序不会在死机,但是,数据会乱。

    image-20230627215523991

  • 加了CRC好像要好一点,但还是很多乱码,碰运气碰好的。这能行吗?是SPI就不是这么用的吗?还是说这事高速传输的共性问题。

  • 终于解决

    • 1 片选要开启。我直接把两个板子的硬件片选打开,两边都使用DMA方式全双工发送读取,数据不在乱码,只是接收到的第一个数据不一定是发送的第一个数据。
    • 2 从机要比主机先启动程序。 解决上一步数据顺序不对的问题。在主机DMA程序启动前加一个延时2s。
    • 3 CRC,开不开没影响。

    image-20230628091658095

    image-20230628091705132

    image-20230628091830064

2 数据莫名其妙乱码,主机发送正常,接收乱码等

  • 杜邦线,真的会出问题的,换新,5根线,全部换新。再试试

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

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

相关文章

JavaScript 原型与原型链

所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法: Date 对象从 Date.prototype 继承。 Array 对象从 Array.prototype 继承。 所有 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。 JavaScript 对象有一个指…

【C#】代码解析--打印数据集

系列文章 【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…

LangChain:LLM应用程序开发(中)——文档问答、评估、Agents(代理)

文章目录 四、文档问答4.1 快速入门4.2 逐步实现4.3 其它方法 五、评估5.1 创建QA app5.2 生成测试数据点5.2.1 Hard-coded examples5.2.2 LLM-Generated examples 5.3 link chain debug手动评估5.4 LLM assisted evaluation5.5 LangChain Evaluation platform 六、Agents&…

704.二分查找

一、题目 二、代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int search(int* nums, int numsSize, int target) {int left 0;int right numsSize - 1;while (left < right) {int middle (left right) / 2;if (target > nums[middle]) {left m…

pip3 报错 distribution was not found and is required by the application

环境&#xff1a; centos 8 &#xff0c; pyhton3.6 背景&#xff1a; 升级python3.6 至 python3.10后&#xff0c; pip3安装包报错&#xff1a; pkg_resources.VersionConflict: (pip 21.2.4 (/usr/local/python3/lib/python3.10/site-packages), Requirement.parse(pip23.…

Linux:scp命令

1.介绍 scp命令是cp命令的升级版&#xff0c;即&#xff1a;ssh cp&#xff0c;通过SSH协议完成文件的复制。其主要的功能就是&#xff1a;在不同的Linux服务器之间&#xff0c;通过SSH协议互相传输文件。只要知晓服务器的账户和密码&#xff08;或密钥&#xff09;&#xff0c…

美光之后,韩国存储芯片也将成为输家,将损失千亿美元

美光很可能将完全丧失中国的企业市场&#xff0c;随着影响的扩大&#xff0c;韩国存储芯片或也将因美光的影响而蒙受巨大的损失&#xff0c;预计损失最高可能达到千亿美元&#xff0c;韩国存储芯片的老大地位也将因此动摇。 美光日前对媒体披露的数据指出因中国的安全审查&…

GitHub下的项目有pom.xml但右侧没有Maven问题

1.可以使用idea自带功能将pom.xml作为Maven导入 双击shift&#xff0c;输入Maven点击Add Maven Projects注意&#xff1a;在settings中将Maven先配置好&#xff0c;我使用的是自己设置的Maven仓库而不是idea自动部署在C盘的仓库

SQL Server数据库 -- 表的创建与管理

文章目录 一、数据表的组成二、创建数据表 表的创建表的查看表的增加表的修改表的删除、三、表的架构操作四、总结 前言 上次博客写到了数据库的创建与管理&#xff0c;但是创建的库里面什么东西都没有&#xff0c;现在我们需要在库里面添加数据表内容 一、数据表的组成 在创…

美好未来“一束光”儿童安全教育项目在四川泸定正式启动

6月26日&#xff0c;由中华少年儿童慈善救助基金会和北京臻爱公益基金会共同发起的美好未来计划“一束光”儿童安全教育公益项目启动仪式&#xff0c;在四川省甘孜藏族自治州泸定县贡嘎山片区寄宿制学校举行。 出席本次启动仪式活动的嘉宾有&#xff1a;中华少年儿童慈善救助基…

基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数的生态质量评价及拓展应用

目录 ​第一章 生态环境脆弱性评价内涵及基于文献可视化方法研究热点分析 第二章 数据来源及预处理 第三章 生态环境脆弱性评价模型构建 第四章 生态环境脆弱性时空格局演变分析 第五章 生态环境脆弱性时空格局演变驱动机制分析 第六章 基于 RSEI 指数的生态质量评价 第…

js输入一个字符串,打印出该字符串中,所有字符的排列组合(超清晰)

一、题目 输入一个字符串&#xff0c;打印出该字符串中&#xff0c;所有字符的排列组合。 输入&#xff1a;abc 输出&#xff1a;[abc, acb, bca, bac, cab, cba] 二、思路 回溯算法。其核心思想是通过递归的方式进行深度优先搜索&#xff0c;当发现当前的选择不符合要求时…

机器学习技术:如何使用交叉验证和ROC曲线提高疾病预测的准确性和效率?

一、引言 随着机器学习的普及&#xff0c;评估模型的性能越来越重要。交叉验证和ROC曲线是两种常见的评估模型性能的方法。本文将介绍这两种方法的基本原理和应用场景&#xff0c;并结合实际案例和技术实践&#xff0c;讲解如何使用交叉验证和ROC曲线来提高机器学习模型的性能…

mongodb原理

一&#xff1a;MongoDB的优点和缺点 优点 面向文档存储(类JSON数据模式简单而强大)动态查询全索引支持,扩展到内部对象和内嵌数组查询记录分析快速,就地更新高效存储二进制大对象 (比如照片和视频)复制和故障切换支持Auto- Sharding自动分片支持云级扩展性MapReduce 支持复杂…

chatgpt赋能python:Python选择对话框:简化用户操作的实用工具

Python选择对话框&#xff1a;简化用户操作的实用工具 在Python编程领域中&#xff0c;常常需要与用户进行交互&#xff0c;以便更好地控制程序运行结果。而选择对话框则是一种简化用户操作的实用工具&#xff0c;可避免用户输入错误或步骤繁琐的问题。在本篇文章中&#xff0…

【UE】一个需求案例掌握Timeline和插值Lerp

文章目录 问题背景结论先行timeline和lerp原理使用timelinelerp实现相机平滑跟随BUG猜想验证和解决 问题背景 今天用timelinelerp插值做了一个相机平滑跟随的需求 如果只是要求跟随&#xff0c;直接在tick中把相机位置设置成角色位置就可以 但希望有一个相机滞后角色一点点的…

如何避免ChatGPT,ChatGLM这类大语言模型胡说八道

“ ChatGPT&#xff0c;ChatGLM这类大语言模型一本正经的胡说八道&#xff0c;可能也是它创造性回答的部分。那么谁来判断它在编造无中生有的内容&#xff1f;恐怕只有人才能判断。模型怎么会产生幻觉&#xff0c;我们又怎么避免它产生幻觉&#xff1f;” 01 — 昨天体验了国产…

快上车,搭乘HUAWEI HiCar驶向未来

HUAWEI HiCar&#xff08;以下简称HiCar&#xff09;是华为提供的人-车-家全场景智慧互联解决方案&#xff0c;连接手机与车辆&#xff0c;充分发挥各自的优势属性&#xff0c;将手机的应用/服务生态延伸进车辆&#xff0c;实现以手机为核心的全场景体验。消费者通过HiCar可以感…

HTML 超链接标签、图片标签

超链接标签 超链接描述 HTML使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分。 <a href"url">链接文…

【运维】Linux升级Python2

【运维】Linux升级Python2 操作系统&#xff1a;centos7python版本&#xff1a;升级前版本2.7.5&#xff0c;升级后2.7.18python3版本&#xff1a;升级前3.6.8&#xff0c;升级后版本3.8.8 1、查看当前python版本 [root1 ~]# python -V Python 2.7.5 2、yum安装python [roots14…