SPI总线(四种工作模式)

article/2025/9/18 13:41:26
1.SPI总线简介

  SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种同步串行接口。它用于CPU与各种外围器件进行全双工、同步串行通讯。它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:串行时钟线(CSK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、低电平有效从机选择线CS。当SPI工作时,在移位寄存器中的数据逐位从输出引脚(MOSI)输出(高位在前),同时从输入引脚(MISO)接收的数据逐位移到移位寄存器(高位在前)。发送一个字节后,从另一个外围器件接收的字节数据进入移位寄存器中。即完成一个字节数据传输的实质是两个器件寄存器内容的交换。主SPI的时钟信号(SCK)使传输同步。其典型系统框图如下图所示。

典型系统框图

图1 典型系统框图

  2.SPI总线的主要特点

  · 全双工;

  · 可以当作主机或从机工作;

  · 提供频率可编程时钟;

  · 发送结束中断标志;

  · 写冲突保护;

  .总线竞争保护等。

  3.SPI总线工作方式

  SPI总线有四种工作方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示):

SPI0和SPI3方式(实线表示)

图2 SPI0和SPI3方式(实线表示)

  四种工作方式时序分别为:

四种工作方式时序

图3 四种工作方式时序

 时序详解:

  CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

  CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

  工作方式1:

  当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

  工作方式2:

  当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

  工作方式3:

  当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

  工作方式4:

  当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。

  4.SPI总线常见错误

  4.1 SPR设定错误

  在从器件时钟频率小于主器件时钟频率时,如果SCK的速率设得太快,将导致接收到的数据不正确(SPI接口本身难以判断收到的数据是否正确,要在软件中处理)。

  整个系统的速度受三个因素影响:主器件时钟CLK主、从器件时钟CLK从和同步串行时钟SCK,其中SCK是对CLK主的分频,CLK从和CLK主是异步的。要使SCK无差错无遗漏地被从器件所检测到,从器件的时钟CLK从必须要足够快。下面以SCK设置为CLK主的4分频的波形为例,分析同步串行时钟、主时钟和从时钟之间的关系。

主从时钟和SCK的关系

图4主从时钟和SCK的关系

  如图4所示,当T<tsck/2,即t从<2t主时,无论主时钟和从时钟之间的相位关系如何,在从器件clk从的上升沿必然能够检测到sck的低电平,即sck=0的范围内至少包含一个clk从的上升沿。<="" p="">从<tsck 2,即t从<2t主时,无论主时钟和从时钟之间的相位关系如何,在从器件clk从的上升沿必然能够检测到sck的低电平,即sck=0的范围内至少包含一个clk从的上升沿。=""

  图5中,当T从≥TSCK/2=2T主时,在clk_s的两个上升沿都检测不到SCK的低电平,这样从器件就会漏掉一个SCK。在某些相位条件下,即使CLK从侥幸能检测到SCK的低电平,也不能保证可以继续检测到下一个SCK。只要遗漏了一个SCK,就相当于串行数据漏掉了一个位,后面继续接收/发送的数据就都是错误的了。

主从时钟和SCK的关系

图5主从时钟和SCK的关系

  根据以上的分析,SPR和主从时钟比的关系如表1所列。

表1 SPR的设置和主从时钟周期比值之间的关系


SPR的设置和主从时钟周期比值之间的关系 

  在发送数据之前按照表1对SPR进行设置,SPR设定错误可以完全避免。

  4.2 模式错误(MODF)

  模式错误表示的是主从模式选择的设置和引脚SS的连接不一致。

  器件工作在主模式的时候(MSTR=1),它的片选信号SS引脚必须接高电平。在发送数据的过程中,如果它的SS从高电平跳至低电平,在SS的下降沿,SPI模块将检测到模式错误,对MODF位置1,强制器件从主模式转入从模式(即令MSTR=0),清空内部计数器counter,并结束正在进行的数据传输,如图6(a)所示。

  对从模式(MSTR=0),在没有数据传送的时候,SS高电平表示从器件未被选中,从器件不工作,MISO输出高阻;在数据传输过程中,片选信号SS必须接低电平,且SS不允许跳变。如果SS从低电平跳到高电平,在SS的上跳沿,SPI模块也将检测到模式错误,清空内部计数器counter,并结束正在进行的数据传输。直到SS恢复为低电平,重新使SPEN=1时,才重新开始工作,如图6(b)所示。



