STM32作为SPI slave与主机异步通信

news2024/12/26 23:25:09

背景

最近被测试提了个BUG,说某款产品在用户按下前面板的按键后,对应的按键灯没有亮起来。前面板跟主机是通过SPI口通信,前面板是从机,从机想要主动发送消息,需要通过GPIO中断来通知主机
前面板到主机的SPI和GPIO信号
上图前面板是STM32(没有RTOS),主机是RK3588平台,INT是GPIO管脚,CS、MISO、MOSI是SPI标准信号。

整个通信过程是异步的:

前面板 主机 检测到用户按下了hold键 发送SPI请求:用户按下了hold键 主机App要求点亮hold键和numeric键的按键灯 接收SPI命令:点亮hold键和numeric键的按键灯 点亮hold键和numeric键的按键灯 前面板 主机

hold键示例的视频:

按键按下到按键灯亮起

思路

因为前面板是从机,它不知道主机什么时候会发消息,因此需要一直监听SPI总线,等待主机的command。另一方面,它也不知道用户什么时候会按下按键,因此需要一直扫描按键接口,并在检测到按键活动后尽快向SPI总线发送消息,即request,这两种事件对于STM32来说,都是异步的。

SPI总线虽然是双向通信的,但是仅限同步收发(UART是异步收发)。换句话说,尽管STM32发送request的同时可以接收command,但这两种消息的信源(用户和app)却不是同步的,因此不能调用HAL_SPI_TransmitReceive_DMA等双向API来通信,只能分别调用HAL_SPI_Transmit_DMAHAL_SPI_Receive_DMA来模拟异步通信。

解决方法

为了清晰,用流程图来描述:

SPI发送完成中断
SPI接收完成中断
主循环
进入中断
退出中断
进入中断
退出中断
调用HAL_SPI_Receive_DMA接收command
扫描按键
处理SPI command,点亮LED
用户按下某个按键
调用HAL_SPI_Abort中止当前的SPI接收
调用HAL_SPI_Transmit_DMA发送request

注意事项:

  1. STM32绝大部分时间都在监听并执行主机发来的command,仅在用户按下按键时才发送request
  2. 发送request前,必须先abort掉当前的SPI接收流程(SPI同步通信模式的限制)
  3. STM没有Linux那种用户态和内核态的说法,因此在中断里也可以再次启动SPI接收流程,即恢复到监听下一个command的状态。
  4. 最好给command和request分别开辟一个队列,接收中断将command入队,主循环将command出队;主循环发送request前将其入队,发送完成中断将其出队。这样做的好处是可以容纳不同类型、不同时间点的request(按键、旋钮、command的response等),以及不同类型、不同时间点的command(LED点亮命令、蜂鸣器开关命令、固件版本查询命令等)。

可能存在的问题

按照上述思路写完代码后,发现只要用户有按键行为,按键灯就仍然点不亮,从串口打印来看,是接收到的command出现了掐头或去尾的现象。

分析是SPI内部的FIFO没有正确清空,网上搜了下,这篇文章分析得比较到位,我在评论区找到了解决办法,贴出来:

void reset_spi1(void)
{
	__HAL_RCC_SPI1_FORCE_RESET();
	__HAL_RCC_SPI1_RELEASE_RESET();
	MX_SPI1_Init();
}

在每次启动接收前都调一下上面的代码,就可能清空FIFO。经测试,SPI没有再出现掐头去尾的现象。

总结

如果应用场景是双向异步通信,且是系统拓扑是点到点,就别选SPI了,UART更好。

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

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

相关文章

php源码 单色bmp图片取模工具 按任意方式取模 生成字节数组 自由编辑点阵

http://2.wjsou.com/BMP/index.html 想试试chatGPT4生成,还是要手工改 php 写一个网页界面上可以选择一张bmp图片,界面上就显示这张bmp图片, 点生成取模按钮,在图片下方会显示这张bmp图片的取模数据。 取模规则是按界面设置的&a…

蓝桥ACM培训-搜索

前言: 今老师讲了了dfs,虽然我自己之前也自学了一点点,但我还是感觉做题并不是很顺,尤其是今天最后一题,我调试了一下午都没过,还需要积累经验呀。 正文: Problem:A 白与黑-搜索: #include &l…

DbSchema导出HTML/PDF版表结构

一、连接数据库 登录成功默认显示当前用户的所有资源(表、视图、序列、方法、触发器等),如果不操作将导出此用户的全部信息。 至此连接数据库完成 二、表结构导出 本次不想给用户全部导出,只给导出几张,选择需要…

IPO观察丨“闷头做手机”的龙旗科技,如何拓宽价值边界?

提到手机代工,许多人会想起依靠iPhone订单发家的富士康。但近年来,随着国内智能手机供应链愈发成熟,龙旗科技、闻泰科技和华勤技术等一批国产手机代工厂快速崛起,业绩强劲增长之余,还迈进了二级市场。 比如&#xff0…

