【单片机通信技术】STM32 HAL库 SPI主从机通过串口发送数据

一、说明

使用STM32F103C8T6最小系统板,让板载SPI1与SPI2通信,通过串口收发数据。本文章说明了在配置与编写时遇到的一些问题,以及详细说明如何使用cubeMAX进行代码编写。

二、CubeMAX配置

1.时钟配置选择外部高速时钟

2.系统模式与时钟配置,选中Serial Wire模式(即 SWD 调试接口),用于连接 ST-Link 等调试工具。

3.将时钟配置为72分频,在这里一定要注意按回车确认72已经填入。

4.​选择 ​Full-Duplex Master(全双工主机模式),硬件 NSS 信号:已禁用(Disable Hardware NSS Signal),在这里要注意将波特率预分频改为256,图中右侧芯片引脚视图显示 ​SPI1 的引脚已自动分配,还要注意一点是NSS(片选)​未固定引脚,我们要在配置一下这个引脚为输出,此处右边选择PA4作为NSS。

5.选择 ​全双工主机模式(Full-Duplex Master)​。

6.配置串口1选择 ​Asynchronous(异步模式),即标准的 UART 串口通信(无同步时钟线),波特率设置为115200,USART1_TX(发送引脚)​:PA9,​USART1_RX(接收引脚)​:PA10。

7.点击项目管理(Project Manager),在Project Manager(项目管理)中工具链/IDE(Toolchain/IDE)​:选择 ​MDK-ARM(Keil)​,版本 ​V5.32​(需与本地安装的 Keil 版本匹配)。

8.勾选 ​​“Generate peripheral initialization as a pair of '.c/.h' files per peripheral”​,表示每个外设(如 SPI、USART)的初始化代码会独立生成到 Src 和 Inc 文件夹中,提升代码可读性和模块化。

9.点击GENERATE CODE生成代码,随后点击open即可打开CubeMAX生成的代码。

三、Keil代码编写

1.因为我们需要SPI1与SPI2互相收发数据,所以我们直接定义出全局变量,以便于我们后期修改数。

2.在while(1)主循环中添加如下代码,

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低CS(启动通信)
  • 作用:通过拉低 GPIOA 的 PIN4(片选引脚 CS),选中连接的 SPI 从机设备。
  • 关键点:SPI 协议要求主机在通信前必须拉低从机的 CS 引脚,否则从机不会响应。
HAL_SPI_TransmitReceive(&hspi1, &spi1_tx_data, &spi1_rx_data, 1, 100);
  • 功能:通过 SPI1 同时发送 1 字节数据(0xFF)并接收 1 字节数据。
    • 发送数据spi1_tx_data 值为 0x66(可能用于触发从机返回数据)。
    • 接收数据:从机响应的数据存入 spi1_rx_data
  • 参数解析
    • &hspi1:SPI1 的句柄(需提前配置为 ​主机模式)。
    • 1:传输数据长度为 1 字节。
    • 100:超时时间(单位:毫秒)。
char msg[50];
sprintf(msg, "SPI1 Received: 0x%02X\r\n", spi1_rx_data);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);sprintf(msg, "SPI2 Received: 0x%02X\r\n", spi2_rx_data);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);

将 SPI 接收的数据格式化为字符串,并通过 UART1 发送。

#include "stdio.h"
#include "string.h"

sprintf()函数可能会报警告,这时应添加头函数。

HAL_Delay(500); // 延时500毫秒

每次循环间隔 500ms,避免频繁通信导致总线冲突或数据过载。

3.到此所有的代码添加完毕,点击“魔术棒”,查看ST-Link Debugger​是否勾选,点击进入Setting,勾选上Reset and Run这样在我们每次烧录完之后不需要再按下复位让单片机成功烧录。

四、现象展示

若与下图相同那么实验成功,也可以在全局变量更改接收的数值。

如出现一下现象,可能是未将单片机上SPI1的接口与SPI2的接口相连接起来,如下图接线。同时要注意ST-Link是无法打开串口数据的,要连接最小系统板的USB插口或用USB转TTL接杜邦线连接最小系统板上的A9,A10引脚。

SPI1             SPI2
SCK:  PA5 ---->  SCK:  PB13
MISO: PA6 ---->  MISO: PB14
MOSI: PA7 ---->  MOSI: PB15
CS:   PA4 ---->  CS:   PB12

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量删除 Excel 中所有图片、某张指定图片以及二维码图片

在 Excel 文档中,我们可以在工作表中插入大量的图片,我们也可以删除工作表中的图片。少量的图片我们可以直接删除,但是我们我们有大量的 Excel 文档,那如何快速删除所有 Excel 表格中的所有图片呢?我们除了常规删除 Ex…

【算法】大数据查重