模式错误的检测

图6模式错误的检测

  4.3 溢出错误(OVR)

  溢出错误表示连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。

  状态标志SPIF表示的是数据传输正在进行中,它对数据的传输有较大的影响。主器件的SPIF有效由数据寄存器的空标志SPTE=0产生,而从器件的SPIF有效则只能由收到的第一个SCK的跳变产生,且又由于从器件的SPIF和主器件发出的SCK是异步的,因此从器件的传输标志SPIF从相对于主器件的传输标志SPIF主有一定的滞后。如图7所示,在主器件连续发送两个数据的时候将有可能导致从器件的传输标志和主器件下一个数据的传输标志相重叠(图7中虚线和阴影部分),第一个收到的数据必然被覆盖,第二个数据的收/发也必然出错,产生溢出错误。

溢出错误

图7溢出错误

  通过对从器件的波形分析发现,counter=8后的第一个时钟周期,数据最后一位的传输已经完成。在数据已经收/发完毕的情况下,counter=8状态的长短对数据的正确性没有影响,因此可以缩短counter=8的状态,以避免前一个SPIF和后一个SPIF相重叠。这样,从硬件上避免了这一阶段的溢出错误。

  但是,如果从器件工作速度不够快或者软件正在处理其他事情,在SPI接口接收到的数据尚未被读取的情况下,又接收到一个新的数据,溢出错误还是会发生的。此时,SPI接口保护前一个数据不被覆盖,舍弃新收到的数据,置溢出标志OVR=1;另外发出中断信号(如果该中断允许),通知从器件及时读取数据。

  4.4 偏移错误(OFST)

  SPI接口一般要求从器件先工作,然后主器件才开始发送数据。有时在主器件往外发送数据的过程中,从器件才开始工作,或者SCK受到外界干扰,从器件未能准确地接收到8个SCK。如图8所示,从器件接收到的8个SCK其实是属于主器件发送相邻的两个数据的SCK主。这时,主器件的SPIF和从器件的SPIF会发生重叠,数据发生了错位,从器件如果不对此进行纠正的话,数据的接收/发送便一直地错下去。

偏移错误

图8偏移错误

  在一个数据的传输过程中,SPR是不允许改变的,即SCK是均匀的,而从图5可以看出,从器件接收到的8个SCK并不均匀,它们是分别属于两个数据的,因此可以计算SCK的占空时间来判断是否发生了偏移错误。经分析,正常时候SCK=1时的时钟周期数n的取值满足如下关系:


  但由于主从时钟之间是异步的,并且经过了取整,所以正常时候SCK=1时的时钟周期计数值COUNT应满足:

  比如在图5中,COUNT的最大值COUNT(max)=2或者1,都可认为是正常的。但当出现COUNT(max)=8时,可以判定出现了偏移错误。在实际设计中,先记录下第一个COUNT(max)的值,如果后面又出现与记录值相差1以上的COUNT(max)出现,可知有偏移错误OFST发生。SPI接口在“不均匀”的地方令SPIF=1,然后准备等待下一个数据的第一个SCK。其中COUNT的位数固定为8位,为了避免溢出时重新从00H开始计数,当计数达到ffH时停止计数。

  4.5 其他错误

  设定不当,或者受到外界干扰,数据传输难免会发生错误,或者有时软件对错误的种类判断不清,必须要有一种方法强制SPI接口从错误状态中恢复过来。在SPI不工作,即SPEN=0的时候,清除SPI模块内部几乎所有的状态(专用寄存器除外)。如果软件在接收数据的时候,能够发现数据有错误,无论是什么错误,都可以强制停止SPI的工作,重新进行数据传输。例如,在偏移错误(OFST)中,如果SPR2、SPR1和SPR0的设置适当,也可以使SCK显得比较“均匀”。SPI接口硬件本身不可能检测到有错误,若用户软件能够发现错误,这时就可以强制停止SPI的传输工作,这样就可以避免错误一直持续下去。

  在应用中,如果对数据的正确性要求较高,除了要在软件上满足SPI接口的时序要求外,还需要在软件上作适当的处理。

  5.设计SPI总线控制器

  目前的项目中使用了SPI总线接口的FLASH存储器存储图像数据。FLASH的SPI总线频率高达66M,但MCU的频率较低,晶振频率7.3728M,SPI最大频率为主频1/2。对于320*240*16的图像读取时间为333ms,而且还忽略了等待SPI传输完成、写显存、地址坐标设定等时间。实际测试约为1s。成为GUI设计的极大瓶颈。由于TFT驱动是自己FPGA设计的,资源尚有余量,决定把SPI控制器(主)及写图像部分逻辑放入FPGA中用硬件完成。

  首先接触到的是SPI的SCK时钟频率问题。FPGA的频率是48M,未使用PLL。能否以此频率作为SCK频率呢?要知道所有的MCU提供的SPI频率最大为主频的1/2!为什么呢?查过一些资料后发现,SPI从机接收数据并不是以SCK为时钟的,而是以主频为时钟对SCK和MISO进行采样,由采样原理得知SCK不能大于1/2主频,也就有了MCU提供最大master频率是1/2主频,最大slaver频率是1/4主频。FPGA在只作为主机时能否实现同主频一样频率的SCK呢??答案貌似是肯定的!但我还是有点担心,用组合逻辑控制SCK会不会出现较大毛刺影响系统稳定性呢?


