当前位置: 首页 > news >正文

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 字节

http://www.jsqmd.com/news/204256/

相关文章:

  • 别再手动分配流量了!5步实现Docker微服务自动负载均衡
  • VibeThinker-1.5B的局限性有哪些?开发者必须知道的事
  • 如何用Docker实现毫秒级服务发现与动态负载均衡?一线大厂架构师亲授
  • 苏州会议餐配送/苏州盒饭配送/苏州工作餐配送哪家好?2026年苏州餐饮公司实力盘点 - 栗子测评
  • 地理空间数据分析:处理经纬度坐标与区域划分问题
  • Docker多容器日志集中处理方案(ELK+Fluentd实战落地)
  • ‌低代码AI测试平台实操教程
  • 计算机网络MTU分片问题:VibeThinker计算传输效率
  • 系统学习screen指令:全面讲解参数选项与实际场景
  • 2025年乌鲁木齐装修公司权威推荐榜单:新房装修/别墅装修/装修质量/装修价格/装修全包本地服务商精选 - 品牌推荐官
  • HBuilderX与Android Studio协同配置:Windows实战说明
  • 2026年 电线电缆回收厂家权威推荐榜:废旧电缆/工程剩余电缆/二手电线电缆专业回收服务深度解析 - 品牌企业推荐师(官方)
  • 新定义问题(24年甘肃兰州中考真题)
  • 网盘直链下载助手流行背后,是开发者对高效资源的渴求——如同VibeThinker
  • 企业能否用VibeThinker降本增效?适用场景与限制分析
  • ‌AI赋能安全测试:漏洞检测新方法
  • 2026年热门的电动堆高车厂家推荐 - 栗子测评
  • 2026年口碑好的白光干涉仪厂家推荐,靠谱供应商与专业技术企业全解析 - myqiye
  • Web前端也能玩转大模型?结合VibeThinker实现智能代码补全
  • 【架构师私藏干货】:构建稳定Docker多容器环境的6大黄金法则
  • 实测VibeThinker-1.5B:用英语提问提升算法解题准确率
  • 大润发购物卡回收价格表,大润发怎么挂失补办 - 京回收小程序
  • 2026年靠谱磁分离机实力服务企业排行榜,新测评精选磁分离机生产企业推荐 - mypinpai
  • Git多项目协作混乱?用Docker实现工作树隔离的4种高阶方案
  • 免费开源!这个自愈测试框架,让我的脚本活了3年
  • 测试工程师必学的AI算法基础
  • 2026电饭煲选购全指南:苏泊尔旋焰釜为何被实验室列为“米饭口感基准机” - 品牌推荐排行榜
  • 法律条文推理应用:基于给定案情推测可能判决结果
  • 不用写代码!这个低代码平台,让产品经理自己跑测试
  • 为什么你的微服务响应变慢?90%的人都忽略了这3个负载均衡陷阱