大数据查重 哈希表 找出第一个出现重复的数字 || 找所有重复出现的数字 #include <iostream> #include <vector> #include <unordered_map> #include <unordered_set> #include <stdlib.h> #include <time.h> #include <string> …

网格图学习(附题单与做题思路)

文章目录 一、DFS 经典题型695. 岛屿的最大面积 二、BFS 经典题型994. 腐烂的橘子**算法选择对照表** 一、DFS 经典题型 岛屿的最大面积 LeetCode 695描述&#xff1a;求网格中最大的陆地连通区域面积解题&#xff1a;DFS 遍历所有相邻陆地&#xff0c;标记已访问关键点&#…

安装树莓派3B+环境(嵌入式开发)

一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站&#xff0c;点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器&#xff0c;再接入电脑&#xff0c;随后打开Raspberry Pi Imager下载工具&#xff0c; 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…

Leetcode 刷题记录 06 —— 矩阵

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 矩阵置零 方法一&#xff1a;标记数组 方法二&#xff1a;两个标记变量 02 螺旋矩阵…

前端 | 向后端传数据,判断问题所在的调试过程

目录 ​编辑 1. 在 vue 文件中&#xff0c;在调用函数之前 先打印传入的数据 2. 在 js 文件中&#xff0c;打印接收到的数据 3. 在浏览器 Network 面板查看请求数据 4. 在 server.js 中查看请求数据 5. 确保 JSON 格式正确 知识点&#xff1a;JSON.stringify(req.body, …

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快&#xff0c;但是掉电会丢失&#xff1b;ROM的特点是存储速度特别慢&#xff0c;但是掉电不会丢失 SRAM是所有存储器最快的&#xff0c;一般用于电脑的CPU高速缓存&#xff0c;容量相对较少&#xff0c;成本较高&#xff1b;DRAM…

Python绘制数据分析中经典的图形--列线图

Python绘制数据分析中经典的图形–列线图 列线图是数据分析中的经典图形&#xff0c;通过背后精妙的算法设计&#xff0c;展示线性模型&#xff08;logistic regression 和Cox&#xff09;中各个变量对于预测结果的总体贡献&#xff08;线段长短&#xff09;&#xff0c;另外&…

Golang学习笔记_44——命令模式

Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…

致同报告:香港财政赤字加剧,扩大税基与增收迫在眉睫

2月26日香港政府2025-26年度财政预算案&#xff0c;&#xff08;以下简称“预算案”&#xff09;发布&#xff0c;香港财政司司长陈茂波提出一系列旨在减少开支并振兴香港经济的措施&#xff0c;以应对日益增长的财政赤字。主要提案包括对所有公务员实施冻薪、针对性税务宽减措…

计算机网络笔记(二)——1.2互联网概述

1.2.1网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面&#xff0c;我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便&#xff0c;后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…

小程序开发总结

今年第一次帮别人做小程序。 从开始动手到完成上线&#xff0c;一共耗时两天。AI 让写代码变得简单、高效。 不过&#xff0c;小程序和 Flutter 等大厂开发框架差距实在太大&#xff0c;导致我一开始根本找不到感觉。 第一&#xff0c;IDE 不好用&#xff0c;各种功能杂糅在…

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体&#xff0c;已有多家媒体机构推出AI主播&#xff0c;最近杭州文化广播电视集团的《杭州新闻联播》节目&#xff0c;使用AI主持人进行新闻播报&#xff0c;且做到了0失误率&#xff0c;可见AI正在逐渐取代部分行业和一些重复性的工作&#xff0c;这一现象引发很…

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

MySQL入门手册

MySQL入门手册&#xff1a;从零开始掌握数据库管理 &#x1f4d6; 一、MySQL是什么&#xff1f; MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现隶属于Oracle旗下。它使用**结构化查询语言&#xff…

从0到1入门RabbitMQ

一、同步调用 优势&#xff1a;时效性强&#xff0c;等待到结果后才返回 缺点&#xff1a; 拓展性差性能下降级联失败问题 二、异步调用 优势&#xff1a; 耦合度低&#xff0c;拓展性强异步调用&#xff0c;无需等待&#xff0c;性能好故障隔离&#xff0c;下游服务故障不影响…

行业案例:10Wtps超高并发“某节跳动”钱包架构与落地方案

1. 项目背景与挑战 1.1 项目背景 &#xff08;1&#xff09;八端支持&#xff1a; 2022年&#xff0c;字节系产品在春节活动中面临的挑战是支持八个不同的APP产品&#xff08;包括抖音、抖音火山版、抖音极速版、西瓜视频、头条、头条极速版、番茄小说、番茄畅听&#xff09;…

C++入门——引用

C入门——引用 一、引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。这就好比《水浒传》中&#xff0c;一百零八位好汉都有自己的绰号。通过&…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…