12 HAL库的硬件SPI驱动数码管

引言: 本文将为大家介绍一下SPI, 数码管的知识, 以及HAL库驱动SPI接口的数码的代码示例。

一、SPI的基础知识


1. SPI简介

01 SPI是串行外设接口(Serial Peripheral Interface)的缩写
02 是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范
03 是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步的串行通信总线
04 SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机),主模块选择一个从模块进行同步通信,从而完成数据的交换。
05 SPI通信原理很简单,需要至少4根线,单向传输是3根线(也就是主机没有接收的功能),主机发从机只负责接收;它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)和CS/SS(片选)

2. SPI的通信细节

  • 通信方式

一主一从

一主多从(常规模式、菊花链模式(在整个由主机和从机组成的通信网络里面将数据转发一遍))

  • 通信原理

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。

1、主设备发起信号,将CS/SS拉低,启动通信。

2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。

3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

  • 通信过程

SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑“1”,低电平表示逻辑“0”;一个字节传送完成后无需应答即可开始下一个字节的传送;SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送;

  • 极性和相位

SPI有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:

CPOL表示SCLK空闲时的状态

CPOL=0,串行时钟空闲状态为低电平。

CPOL=1,串行时钟空闲状态为高电平。

CPHA表示采样时刻

CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。

CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

以上两两组合, SPI就能组合出四种工作模式。

CPOL=0,CPHA=0

这里我就给大家演示一种工作模式了, 其它的就是啥时候代表空闲, 啥时候采集数据的组合。

注意:

需要说明的是,对于一个特定的从设备来说,一般在出厂时就会将其设计为某种特定的工作模式;我们在使用该设备时就必须保证主设备的工作模式和该从设备保持一致,否则是无法进行通信的;所以一般我们需要对主设备的CPOL和CPHA进行配置;

二、数码管的基础知识


1.数码管简介

数码管是一种用于显示数字和字符的电子组件。它由多个发光二极管(LED)或液晶显示单元组成,可以显示常见的数字、字母、符号和其他图形。 数码管可以分为共阳极和共阴极两种类型。

共阳极数码管:在共阳极数码管中,每个数字或字符的LED发光单元的阳极都是连接在一起的,而每个LED的阴极则分别控制。当需要显示某个数字或字符时,通过给对应的阴极施加低电平,使其发光显示。

共阴极数码管:在共阴极数码管中,每个数字或字符的LED发光单元的阴极都是连接在一起的,而每个LED的阳极则分别控制。当需要显示某个数字或字符时,通过给对应的阳极施加高电平,使其发光显示。

数码管通常由七段LED组成,每一段LED表示数字的一个线段,而七段则表示一个数字或字符。在某些高级的数码管中,还可以显示更多的内容,如小数点、符号等。 数码管可以通过将不同的线段点亮来显示不同的数字或字符。控制数码管显示的方法有两种:静态显示和动态显示。 静态显示:在静态显示中,数码管的每一段LED都通过外部电路直接连接到电源或地。通过控制电源的开关状态,可以选择性地点亮或熄灭每个线段,从而显示所需的数字或字符。

动态显示:在动态显示中,数码管的每一段LED都通过外部电路连接到一个共享的引脚上。通过对不同的引脚进行快速的开关控制,可以以持续的方式在不同的数码管上显示不同的数字或字符。

数码管广泛应用于各种电子设备和仪器中,如计算器、时钟、温度计、电子秤等,提供了一种直观、方便的数字显示方式。

这里简单的介绍一下数码管的基本工作原理, 这里以共阴极的举例分析, 一个数码管由八段, 对应一个字节的八位, 想点亮数码管的那一段就对应将一个字节的数据的哪一位置1就行, 这就是我数码管的显示原理。

2. M74HC595M1R芯片

本次实验的数码管使用spi总线将数码管和M74HC595M1R这款串入并出的芯片相连。

可以看到数码管位段线接到了M74HC595M1R的并出的接口上, 并且我们可以发现, 这种SPI的工作的模式就是一主一从, 而且只需要三根线, 因为不需要接收从机的数据嘛。

3. 数码管的显示原理分析