吴恩达deeplearning.ai:通过偏差与方差进行诊断

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 偏差与方差高偏差高方差合适的模型理解偏差与方差 总结 当你构建神经网络的时候,几乎没有人能够在一开始就将神经系统构建得十分完美。因此构建神经网络最重要的是直到…

BUGKU 头等舱

头等舱 打开环境,什么都没有,使用BP抓包,发送到重发器里,看响应得到flag

LeetCode 热题 100 | 图论(二)

目录 1 基础知识 1.1 什么是拓扑排序 1.2 如何进行拓扑排序 1.3 拓扑排序举例 2 207. 课程表 3 210. 课程表 II 菜鸟做题,语言是 C 1 基础知识 1.1 什么是拓扑排序 含义:根据节点之间的依赖关系来生成一个有序的序列。 应用&#xff1a…

详细了解C++中的namespace命名空间

键盘敲烂,月薪过万,同学们,加油呀! 目录 键盘敲烂,月薪过万,同学们,加油呀! 一、命名空间的理解 二、::作用域运算符 三、命名空间(namespace&…

勒索病毒最新变种.helper勒索病毒来袭,如何恢复受感染的数据?

尊敬的读者: 在数字时代,我们享受着科技带来的便利,但与此同时,网络安全威胁也在不断演变。其中,勒索病毒是一种极具破坏力的威胁,而.helper勒索病毒更是最新的变种之一。当你的文件被.helper勒索病毒加密…

SparkStreaming在实时处理的两个场景示例

简介 Spark Streaming是Apache Spark生态系统中的一个组件,用于实时流式数据处理。它提供了类似于Spark的API,使开发者可以使用相似的编程模型来处理实时数据流。 Spark Streaming的工作原理是将连续的数据流划分成小的批次,并将每个批次作…

redis04 发布与订阅

一种消息通信模式:发布者(pub)发布消息,订阅者(sub)接收消 息。 redis客户端可以订阅任意数量的频道。 发布订阅流程图 发布和订阅实现 打开两个窗口订阅channel1频道,再打开一个窗口向chan…

ssh连接github报错:ssh_exchange_identification: Connection closed by remote host

报错截图:ssh_exchange_identification: Connection closed by remote host 配置步骤: 生成新的 SSH 密钥并将其添加到 ssh-agent - GitHub 文档 这个报错是我在寒武纪MLU270的dcoker环境中遇到的,但是在windows系统中可以通过SSH的方式git…

Excel 按奇数偶数列处理数据

目录 一. 需求背景1.1 获取偶数列的数据1.2 奇偶列数据互换 二. 解决方式2.1 为列添加奇偶辅助列2.2 通过公式将奇偶列互换 一. 需求背景 1.1 获取偶数列的数据 ⏹ 最近在整理歌单,发现部分歌曲没有歌词,于是打算自己制作一份。 从网上找到了歌词&…

从下一代车规MCU厘清存储器的发展(1)

目录 1.车规MCU制程工艺朝28nm进发 2.MCU存储器概述 3.MCU大厂的选择 3.1 瑞萨自研STT-MRAM 3.2 ST专注PCM 3.3 英飞凌和台积电联手RRAM 3.4 NXP如何计划eNVM 4.小结 1.车规MCU制程工艺朝28nm进发 随着英飞凌发布了关于AURIX TC4xx系列即将量产的新闻,国际…

RS编码的FPGA实现

RS编码,即Reed-solomon codes,是一类纠错能力很强的特殊的非二进制BCH码(BCH码是一种有限域中的线性分组码,具有纠正多个随机错误的能力)。对于任选正整数S可构造一个相应的码长为nqS-1的 q进制BCH码,而q作…

机器学习,数学统计常用数学符号

通用字体,符号规则 x x x 标量 x \boldsymbol{x} x 向量 X \boldsymbol{X} X 随机向量、矩阵 χ \chi \quad χ 集合 x ^ \hat{x} x^ 估计或近似值 x ∗ x^* x∗ 最优值 x ˉ \bar{x} xˉ 平均值 常见的数学符号 ∀ \forall \quad ∀ 对任意 ∃ \exists ∃ 存在 ∝…

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述:php没有难题 考点总结:脑洞题目,不如我出(狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候,提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …

快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4元…

vscode如何远程到linux python venv虚拟环境开发?(python虚拟环境、vscode远程开发、vscode远程连接)

文章目录 1. 安装VSCode2. 安装扩展插件3. 配置SSH连接4. 输入用户名和密码5. 打开远程文件夹6. 创建/选择Python虚拟环境7. 安装Python插件 Visual Studio Code (VSCode) 提供了一种称为 Remote Development 的功能,允许用户在远程系统、容器或甚至 Windows 子系统…

Linux:kubernetes(k8s)node节点加入master主节点(3)

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)-CSDN博客https://blog.csdn.net/w14768855/article/details/136415575?spm1001.2014.3001.5502 我在上一章部署好了主节点&…