模式错误的检测

图6模式错误的检测

  4.3 溢出错误(OVR)

  溢出错误表示连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。

  状态标志SPIF表示的是数据传输正在进行中,它对数据的传输有较大的影响。主器件的SPIF有效由数据寄存器的空标志SPTE=0产生,而从器件的SPIF有效则只能由收到的第一个SCK的跳变产生,且又由于从器件的SPIF和主器件发出的SCK是异步的,因此从器件的传输标志SPIF从相对于主器件的传输标志SPIF主有一定的滞后。如图7所示,在主器件连续发送两个数据的时候将有可能导致从器件的传输标志和主器件下一个数据的传输标志相重叠(图7中虚线和阴影部分),第一个收到的数据必然被覆盖,第二个数据的收/发也必然出错,产生溢出错误。

溢出错误

图7溢出错误

  通过对从器件的波形分析发现,counter=8后的第一个时钟周期,数据最后一位的传输已经完成。在数据已经收/发完毕的情况下,counter=8状态的长短对数据的正确性没有影响,因此可以缩短counter=8的状态,以避免前一个SPIF和后一个SPIF相


http://chatgpt.dhexx.cn/article/ZjDxR4io.shtml

相关文章

SPI总线通讯协议学习

目录 什么是SPI 信号线 理解通讯原理 采样 SPI的推广 什么是SPI SPI是芯片与芯片之间的通讯,准确得说是串行同步通讯。既然都说了同步&#xff0c;那发送数据当然要和时钟线SCK配合才能发数据. 采用一主多从的模式&#xff0c;主机只有一个,而从机可以有若干个。 信号线 …

SPI总线通信——基于STM32MP157A

SPI总线概念 SPI总线是Motorola首先提出的全双工三线/四线同步串行总线&#xff0c;采用主从模式&#xff08;Master Slave&#xff09;架构&#xff1b;支持多从机&#xff08;slave&#xff09;模式应用&#xff0c;一般仅支持单主机&#xff0c;多从机。 时钟由主机控制&…

SPI总线传输的模式

SPI总线传输一共有4中模式&#xff0c;这4种模式分别由时钟极性(CPOL&#xff0c;Clock Polarity)和时钟相位(CPHA&#xff0c;Clock Phase)来定义&#xff0c;其中CPOL参数规定了SCK时钟信号空闲状态的电平&#xff0c;CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采…

SPI总线协议及SPI时序图详解

SPI&#xff0c;是英语Serial Peripheral Interface的缩写&#xff0c;顾名思义就是串行外围设备接口。SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为P…

SPI总线 通俗易懂讲解

转自&#xff1a;http://bbs.mydigit.cn/read.php?tid726343 SPI总线 MOTOROLA公司的SPI总线的基本信号线为3根传输线&#xff0c;即SI、SO、SCK。传输的速率由时钟信号SCK决定&#xff0c;SI为数据输入、SO为数据输出。采用SPI总线的系统如图8-27所示&#xff0c;它包含了一…

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

Linux总线之SPI

