当前位置: 首页 > news >正文

工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库

文章目录

  • 前言
  • CubeMX配置
  • SPI驱动实现
    • spi_driver.h
    • spi_driver.c
  • 额外的接口补充


前言

SPI,想了很久没想明白其DMA或者IT比较好用的方法,可能之后也会写一个
我个人使用场景大数据流不多,如果是大批量数据交互自然是DMA更好用,但考虑到多从机通讯,感觉还是阻塞式更灵活一些,毕竟大部分通讯片选延时1us,但一个数据传进去也就不到1us。
以后有时间改个DMA或者IT升级版

spix = new_SPI_Driver(SPIx_Port, CS_GPIOx, CS_Pin);//完成初始化
RxData = spix->tr16(spix, TxData);//数据传递
spix->cs_l(spix);;//CS拉低
spix->cs_h(spix);;//CS拉搞

SPI的多从机任务可以自己挂CS,并在上层实现数据流读取
上层实现可以参考工程文件参考——ADS1118多从机驱动(base on spi_driver)
需要8位传输的可以自己改


CubeMX配置

开了就能用,注意匹配下,数据长度,8bit还是16bit。MSB是先高位还是先低位,以及CPOL与CPHA的设置。NSS硬件片选没什么用,包括从机的NSS,感觉不如外部触发中断。
在这里插入图片描述
CS直接开GPIO,根据自己从机数量需求设计
在这里插入图片描述

SPI驱动实现

spi_driver.h

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_DRIVER_H
#define __SPI_DRIVER_H
/* =================================================================================
File name:       __SPI_DRIVER_H
Author: Mr.NoFish
===================================================================================*/#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/#include "main.h"#include "spi.h"typedef struct SPI_Driver_ SPI_Driver;typedef void (*SPIfptrCS_H)(SPI_Driver*);
typedef void (*SPIfptrCS_L)(SPI_Driver*);
typedef uint16_t (*SPIfptrTranRecv16)(SPI_Driver*, uint16_t);
typedef void (*SPIfptrTran16)(SPI_Driver*, uint16_t);struct SPI_Driver_
{SPI_TypeDef* SPIx;GPIO_TypeDef* CS_GPIOx;uint32_t CS_Pin;uint16_t TxData;uint16_t RxData;SPIfptrCS_H cs_h;SPIfptrCS_L cs_l;SPIfptrTranRecv16 tr16;SPIfptrTran16 tran16;
};SPI_Driver* new_SPI_Driver(SPI_TypeDef* SPIx_Port, GPIO_TypeDef* CS_GPIOx, uint32_t CS_Pin);void spi_chip_select_set(SPI_Driver* const pSPIObj);
void spi_chip_select_reset(SPI_Driver* const pSPIObj);
void spi_transmit_16(SPI_Driver* const pSPIObj, uint16_t TxData);
uint16_t spi_transmit_receive_16(SPI_Driver* const pSPIObj, uint16_t TxData);
#endif

spi_driver.c

/* =================================================================================
File name:       __SPI_DRIVER_C
Author: Mr.NoFish
===================================================================================*/
#include "spi_driver.h"SPI_Driver* new_SPI_Driver(SPI_TypeDef* SPIx_Port, GPIO_TypeDef* CS_GPIOx, uint32_t CS_Pin)
{SPI_Driver* pObj = NULL;uint8_t i = 0;pObj = (SPI_Driver*)malloc(sizeof(SPI_Driver));if (pObj == NULL){printf("WARN: SPI_Driver initialization failed.\r\n");return NULL;}pObj->SPIx = SPIx_Port;pObj->CS_GPIOx = CS_GPIOx;pObj->CS_Pin = CS_Pin;pObj->cs_h = spi_chip_select_set;pObj->cs_l = spi_chip_select_reset;pObj->tran16 = spi_transmit_16;pObj->tr16 = spi_transmit_receive_16;pObj->cs_h(pObj);//LL_SPI_Enable(pObj->SPIx);printf("INFO: SPI_Driver initialization succeeded.\r\n");return pObj;			
}void spi_chip_select_set(SPI_Driver* const pSPIObj)
{LL_GPIO_SetOutputPin(pSPIObj->CS_GPIOx, pSPIObj->CS_Pin);
}void spi_chip_select_reset(SPI_Driver* const pSPIObj)
{LL_GPIO_ResetOutputPin(pSPIObj->CS_GPIOx, pSPIObj->CS_Pin);
}void spi_transmit_16(SPI_Driver* const pSPIObj, uint16_t TxData)
{	pSPIObj->TxData = TxData;while(!LL_SPI_IsActiveFlag_TXE(pSPIObj->SPIx));LL_SPI_TransmitData16(pSPIObj->SPIx, pSPIObj->TxData);
}uint16_t spi_transmit_receive_16(SPI_Driver* const pSPIObj, uint16_t TxData)
{	pSPIObj->TxData = TxData;while(!LL_SPI_IsActiveFlag_TXE(pSPIObj->SPIx));LL_SPI_TransmitData16(pSPIObj->SPIx, pSPIObj->TxData);while(LL_SPI_IsActiveFlag_BSY(pSPIObj->SPIx));while(!LL_SPI_IsActiveFlag_RXNE(pSPIObj->SPIx));pSPIObj->RxData =  LL_SPI_ReceiveData16(pSPIObj->SPIx);return pSPIObj->RxData;
}

额外的接口补充

LL_SPI_Enable(SPIx);别忘记自己加一下,但留意别在初始化之前Enable。
SPI每个设备的实现方式都不同,所以需要根据数据手册进一步实现上层设计。
这个库设计用来提供给多从机控制,一些范例的应用可以参考如下文章。
工程文件参考——ADS1118多从机驱动(base on spi_driver)

