news 2026/4/18 10:09:12

SPI通信:高效同步串行接口解析、软硬件spi

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SPI通信:高效同步串行接口解析、软硬件spi

SPI通信

SPI介绍

SPI 的全称是Serial Peripheral Interface(串行外设接口)是一种同步串行通信技术Motorola 首先提出的全双工三线/四线同步串行外围接口采用主从模式架构时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后;SPI接口有2根单向数据线,为全双工通信。

SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

SPI总线拓扑结构

SPI总共有4根总线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

M : Master O : Output S : Slave I : Input

  • MOSI:主器件数据输出,从器件数据输入
  • MISO:主器件数据输入,从器件数据输出
  • SCLK :时钟信号,由主器件产生
  • /SS:从器件使能信号,由主器件控制(片选)(nss、cs,低电平有效)

注:SPI如果一主一从,则只需要三根线即可,片选线可以不使用

SPI一主多从通信时,通过SS片选线来区分主机和哪个或哪几个从机进行通信,只需要主机将要和从机通信的SS电平拉低即可

SPI特点

  1. 同步串行全双工的通信协议,遵循高位先行的数据传输方式
  2. 实现一主多从通信,通过片选线区分从机
  3. 是一个3线或4线的通信协议

SPI总线协议

起始信号:NSS信号线由高变低(NSS是片选信号,使能信号)

结束信号:NSS信号由低变高,是SPI通讯的停止信号

数据传输:SPI通信以字节(8位)为单位进行数据传输,每个字节的最高有效位(MSB)先传输,然后是次高有效位,依此类推,直到最低有效位(LSB)传输完毕。在数据传输过程中,每次接收到的数据必须在下次数据传输前被采样,否则可能会导致数据丢失或SPI模块失效。

通信过程

1)主设备先选择要进行通信的从设备,将SS(或CS)信号置为低电平,表示选择该从设备。

2)然后,主设备开始发送时钟信号(SCK),从设备根据时钟信号来接收和发送数据。

3)主设备通过MOSI线向从设备发送数据,同时通过MISO线接收从设备发送的数据。

4)数据传输结束后,主设备将SS(或CS)信号置为高电平,表示通信结束。

SPI工作模式

在SPI操作中,最重要的两项设置就是时钟极性(clock polarityCPOL)和时钟相位(clock phaseCPHA),它们是决定数据传输 “节奏” 的两个核心参数

CPOL:0、1

CPHA:0、1

时钟极性(CPOL)定义时钟 “空闲状态”的电平

  • CPOL = 0SCK引脚在空闲状态保持低电平;
  • CPOL = 1SCK引脚在空闲状态保持高电平。

时钟相位(CPHA)定义数据的 “采样时刻”

  • 当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样
  • 当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样

时钟相位CPHA=0时,表示在奇数边沿采样,此时时钟极性CPOL=0,表示空闲状态为低电平,CPOL=1,表示空闲状态为高电平。

数码管

​​​​​​​介绍

LED数码管(LED Segment Displays)是由8个发光二极管构成,并按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点(固有时成为八段数码管)。

LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。

我们对数码管所要显示的每个数字和字母进行编码,然后在编程时,将编码放在一个数组上,需要显示什么数字或者字母,从数组里面提取相应的编码就可显示所要显示的字符了。

如图,要显示数字“5”时,编码为0x6D。如果数码管为共阳极,只需要对共阴极的编码做一个取反操作即可。

​​​​​​​74HC595芯片分析(参考其它文章)

软件SPI

​​​​​​​CubeMX初始化

打开引脚为GPIO功能

可见,通信方式为模式0

​​​​​​​SPI驱动文件创建

创建自己的.c和.h文件

​​​​​​​驱动代码编写

MySpi.c

#include "MySpi.h"#define SPI_NSS1_PORT GPIOB#define SPI_NSS1_PIN GPIO_PIN_12#define SPI_SCL_PORT GPIOB#define SPI_SCL_PIN GPIO_PIN_13#define SPI_MOSI_PORT GPIOB#define SPI_MOSI_PIN GPIO_PIN_15voidMySpi_W_NSS1(uint8_tstate){HAL_GPIO_WritePin(SPI_NSS1_PORT,SPI_NSS1_PIN,state);}voidMySpi_W_SCK(uint8_tstate){HAL_GPIO_WritePin(SPI_SCL_PORT,SPI_SCL_PIN,state);}voidMySpi_W_MOSI(uint8_tstate){HAL_GPIO_WritePin(SPI_MOSI_PORT,SPI_MOSI_PIN,state);}voidMySpi_Init(void){MySpi_W_SCK(0);MySpi_W_MOSI(0);MySpi_W_NSS1(1);}voidMySpi_Start(){MySpi_W_NSS1(0);}voidMySpi_Stop(){MySpi_W_NSS1(1);}voidMySpi_SendByte(uint8_tSendByte){for(inti=0;i<8;i++){MySpi_W_SCK(0);MySpi_W_MOSI((SendByte&0x80)?1:0);MySpi_W_SCK(1);SendByte<<=1;}}