文章目录 1.spi总线驱动1.1spi简介1.2spi时序解析1.3spi驱动框架1.4spi设备驱动的API1.5spi驱动的实例1.6m74hc595设备树的填充1.6.1m74hc595操作数码管的原理图1.6.2控制器的设备树1.6.3编写自己的设备树 1.7spi相关的结构体及函数1.8spi驱动的实例21.9让数码管流水显示0-f 1.…

SPI总线协议详解

目录 一.概述 二.特点 1.寻址方式 2.采用主-从模式(Master-Slave) 的控制方式 3.采用同步方式(Synchronous)传输数据 4.极性和相位 三.SPI总线传输的模式 四.SPI和I2C的区别 一.概述 SPI(serial peripheral interface)是一种同步串行通信协议&#xff0c;由一个主设备和…

SPI简介

SPI全称是Serial Perripheral Interface&#xff0c;也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术&#xff0c;是一种高速&#xff0c;全双工的同步通信总线。SPI时钟频率相比IIC要高很多&#xff0c;最高可以工作在上百MHZ。 SPI以主从方式工作&…

SPI通信总线基本概念

SPI总线概述 SPI总线介绍 SPI(Serial Peripheral interface)&#xff1a;是由Motorola公司开发的串行外围设备接口&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c;AD转换器&…

SPI通信总线

SPI通信总线 注意 常用的内部通信接口&#xff1a;UART、IIC、SPI&#xff0c;大多数是用于芯片之间的通信&#xff0c;特点是速度快&#xff0c;距离比较短 常用的外部通信接口&#xff1a;RS-232&#xff0c;RS-485&#xff0c;CAN&#xff0c;大多用于远距离传输&#xf…

FPGA——SPI总线详解(概念)

目录 SPI简介 SPI4种模式&#xff1a; SPI时序 使用SPI总线实现对flash的控制 flash芯片管脚&#xff1a; flash芯片存储 写使能模块 读状态模块 擦除模块 页读模块 页写模块 SPI简介 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一…

SPI总线详解笔记

目录 1. 简介 1.1 概述 1.2 特征 1.3 操作模式 2. 外部信号说明 2.1 概述 2.2 信号详细说明 2.2.1 MOSI 2.2.2 MISO 2.2.3 SS 2.2.4 SCK 3. 存储器映射/寄存器定义 3.1 寄存器说明 3.1.1 SPI Control Register 1 3.1.2 SPI Control Register 2 3.1.3 SPI Baud R…

SPI总线规范

SPI是英文Serial Peripheral Interface的缩写&#xff0c;中文意思是串行外围设备接口&#xff0c;SPI是Motorola公司推出的一种同步串行通讯方式&#xff0c;是一种三线同步总线&#xff0c;因其硬件功能很强&#xff0c;与SPI有关的软件就相当简单&#xff0c;使CPU有更多的时…

SPI总线(一):基本原理篇

相关文章&#xff1a; SPI总线&#xff08;二&#xff09;&#xff1a;驱动分析篇 SPI总线&#xff08;三&#xff09;&#xff1a;驱动实例 1、什么是SPI&#xff1f; SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术&a…

关于IIC和SPI总线

IICvs SPI 现今&#xff0c;在低端数字通信应用领域&#xff0c;我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips&#xff08;for IIC&#xff09;和Motorola&#xff08…

I2C和SPI总线对比

最近2周一直在调试IIC和SPI总线设备&#xff0c;这里记录一下2种总线&#xff0c;以备后忘。 一 IIC总线 I2C--INTER-IC串行总线的缩写&#xff0c;是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线&#xff08;SDA&#xff09;和1根串行时钟线&#xff08;SCL&#…

SPI总线介绍

一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现…

I2C总线和SPI总线的异同点

文章目录 1、内部总线、系统总线、外部总线的概念2、总线通信的基本概念3、I2C和SPI的经典物理层结构4、I2C总线与SPI总线的区别5、I2C总线和SPI总线的共同点 1、内部总线、系统总线、外部总线的概念 总线的分类方式是根据离芯片远近等级进行分类的&#xff1a;内部总线是外设…

SPI总线

【1】SPI总线相关的概念 1》SPI接口是Motorola 首先提出的全双工同步串行外围接口&#xff0c;采用主从模式&#xff08;Master Slave&#xff09;架构&#xff1b; 2》支持多slave模式应用&#xff0c;一般仅支持单Master。 3》时钟由Master控制&#xff0c;在时钟移位脉冲下…