news 2026/6/10 20:31:52

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/6/10 16:04:32

微博开源黑科技:15亿参数模型解决Codeforces级别难题

微博开源黑科技&#xff1a;15亿参数模型解决Codeforces级别难题 在算法竞赛圈&#xff0c;一个长期存在的现实是——顶尖解题能力几乎被大模型垄断。想要自动求解一道Codeforces Div.1的难题&#xff1f;你可能需要调用一个百亿参数以上的庞然大物&#xff0c;还得支付高昂的A…

作者头像 李华
网站建设 2026/6/8 6:23:31

深度测评10个AI论文软件,专科生搞定毕业论文+格式规范!

深度测评10个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI 工具如何改变论文写作的未来 随着人工智能技术的不断进步&#xff0c;AI 工具在学术领域的应用越来越广泛。对于专科生而言&#xff0c;撰写毕业论文不仅是学业的重要环节&#xff0c;也是对个人…

作者头像 李华
网站建设 2026/6/10 1:10:04

国内Docker镜像源已支持VibeThinker-1.5B一键部署

国内Docker镜像源支持 VibeThinker-1.5B 一键部署&#xff1a;轻量模型的高性能实践 在当前大模型动辄数百亿参数、训练成本高企的背景下&#xff0c;一个仅含15亿参数却能在数学与编程推理任务中媲美中型模型的表现&#xff0c;无疑令人眼前一亮。微博团队开源的 VibeThinker-…

作者头像 李华
网站建设 2026/6/10 11:53:15

为什么说VibeThinker-1.5B是性价比最高的推理型小模型

VibeThinker-1.5B&#xff1a;小模型如何实现推理性能的“越级挑战” 在大模型参数竞赛愈演愈烈的今天&#xff0c;一个仅15亿参数、训练成本不到8000美元的开源模型&#xff0c;却在数学与代码推理任务中频频击败数十倍甚至上百倍于其规模的“巨无霸”——这听起来像技术圈的黑…

作者头像 李华
网站建设 2026/6/5 10:05:21

FastAPI 请求验证的进阶之道:超越 `Field` 与基础模型

好的&#xff0c;这是一个根据您的要求生成的、关于FastAPI请求验证的深度技术文章。文章以“超越基础验证”为视角&#xff0c;探讨了FastAPI与Pydantic深度整合下的高级验证技巧与实践。 # FastAPI 请求验证的进阶之道&#xff1a;超越 Field 与基础模型## 引言&#xff1a;F…

作者头像 李华