原来SPI并没有我想的那么简单

先说串口

之前写过一篇UART,通用串行异步通讯协议,因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

如果要解决这个问题,UART为每个字节添加额外的起始位停止位,以帮助接收器在数据到达时进行同步;

双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。

传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示;

串口传输的过程

如果您注意到上图中的不等于0x53,这是一个细节。串口协议通常会首先发送最低有效位,因此最小位在最左边。低四位字节实际上是,高四位字节是。

异步串行工作得很好,但是在每个字节发送的时候都需要额外的起始位停止位以及在发送和接收数据所需的复杂硬件方面都有很多开销。

不难发现,如果接收端和发送端设置的速度都不一致,那么接收到的数据将是垃圾(乱码)。

下面开始讲一下SPI协议,会有哪些优点。

SPI通讯协议

于是我们想有没有更好一点的串行通讯方式;相比较于,的工作方式略有不同。

是一个同步的数据总线,也就是说它是用单独的数据线一个单独的时钟信号来保证发送端和接收端的完美同步

时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。

产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);

数据的采集时机可能是时钟信号上升沿(从低到高)或下降沿(从高到低)。

具体要看对SPI的配置;

整体的传输大概可以分为以下几个过程:

主机先将信号拉低,这样保证开始接收数据;

接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1);

由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。

主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从信号线上进行发送到从机;

主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过信号线发送;

具体如下图所示;

SPI的时序

注意,SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;

SPI特性

SPI总线包括4条逻辑线,定义如下:

MISO: 主机输入,从机输出(数据来自从机);

MOSI: 主机输出,从机输入(数据来自主机);

SCLK: 串行时钟信号,由主机产生发送给从机;

SS: 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;

MISO也可以是,,,或(在主机端);

MOSI也可以是,,,或(在主机端);

NSS也可以是,或;

SCLK也可以是;

本文将按照以下命名进行讲解

下图显示了单个主机和单个从机之间的典型SPI连接。

主从连接

时钟频率

SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输

主机在线上发送一位数据,从机读取它,而从机在线上发送一位数据,主机读取它。

就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;

从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。

时钟极性 CKP/Clock Polarity

除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性

根据硬件制造商的命名规则不同,时钟极性通常写为CKPCPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;

CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。

:时钟空闲为低电平 ;

:时钟空闲为高电平;

时钟相位 CKE /Clock Phase (Edge)

除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKECPHA

顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

:在时钟信号的第一个跳变沿采样;

:在时钟信号的第二个跳变沿采样;

时钟配置总结

综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;

其中黑色线为采样数据的时刻;

蓝色线为SCK时钟信号;

具体如下图所示;

模式编号

SPI的时钟极性和相位的配置通常称为SPI模式,所有可能的模式都遵循以下约定;具体如下表所示;

除此之外,我们还应该仔细检查微控制器数据手册中包含的模式表,以确保一切正常。

多从机模式

前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:

第一种方法:多NSS

通常,每个从机都需要一条单独的SS线。

如果要和特定的从机进行通讯,可以将相应的信号线拉低,并保持其他信号线的状态为高电平;如果同时将两个信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条线上传输数据,最终导致接收数据乱码。

具体连接方式如下图所示;

多NSS连接

第二种方法:菊花链

在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链

菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;

另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

具体的连接如下图所示;

菊花链连接

其中红线加粗为数据的流向;

所以最终的数据流向图可以表示为:

数据流图

SCK为时钟信号,8clks表示8个边沿信号;

其中D为数据,X为无效数据;

所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

优缺点

SPI通讯的优势

使SPI作为串行通信接口脱颖而出的原因很多;

全双工串行通信;

高速数据传输速率。

简单的软件配置;

极其灵活的数据传输,不限于8位,它可以是任意大小的字;

非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

SPI的缺点

没有硬件从机应答信号(主机可能在不知情的情况下无处发送);

通常仅支持一个主设备;

需要更多的引脚(与I2C不同);

没有定义硬件级别的错误检查协议;

与RS-232和CAN总线相比,只能支持非常短的距离;

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是SPI_FLASH的相关资料: 1. 什么是SPI_FLASH? SPI_FLASH是一种使用串行外设接口(SPI通信协议的闪存存储器。它与常规的闪存存储器相比,具有更快的读取速度,更低的功耗和更小的封装。 2. SPI_FLASH的特点 - 通过SPI接口实现与主控芯片的通信,使用简单。 - 读取速度快,适合存储大量数据。 - 低功耗,适用于移动设备。 - 小型化封装,适合在空间有限的应用中使用。 3. SPI_FLASH的应用场景 SPI_FLASH广泛应用于嵌入式系统中,如智能家居、智能手环、智能穿戴设备、工业控制设备等。它能够存储各种数据,如程序代码、配置信息、用户数据等。 4. SPI_FLASH的工作原理 SPI_FLASH通过SPI接口与主控芯片通信。主控芯片向SPI_FLASH发送指令,SPI_FLASH根据指令执行相应的操作,如读取数据、写入数据等。SPI_FLASH的内部结构包括多个扇区,每个扇区又包括多个块。每个块由多个页组成,每个页包含若干字节的数据。主控芯片可以通过指令读取、写入某个扇区、块或页的数据。 5. SPI_FLASH的选型 选择SPI_FLASH时,需要考虑以下因素: - 存储容量:根据应用需求选择适当的存储容量。 - 封装类型:选择适合应用的封装类型,如SOIC、WSON、BGA等。 - 工作电压:根据应用需求选择适当的工作电压,如1.8V、3.3V等。 - 读取速度:根据应用需求选择适当的读取速度,如20MHz、50MHz等。 以上是关于SPI_FLASH的相关资料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创想工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值