news 2026/4/24 11:52:16

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/19 21:27:10

数论难题挑战:用VibeThinker尝试破解哥德巴赫猜想简化版

用VibeThinker挑战数论难题&#xff1a;一次轻量模型的高阶推理实践 在编程竞赛圈里&#xff0c;一个流传已久的段子是&#xff1a;“能手推哥德巴赫猜想的人&#xff0c;早就去拿菲尔兹奖了。”这句玩笑背后&#xff0c;其实藏着人们对数学深度与逻辑严密性的敬畏。然而&#…

作者头像 李华
网站建设 2026/4/17 15:19:26

VibeThinker-1.5B代码生成实测:结构化逻辑拆解能力媲美中型模型

VibeThinker-1.5B代码生成实测&#xff1a;结构化逻辑拆解能力媲美中型模型 在算法竞赛的深夜训练营里&#xff0c;一个学生盯着“Two Sum”变种题苦思良久——输入数组有序、要求常数空间、不能使用哈希表。他尝试了几种双指针写法都未能通过所有测试用例。如果这时有个助手能…

作者头像 李华
网站建设 2026/4/23 15:30:15

Magistral Medium被超越?VibeThinker-1.5B在v6测试中反超

VibeThinker-1.5B&#xff1a;小模型如何在推理赛道反超大模型&#xff1f; 在AIME数学竞赛题上得分80.3&#xff0c;超越参数量超400倍的DeepSeek-R1&#xff1b;在LiveCodeBench v6编程基准测试中拿下51.1分&#xff0c;首次超过Magistral Medium&#xff08;50.3&#xff09…

作者头像 李华
网站建设 2026/4/18 10:36:45

图解说明工业控制PCB布线规则设计典型结构

工业控制PCB布线实战&#xff1a;从噪声隔离到信号完整性的系统设计 在工业自动化现场&#xff0c;一台PLC模块突然频繁重启&#xff1b;一个温度采集系统读数漂移严重&#xff0c;误差超出允许范围&#xff1b;一条CAN总线通信时断时续&#xff0c;却查不出明显故障点——这些…

作者头像 李华
网站建设 2026/4/22 17:26:30

企业能否用VibeThinker降本增效?适用场景与限制分析

企业能否用VibeThinker降本增效&#xff1f;适用场景与限制分析 在AI模型越做越大、算力军备竞赛愈演愈烈的今天&#xff0c;一家企业是否还有可能以不到一万人民币的成本&#xff0c;部署一个能解奥数题、写算法代码的“智能专家”&#xff1f;这听起来像天方夜谭&#xff0c;…

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

【稀缺技术揭秘】:企业级Docker镜像缓存策略,仅1%工程师掌握

第一章&#xff1a;企业级Docker镜像缓存的核心价值在现代企业级应用交付体系中&#xff0c;Docker镜像的构建与分发效率直接影响开发迭代速度和部署稳定性。镜像缓存机制作为优化CI/CD流水线的关键环节&#xff0c;能够显著减少重复拉取和构建的时间开销。提升构建效率 Docker…

作者头像 李华