由图中可以确定数码管为共阴极数码管,DS_A、DS_B、DS_C、DS_D、DS_E、DS_F、DS_G、DS_DP 分别对应数码管的每个段,对应管脚为高电平时对应的部位会被点量,因为只有一组数据信号,但是有四个数码管,所以需要通过控制 DS_G1、DS_G2、DS_G3 和DS_G4 选择某个数码管显示内容,然后通过轮询刷新让四个数码管正常显示。说成大白话就是一次只能点亮一个数码管, 但是我们将其写入一个循环中去, 轮询的一个数码管一个数码管的点亮, 时间短, 我们看起来是连续的而已。

三、代码实现


#ifndef TUBE_H
#define TUBE_H/*相关字符显示的编码值*/
#define FIRST (0x01)
#define SECOND (0X02)
#define THIRD (0X04)
#define FOUTH (0X08)#define POINT (0X80)#define ZERO (0X3F)
#define ONE (0X06)
#define TWO (0X5B)
#define THREE (0X4F)
#define FOUR (0X66)
#define FIVE (0X6D)
#define SIX (0X7D)
#define SEVEN (0X07)
#define EIGHT (0X7F)
#define NINE (0X6F)#define _A_ (0x77)
#define _B_ 0x7c
#define _C_ 0x39
#define _D_ 0x5E
#define _E 0x79
#define _F_ 0x71/*数码管的操作函数*/
extern void M74HC595_ReadDataTest(void);
extern uint8_t rw_595_Register(uint8_t reg,uint8_t data);#endif

#include "tube.h"void M74HC595_ReadDataTest(void)
{/*让数码管的0, 1, 2, 3分别显示数字1,2,3,4, 注意:需要循环刷新*/rw_595_Register(FIRST,ONE);HAL_Delay(1);rw_595_Register(SECOND,TWO);HAL_Delay(1);rw_595_Register(THIRD,THREE);HAL_Delay(1);rw_595_Register(FOUTH,FOUR);HAL_Delay(1);
}/*para:1:位选编码2:对应编号的数码管显示对应编码值的数字
*/
uint8_t rw_595_Register(uint8_t reg,uint8_t data)
{uint8_t txdata[2] = {reg, data};if(HAL_SPI_Transmit(&hspi4, txdata ,2,300) != HAL_OK) //发送数据{Error_Handler();}return 0;
}

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

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

相关文章

【ARMv8M Cortex-M33 系列 2 -- Cortex-M33 JLink 连接 及 JFlash 烧写介绍】

请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】 文章目录 Jlink 工具JLink 命令行示例JFlash 烧写问题Jlink 工具 J-Link 是 SEGGER 提供的一款流行的 JTAG 调试器,它支持多个平台和处理器。JLink.exe 是 J-Link 调试器的命令行接口,它允许用户通过命令行执行一系列操…

微信小程序开发系列-11组件间通信02

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

打破数据孤岛:ChatGPT如何打通金融大数据的任督二脉?

文章目录 一、引言二、ChatGPT与金融大数据分析的融合三、实践应用:ChatGPT在金融大数据分析中的优势与挑战四、案例分析:ChatGPT在金融大数据分析中的应用案例五、前景展望:ChatGPT在金融大数据分析领域的未来发展《AI时代Python金融大数据分…

[新版Hi3531DV200 性能强悍]

新版Hi3531DV200 性能强悍 Hi3531DV200是针对多路高清/超高清(1080p/4M/5M/4K)DVR产品应用开发的新一代专业SoC芯片。Hi3531DV200集成了ARM A53四核处理器和性能强大的神经网络推理引擎,支持多种智能算法应用。同时,Hi3531DV200还…

maven工具的搭建以及使用

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀首先进行maven工具的搭建🦓1.[打开下载 maven 服务器官网](http://maven.apache.org)🪅2.解压之后,配置环境变量🏨3.打开设…

【SpringBoot开发】之商城项目案例(实现登陆版)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )

一、Android Plugin DSL Reference 文档下载 二、Android Plugin DSL Reference 文档查看 一、Android Plugin DSL Reference 文档下载 在之前的博客 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 ) 中…

ffmpeg两种windows版本区别说明

版本一 必须拷贝exe和dll文件才能使用,如果缺少dll则exe不正正常执行 如果缺少dll ,执行 exe会报错如下 版本2 直接拷贝exe就能使用,没有依赖的环境