相关文章:

工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库

文章目录 前言CubeMX配置SPI驱动实现spi_driver.hspi_driver.c 额外的接口补充 前言 SPI,想了很久没想明白其DMA或者IT比较好用的方法,可能之后也会写一个 我个人使用场景大数据流不多,如果是大批量数据交互自然是DMA更好用,但考…...

LLM - 模型历史

...

Go语言中的时间与日期处理:time包详解

在Go语言中,time包提供了丰富而强大的功能来处理时间和日期,这对于构建精确计时、定时任务、日期格式化等应用场景至关重要。本文将深入浅出地探讨time包的核心概念、常见问题、易错点及其规避策略,并通过实用代码示例加深理解。 一、时间与…...

Java实现单点登录(SSO)详解:从理论到实践

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...

【leetcode82-91动态规划,91-95多维动态规划】

动态规划【82-91】 多维动态规划【91-95】...

Django学习第四天

启动项目命令 python manage.py runserver 分页功能封装到类中去 封装的类的代码 """ 自定义的分页组件,以后如果想要使用这个分页组件,你需要做: def pretty_list(request):# 靓号列表data_dict {}search_data request.GET.get(q, &…...

redis-benchmark 使用

Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。 Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]-h <hostname> Server hostname (default 127.0…...

什么是 qobject_cast?

前言 在 C++ 中,类型转换是一项常见的操作,比如将 int 转换为 char 或将 QString 用于 QMessageBox。但是,为什么我们需要将一个类转换为另一个类呢?本文将解释 qobject_cast 是什么,它的作用以及为什么需要类型转换。 dynamic_cast 和 qobject_cast 的概述 什么是 dyn…...

Python酷库之旅-第三方库Pandas(001)

目录 一、Pandas库的由来 1、背景与起源 1-1、开发背景 1-2、起源时间 2、名称由来 3、发展历程 4、功能与特点 4-1、数据结构 4-2、数据处理能力 5、影响与地位 5-1、数据分析“三剑客”之一 5-2、社区支持 二、Pandas库的应用场景 1、数据分析 2、数据清洗 3…...

Firefox 编译指南2024 Windows10篇- 编译Firefox(三)

1.引言 在成功获取了Firefox源码之后&#xff0c;下一步就是将这些源码编译成一个可执行的浏览器。编译是开发流程中的关键环节&#xff0c;通过编译&#xff0c;我们可以将源代码转换为可执行的程序&#xff0c;测试其功能&#xff0c;并进行必要的优化和调试。 对于像Firef…...

CSS弹性布局:打造响应式与灵活的网页设计

一、弹性布局是什么&#xff1f; 弹性布局&#xff08;Flexbox&#xff09;是一种CSS布局模型&#xff0c;它提供了一种更加高效的方式来对容器中的项目进行布局、对齐和分配空间。与传统的布局方式相比&#xff0c;Flexbox旨在提供一个更加灵活的方式来布局复杂的网页结构&am…...

【高阶数据结构】图的应用--最短路径算法

文章目录 一、最短路径二、单源最短路径--Dijkstra算法三、单源最短路径--Bellman-Ford算法四、多源最短路径--Floyd-Warshall算法 一、最短路径 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&#xff0c;最短也就是沿…...

腾讯云函数node.js返回自动带反斜杠

云函数返回自动带反斜杠 这里建立了如下一个云函数,目的是当APP过来请求的时候响应支持的版本号: use strict; function main_ret(status,code){let ret {status: status,error: code};return JSON.stringify(ret); } exports.main_handler async (event, context) > {/…...

大模型知识学习

大模型训练过程 数据清洗 拟人化描述&#xff1a;知识库整理 预训练 拟人化描述&#xff1a;知识学习可以使用基于BERT预训练模型进行训练 指令微调 拟人化描述&#xff1a;实际工作技能学习实际操作&#xff1a;让大模型模仿具体的输入输出进行拟合&#xff0c;即模仿学…...

JAVA声明数组

一、声明并初始化数组 直接初始化&#xff1a;在声明数组的同时为其分配空间并初始化元素。 int[] numbers {1, 2, 3, 4, 5}; 动态初始化&#xff1a;先声明数组&#xff0c;再为每个元素分配初始值。 double[] decimals;decimals new double[5]; // 分配空间&#xff0c;但…...

VBA通过Range对象实现Excel的数据写入

前言 本节会介绍通过VBA中的Range对象&#xff0c;来实现Excel表格中的单元格写入、区域范围写入&#xff0c;当然也可以写入不同类型的数据&#xff0c;如数值、文本、公式&#xff0c;以及实现公式下拉自动填充的功能。 一、单元格输入数据 1.通过Value方法实现输入不同类型…...

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…...

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…...

等保2.0中还有哪些针对云计算的安全要求?

等保2.0中针对云计算的安全要求概述 等保2.0是中国信息安全等级保护制度的升级版&#xff0c;它对云计算环境提出了一系列特定的安全要求&#xff0c;以确保云服务的安全性和合规性。以下是一些关键的云计算安全扩展要求&#xff1a; 基础设施位置&#xff1a;要求云计算基础…...

数组与 ArrayList 的区别是什么?

在Java中&#xff0c;数组和ArrayList都是非常常见的数据结构&#xff0c;但它们在使用场景、特点和功能上各有千秋。 理解它们的不同&#xff0c;对于初级Java工程师来说&#xff0c;是提升编程技能的一个重要环节。 下面&#xff0c;我将以一种简单明了的方式&#xff0c;对…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...