嵌入式硬件通信接口协议-SPI(一)协议基础

2023-10-24 11:59

本文主要是介绍嵌入式硬件通信接口协议-SPI(一)协议基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章首发于同名微信公众号:DigCore

欢迎关注同名微信公众号:DigCore,及时获取最新技术博文。

原文链接:https://mp.weixin.qq.com/s/hDUK43s8naybJLvoE2UsoA

 

本节继续讲嵌入式硬件通信接口协议中的另外一个串行通信接口-SPI。相比于UART串口协议,SPI又有着其独特之处。

 

  • 简介

SPI(全称SerialPeripheral Interface),串行外设接口。

SPI是串行外设接口(SerialPeripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。

--from 百度百科

https://baike.baidu.com/item/SPI

 

 

该接口由摩托罗拉在20世纪80年代中期开发,并已成为事实标准。

--from Wiki

https://en.wikipedia.org/wiki/Serial_Peripheral_Interface

 

从维基百科查阅的的“事实标准”,在这来科普一下知识盲点:

 

事实标准是指非由标准化组织制定的,而是由处于技术领先地位的企业、企业集团制定(有的还需行业联盟组织认可,如DVD标准需经DVD论坛认可),由市场实际接纳的技术标准。

--from 百度百科

https://baike.baidu.com/item/事实标准

 

SPI接口定义了一主多从这样的一个通信架构,在同一SPI总线上只有一个主机,可以有多个从机。这样的架构就限制了通信的主动权只能在主机端,主机发起一次通信,从机做出想要。

 

  • 信号线


SPI被称为四线串行总线,其信号线分别有:

SCLK:串行时钟(主机输出)

MOSI:主输出从机输入或主机输出从机输入(主机输出的数据)

MISO:主输入从输出或主输入从输出(从输出的数据输出)

SS:从机选择(通常为低电平有效,主机输出)

 

信号线命名也是五花八门,以下的命名也是会遇见的:

 

串口时钟

SCLK:SCK

主输出--->从输入(MOSI):

SIMO,MTSR - 对应主设备和从设备上的MOSI,相互连接

SDI,DI,DIN,SI - 在从设备上; 连接到主设备上的MOSI,或连接到下面的连接

SDO,DO,DOUT,SO - 在主设备上; 连接到从站上的MOSI,或连接到上面的连接

主输入<---从输出(MISO):

SOMI,MRST - 对应主设备和从设备上的MISO,相互连接

SDO,DO,DOUT,SO - 在从设备上; 连接到主设备上的MISO,或连接到下面的连接

SDI,DI,DIN,SI - 主设备; 连接到奴隶上的MISO或上面的连接

从机选择:

SS:S̅S̅,SSEL,CS,C̅S̅,CE,nSS,/ SS,SS#

 

以上容易让人混淆的名字是SDO、SDI、DOUT、DIN等,这些都需要看具体印在主设备还是从设备上单独讨论。但是一般的还是尽量写清写规范,这样不容易产生歧义。

 

SPI作为同步串行接口,可以认为有两个同步信号,第一个是从机选择SS信号,告知被选中的从机,准备开始进行SPI通信,第二个是同步时钟信号SCLK,收发双方进行数据的交互时,都是基于SCLK的跳变进行逐bit输出和采样的

 

四根信号线并非全部都需要,根据工作模式,可以配置成两线、三线。

 

在STM32CubeMX工具的配置页面,可以很清楚看到,配置不同的工作模式时,对应被使能的芯片管脚有何不同:

 

 

 

 

对比发现,全双工的四线和三线的区别是从机选择信号NSS。这种情况一般是因为SPI总线上只有一主一从的通信架构,从机的NSS信号一直接低电平,不需要做从机选择。

 

 

  • 信号时序


四线SPI接口的时序一般的总是先拉低从机选择信号线SS,然后输出SCLK,带着数据MOSI,此时MISO为高阻态。大致如下如:

 

一般有SPI接口的器件,在Spec上都会有对应的时序图,这里分别截取SPI接口FLASH型号为GD25Q32C、SPI接口OLED型号为QG-2832TLBFG04,这两器件的Spec内关于SPI时序部分的介绍,如下两张截图:

 

 

 

对比不难发现,时序图的规范,定义了各个信号线输出电平的顺序和时延,还定义了时钟信号跳变沿与数据信号的“对齐”,这里的“对齐”实际上就是数据的输出和采样。

 

同样的,这个时序规范了SPI器件所呈现的SPI接口信号线特性,包括:时钟上升、下降沿时长;片选与时钟跳变沿之间的时延;时钟边缘与数据线保持的时长…

 

这些时序特性,都在明确了SPI主机与其通信时,要求不超出其定义的范围,否则从机器件响应不及时而导致通信异常。

 

不同的器件,对SPI接口的信号时序要求也会不同。第一张简明的时序图,而基于这样的时序图,SPI接口又可以配置不同的接口配置参数。

 

  • 接口配置项


一般在开发时,接口的可选配置有:接口模式(实际配置的是单、双工模式选择)、设备主从模式、数据宽度、时钟极性(CPOL:)、时钟相位(CPHA)、时钟速率、数据bit位大小端选择。

 

  • 接口模式


标准的四线SPI接口,使用的场景是主从机进行数据交互的通信,两方都有数据的收发过程,而在LCD/OLED这样的SPI接口作为从设备的器件中,就不需要数据返回给主机,只需要接收来自主机的控制信息和显示的数据。

 

基于这样的使用场景,就可以配置成三线的单工通信,即仅需要从机选择SS、时钟SCLK、数据输出MOSI即可。

 

  • 设备主从模式


这个配置一般需要看芯片是否支持,可将芯片配置成SPI主机或者从机,能更好地集成在项目的系统中。

 

  • 数据宽度


顾名思义,就是发送数据可以配置成8bit、16bit等,这也是根据芯片而定。

 

  • 时钟极性、时钟相位


这两者分别是CPOL(Clock PolarityCPHA(Clock Phase,极性就是指高低电平,这个定义了SPI总线在空闲状态下,时钟保持高电平还是低电平,因为这个关系到了SPI通信时第一个时钟跳变沿是上升还是下降沿;相位指的是时钟的跳变沿,指定了数据信号的输出和采样如何与时钟对齐。

 

这两个配置,在Wiki和百度百科上都做了非常清晰的解释,这里截图引用如下:

 

 

 

 

  • 时钟速率

速率选择定义了时钟信号线在数据传输是的翻转速率,这体现到每个芯片定义的接口时序图中,即可承受的速率范围,如果主机设的速率太快,而从机响应过慢会导致通信失败。

 

  • 数据bit位大小端选择


数据的发送优先bit可配置,从上篇的UART协议可以知道,UART规定了数据优先发bit0,而这个SPI是可配置优先发送bit的,可设置最低位或者最高位。

 

从FLASH型号为GD25Q32和OLED型号为QG-2832TLBFG04的时序截图可看到,这两个器件都是优先发MSB,也就是最高位优先。

 

再对比一款字库芯片型号为GT21L16S2W的读取指令:

 

可见SPI器件普遍采用MSB的发送优先顺序。

 

总结SPI通信接口,一主多从的通信架构,标准模式有四根信号线、依靠选择信号SS开始通信、时钟信号SCLK进行逐bit输出和采样、可配置的采样时刻和可选择的优先发出bit。

 


参考资料:

《SPI》@百度百科

https://baike.baidu.com/item/SPI

《SPI》@Wiki

https://en.wikipedia.org/wiki/Serial_Peripheral_Interface


★★★★★推荐文章

《嵌入式硬件通信接口-使用RingBuffer处理数据(二)详细设计过程》

《嵌入式硬件通信接口-使用RingBuffer处理数据(一)》

 

《快速开发MQTT(一)电子工程师眼中的MQTT》

《快速开发MQTT(二)初识MQTT》

《MQTT客户端搭建-最清晰的MQTT协议架构》

《MQTT服务端搭建-最快方式验证自己开发的客户端》

 

★★★★★相似文章

《嵌入式硬件通信接口协议-UART(五)数据包设计与解析》

《嵌入式硬件通信接口协议-UART(四)设计起止式的应用层协议》

《嵌入式硬件通信接口协议-UART(三)快速使用串口及应用》

《嵌入式硬件通信接口协议-UART(二)不同电气规范下的标准》

《嵌入式硬件通信接口协议-UART(一)协议基础》

 

★★★★★扩展阅读

《【硬件电路】AltiumDesigner18规则检查含义》

《【硬件电路】N沟道、P沟道MOS管基本原理与应用案例》

 


 

www.digcore.cn

更多技术干货等你来拿

长按二维码关注

这篇关于嵌入式硬件通信接口协议-SPI(一)协议基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275018

相关文章

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close