uniapp实现前端银行卡隐藏中间的数字,及隐藏姓名后两位

Vue 实现前端银行卡隐藏中间的数字 主要应用了 filters过滤器 来实现效果 实现效果&#xff0c;如图&#xff1a; <template><div><div style"background-color: #f4f4f4;margin:50px 0 0 460px;width:900px;height:300px;"><p>原来&#…

Android 13 动态启用或禁用IPV6

介绍 客户想要通过APK来控制IPV6的启用和禁用&#xff0c;这里我们通过广播的方式来让客户控制IPV6。 效果展示 adb shell ifconfig 这里我们用debug软件&#xff0c;将下面节点置为1 如图ipv6已被禁用了 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 修改 接下来…

老虎目标检测数据集VOC格式900张

老虎是地球上最为壮丽而令人敬畏的野生动物之一&#xff0c;是大型猫科动物中的一员。老虎通常具有强壮的体格和敏捷的身体机能&#xff0c;是世界上最顶级的掠食者之一。 老虎的外貌特征鲜明&#xff0c;身体长约2至3米&#xff0c;体重可达200至300公斤。它们的体型庞大&…

Kubernetes 学习总结(41)—— 云原生容器网络详解

背景 随着网络技术的发展&#xff0c;网络的虚拟化程度越来越高&#xff0c;特别是云原生网络&#xff0c;叠加了物理网络、虚机网络和容器网络&#xff0c;数据包在网络 OSI 七层网络模型、TCP/IP 五层网络模型的不同网络层进行封包、转发和解包。网络数据包跨主机网络、容器…

2023下半年的总结

我从八月下旬开始写的&#xff0c;到现在差不多有半年了&#xff0c;总结一下吧&#xff01; 1.计算机视觉 在计算机视觉方面&#xff0c;想必两个有名的深度学习框架&#xff08;TensorFlow和PyTorch&#xff09;大家都很清楚吧&#xff0c;以及OpenCV库。对于人脸识别&…

2024年【黑龙江省安全员C证】考试及黑龙江省安全员C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年黑龙江省安全员C证考试为正在备考黑龙江省安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的黑龙江省安全员C证找解析祝您顺利通过黑龙江省安全员C证考试。 1、【多选题】下列属于编制安全检查…

【力扣题解】P530-二叉搜索树的最小绝对差-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P530-二叉搜索树的最小绝对差-Java题解&#x1f30f;题目描述&#x1f4a1;题解&…

解密C++中的forward<int>(a)和forward<int >(a):你真的了解它们之间的区别吗?

一文看尽C中的forward完美转发 一、前言二、深入理解forward和完美转发三、对forward<int>(a)的解析四、对forward<int &&>(a)的解析五、forward<int>(a)和forward<int &&>(a)的区别总结 一、前言 完美转发在C中具有重要性&#xff0…

数据结构期末复习(2)链表

链表 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一系列具有相同类型的元素。链表由节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两部分&#xff1a;数据域&#xff08;存储元素值&#xff09;和指针域&#xff08;指…

Python学习笔记之(一)搭建Python 环境

搭建Python 环境 1. 使用工具准备1.1 Python 安装1.1.1 下载Python 安装包1.1.2 安装Python 1.2 VScode 安装1.2.1 下载VScode安装包1.2.2 给VScode安装Python 扩展 2. 第一次编写Python 程序 本篇文章以Windows 系统为例。 1. 使用工具准备 1.1 Python 安装 1.1.1 下载Pytho…

双向循环链表实现C语言关键字中英翻译机 ฅ( ̳• · • ̳ฅ)

目录 1.双向循环链表的声明与定义&#xff1a; 2. 创建链表并对节点中的数据赋初值 3. 插入节点并链接 4.中英翻译 5. 小游戏的实现 6.菜单的实现 7. 释放内存 8.在主函数中用刚才定义的函数实现各种代码 输入样例&#xff1a; 实现方法&#xff1a;双向循环链表来实…

华为ensp网络设计期末测试题-复盘

网络拓扑图 地址分配表 vlan端口分配表 需求 The device is running!<Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]un in en Info: Information center is disabled. [Huawei]sys S1 [S1]vlan 99 [S1-vlan99]vlan 100 [S1-vlan100]des IT [S1-…