SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。
时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。
产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);
数据的采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)。

整体的传输大概可以分为以下几个过程:
1.主机先将NSS信号拉低,这样保证开始接收数据;
2.当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。
3.主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
4.主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

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

SPI特性
SPI总线包括4条逻辑线,定义如下:
MISO:Master input slave output 主机输入,从机输出(数据来自从机);
MOSI:Master output slave input 主机输出,从机输入(数据来自主机);
SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;
SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;
MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
NSS也可以是CE,CS或SSEL;
SCLK也可以是SCK;

本文将按照以下命名进行讲解[MISO, MOSI, SCK,NSS]
下图显示了单个主机和单个从机之间的典型SPI连接。

时钟频率
SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输。
主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。
就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;
从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。

时钟极性 CKP/Clock Polarity
除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性。
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;
CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。
CKP = 0:时钟空闲IDLE为低电平0;
CKP = 1:时钟空闲IDLE为高电平1;

时钟相位 CKE /Clock Phase (Edge)
除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKE或CPHA;
顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样;

时钟配置总结
综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;
其中黑色线为采样数据的时刻;蓝色线为SCK时钟信号;
具体如下图所示;

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

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

多从机模式
前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:
第一种方法:多NSS
通常,每个从机都需要一条单独的SS线。
如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。
具体连接方式如下图所示;

第二种方法:菊花链
在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链。
菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
具体的连接如下图所示;

其中红线加粗为数据的流向;
所以最终的数据流向图可以表示为:

SCK为时钟信号,8clks表示8个边沿信号;
其中D为数据,X为无效数据;
所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

SPI的优点
1.全双工串行通信;
2.高速数据传输速率。
3.简单的软件配置;
4.极其灵活的数据传输,不限于8位,它可以是任意大小的字;
5.非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
SPI的缺点
1.没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
2.通常仅支持一个主设备;
3.需要更多的引脚(与I2C不同);
4.没有定义硬件级别的错误检查协议;
5.与RS-232和CAN总线相比,只能支持非常短的距离;

原文地址:https://zhuanlan.zhihu.com/p/290620901

SPI通信协议详解(一)相关推荐

  1. SPI通信协议详解(二)

    1.SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应 ...

  2. SPI通信协议详解,一篇就够!

    一.什么是SPI? SPI 的英文全称为 Serial Peripheral Interface,顾名思义为串行外设接口.SPI 是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信.该接口 ...

  3. STM32常用协议之SPI协议详解

    SPI协议详解 SPI协议简介 一.SPI物理层 二.SPI协议层 2.1 SPI基本通信过程 2.2 通信的起始和终止信号 2.3 数据有效性 2.4 CPOL/CPHA及通信模式 三.编程实现 四 ...

  4. SPI协议详解(总结)

    关于SPI协议 1)SPI是串行外设接口(Serial Peripheral Interface)的缩写: 2)是一种高速的,全双工,同步的通信总线: 3)在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  5. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

  6. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? 2.SPI的用途 Driver实现 Mysql DriverManager实现 spi工具类`ServiceLoader` 将自己注册到驱动管理器的驱动列 ...

  7. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

  8. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  9. STM32 CAN通信协议详解—小白入门(二)

    文章目录 (一)CAN通信协议简介 (二)CAN物理层 2.1.闭环总线网络2.2.开环总线网络2.3.通信节点2.4.差分信号2.5.CAN协议的差分信号 (三)协议层 3.1.CAN的波特率及位同 ...

  10. Modbus 通信协议详解

    Modbus 通信协议详解 一.介绍 二.Modbus 协议简介 三.帧格式 1.Modbus功能码 2.1查询功能码0x03 2.2 修改功能码0x06 2.3.修改-0x10功能码 3.归纳 下载 ...

最新文章

  1. 呵呵,哈哈,嘿嘿,从今天起就开始写博客文了
  2. 怎样cp文件夹时忽略指定的文件夹和文件
  3. DNS、IP地址、子网掩码和网关
  4. Vsftpd服务的部署及优化
  5. linux nginx安启动_linux下nginx编译安装启动
  6. url override and HttpSession implements session
  7. pandas apply()函数传参,与解决TypeError: xxxx() takes 2 positional arguments but 3 were given报错
  8. 服务器指示灯详情 中兴,IBM服务器故障_指示灯介绍
  9. linux java xmx_linux应用实际内存大于 jvm xmx
  10. URAL-1991 The battle near the swamp 水题
  11. 电子邮箱官网地址是什么,企业邮箱官网地址登录入口讲解
  12. win11开机动画关闭教程
  13. Innoreader + Rsshub
  14. 能上QQ不能上浏览器处理方法(win11版)
  15. 上学期间你收到最感动的小纸条是什么?
  16. css-background-image 背景图片太大或太小
  17. C++中的fstream/ifstream/ofstream和MFC中的CFile/CStdioFile
  18. 拥抱组件化开发,手淘项目内部架构分享
  19. 学习记录--陀螺仪模块(MPU6050:IIC通信,us延时函数)
  20. 安全威胁无孔不入:基于Linux系统的病毒(转)

热门文章

  1. 如何做一个本地漫画党:了解漫画+下载漫画+漫画APP推荐
  2. 算法:(七)模拟算法
  3. [python]LDA模型使用流程及代码
  4. MIPI接口和DVP接口摄像头学习笔记
  5. oracle 分组随机抽取,Oracle 中实现随机抽取数据
  6. rufus制作u盘启动 linux系统安装
  7. 物联网通信技术 机械工业 课后习题总结
  8. 汽车轮毂识别定位检测
  9. 【Request】全面总结并理解request
  10. 使用Flask在Raspberry Pi上构建物联网服务器