MySpi.h

#ifndef __MYSPI_H__#define __MYSPI_H__#include "stm32u5xx_hal.h"voidMySpi_W_NSS1(uint8_tstate);voidMySpi_W_SCK(uint8_tstate);voidMySpi_W_MOSI(uint8_tstate);voidMySpi_Init(void);voidMySpi_Start();voidMySpi_Stop();voidMySpi_SendByte(uint8_tSendByte);#endif

​​​​​​​调用驱动函数实现数码管显示

/* USER CODE BEGIN 2 */MySpi_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */MySpi_Start();MySpi_SendByte(0x01);MySpi_SendByte(0x6F);MySpi_Stop();MySpi_Start();MySpi_SendByte(0x02);MySpi_SendByte(0x06);MySpi_Stop();}

​​​​​​​硬件SPI

当使用的芯片SPI外设容易卡死时,用软件SPI

当对速度要求较高时,用硬件SPI

SPI外设虽然简单好用,但是存在卡死不可靠的风险,软件SPI完全可靠,时序可以完全掌握在开发者的手中,但是速度上限低。

LCD

​​​​​​​原理

三基色:红R绿G蓝B

RGB565

一个像素点显示正绿色的十六进制0000 0111 1110 0000 =0x 07e0

320 * 240 *2 =153600

颜色深度和分辨率的区别?

颜色的深度指的是一个像素点可以有多少种颜色,一般以位为单位我们的屏幕是16位

分辨率指的是有多少个像素点

320*240*2 = 153600 字节

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:19:37

加密算法实现审查:AES/RSA等标准算法的正确性验证

加密算法实现审查&#xff1a;AES/RSA等标准算法的正确性验证 在金融交易、云存储和物联网设备日益依赖加密保障的今天&#xff0c;一个看似微小的算法偏差就可能引发系统级安全漏洞。例如&#xff0c;某开源库中因S-box初始化顺序错误导致的AES加解密失败事件&#xff0c;曾引…

作者头像 李华
网站建设 2026/4/17 16:55:46

【Docker性能监控终极指南】:掌握10大核心指标,轻松定位瓶颈

第一章&#xff1a;Docker性能监控的核心意义 在现代云原生架构中&#xff0c;Docker作为容器化技术的基石&#xff0c;广泛应用于微服务部署与持续交付流程。随着容器数量的增长和系统复杂度的提升&#xff0c;对Docker运行状态的实时掌控变得至关重要。性能监控不仅帮助运维团…

作者头像 李华
网站建设 2026/4/18 8:47:18

grbl在CNC雕刻机中的应用:实战案例详解

grbl驱动下的CNC雕刻机实战&#xff1a;从零搭建高精度桌面制造系统你有没有试过在自家书桌上&#xff0c;用一台自己组装的机器&#xff0c;把一块木头精准地雕出复杂的花纹&#xff1f;或者把设计好的电路板轮廓一比一复刻出来&#xff1f;这不再是工厂专属的能力——借助grb…

作者头像 李华
网站建设 2026/4/18 8:38:17

揭秘Docker容器资源超配难题:如何精准设置limit与reservation

第一章&#xff1a;Docker资源限制的核心机制Docker通过Linux内核的cgroups&#xff08;Control Groups&#xff09;技术实现对容器资源的精确控制。该机制允许限制、记录和隔离进程组使用的物理资源&#xff0c;如CPU、内存、磁盘I/O等&#xff0c;从而保障系统稳定性和多容器…

作者头像 李华
网站建设 2026/4/17 20:00:29

VibeThinker-1.5B是否支持中文输入?实测结果告诉你

VibeThinker-1.5B 是否支持中文输入&#xff1f;实测告诉你真相 在大模型参数竞赛愈演愈烈的今天&#xff0c;动辄百亿千亿参数的“巨无霸”模型似乎成了性能的代名词。然而&#xff0c;高昂的训练成本和推理门槛让大多数个人开发者和中小机构望而却步。正是在这种背景下&…

作者头像 李华