当前位置:网站首页 > 技术博客 > 正文

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



SPI(Serial Peripheral Interface,串行外设接口) 协议是一种高速高效率、全双工的通信总线,允许CPu与低速的外围设备之间进行同步串行数据的传输,主要是用同步的时钟信号对串行的数据同时进行发送和接收操作,从而实现全双工。常用于短距离通讯,主要是在嵌入式系统中。
SPI接口在芯片内部只占用四根线,主要有两条数据线、一根片选线和一根时钟信号线。这四根线分别对应SPI协议传输时的四种信号,分别有主机输出信号MOSI、从机输入信号MISO、片选信号sS n以及输出的时钟信号SCK。
SPI协议里定义了主模式和从模式两种工作方式,在协议里规定工作在主模式下的模块是主机,工作在从模式下的模块是从机。主机和从机之间按照SPI时序要求进行数据交换。
一个典型的SPI系统应包括只能有一个主机、一个或多个从机。

SPI接口只能有一个主机,但可以有一个或多个从机。下图显示了主机和从机之间的SPI连接。在这里插入图片描述

名称解释SCLKSerial Clock (output from master); master输出至slave的通讯时钟MOSIMaster Output, Slave Input(output from master); 自master输出至slave的数据线MISOSOMI: Master Input, Slave Output(output from slave); 自slave输出至master的数据线SSSlave Select (active low, outputfrom master). master对slave的片选信号,自master输出至slave,低有效。

多个从机可与单个SPI主机一起使用。从机可以采用常规模式连接,或采用菊花链模式连接。
常规SPI模式
在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。
在这里插入图片描述

菊花链模式:
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机 。
在这里插入图片描述

SPI数据通信的流程可以分为以下四步:

1、主设备发起信号,将CS/SS拉低,选择片选,启动通信。

2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),根据spi模式而定),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。

3、主机(Master)将要发送的数据写到发送数据缓存区(Memory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

SPI总线上的数据传输由串行时钟SCK进行同步处理,串行时钟SCK由SPI主机产生,每个时钟周期仅发送1bit数据。,SPI有四种操作模式——SPI0、SPI1、SPI2和SPI3,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极性(clock polarity)CPOL与时钟相位(clock phase)CPHA。

2.2.1 时钟极性与时钟相位

CPOL表示SCK的空闲状态的有效电平;
CPOL = 0表示SCK的空闲状态是低电平,CPOL = 1表示SCK的空闲状态是高电平;
CPHA规定了数据的采样时间;
CPHA = 0表示在SCK的有效电平的第一个跳变边沿进行数据采样,CPHA = 1表示在SCK的有效电平的第二个跳边沿进行数据采样;
在这里插入图片描述在这里插入图片描述

2.2.2 SPI模式

SPI0: 时钟极性和时钟相位均为0。
SCK空闲状态为低电平,SCK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。主机数据在第一个跳变沿被从机采样。
SPI1: 时钟极性为0,时钟相位为1。
SPI2: 时钟极性为1,时钟相位为0。
SPI3: 时钟极性和时钟相位均为1。
SCK空闲状态为高电平,SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。主机数据在第二个跳变沿被从机采样,数据发送在第1个边沿。

2.2.3 图文实例讲解

下图示例中简单模拟SPI通信流程,主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0X53,在MISO线路一位一位接收数据0X46,如下图所示,本例中主从设备只进行单写和单读方式,其实是同时可以读写,如下MOSI中主机发送数据0x53,但是忽略从机发的数据:

在这里插入图片描述
注意:
最开始第一个时钟周期片选信号拉低之后数据传输过程:
以spi0(SCK空闲状态为低电平,数据采样是在上升沿)举例 :
我们来关注SCK的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿),在时钟的后沿输出数据(下降沿,第二个时钟沿)。首先来看主器件,主器件的输出口(MOSI)输出的数据bit1,在时钟的前沿被从器件采样,那主器件是在何时刻输出bit1的呢?bit1的输出时刻实际上在SCK信号有效以前,比SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。再来看从器件,从器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit1的,那从器件又是在何时刻输出bit1的呢。从器件是在SSEL信号有效后,立即输出bit1,尽管此时SCK信号还没有起效,记住关键,spi是全双工,在发数据的同时,也会进行数据的采集,主从设备采集数据的时钟相位一致,本例中都是上升沿采样。
在这里插入图片描述

优点
无起始位和停止位,因此数据位可以连续传输而不会被中断;
没有像I2C这样复杂的从设备寻址系统;
数据传输速率比I2C更高(几乎快两倍);
分离的MISO和MOSI信号线,因此可以同时发送和接收数据;
极其灵活的数据传输,不限于8位,它可以是任意大小的字;
非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

缺点

使用四根信号线(I2C和UART使用两根信号线);
无法确认是否已成功接收数据(I2C拥有此功能);
没有任何形式的错误检查,如UART中的奇偶校验位;
只允许一个主设备;
没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
没有定义硬件级别的错误检查协议;
与RS-232和CAN总线相比,只能支持非常短的距离;

  • 上一篇: devc编写c程序怎么运行
  • 下一篇: xml转换器
  • 版权声明


    相关文章:

  • devc编写c程序怎么运行2024-11-20 16:30:01
  • c语言if(!f)函数的使用方法?2024-11-20 16:30:01
  • 驼峰命名什么意思2024-11-20 16:30:01
  • microsoft edge快捷键编辑2024-11-20 16:30:01
  • 壁仞科技怎么样知乎2024-11-20 16:30:01
  • xml转换器2024-11-20 16:30:01
  • 王码五笔输入法86版的字根全面吗?2024-11-20 16:30:01
  • html登陆页面密码加密2024-11-20 16:30:01
  • vmware虚拟机版本不兼容2024-11-20 16:30:01
  • 86版五笔字型2024-11-20 16:30:01