引言: 本文将为大家介绍一下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;
}