SPI总线协议

目录

一、简介

二、接口

三、传输模式

​四、数据交换

五、多从机配置

1、常规SPI模式

2、菊花链模式


一、简介

        串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。

        SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或者下降沿同步。SPI共有四根线,主机和从机可以同时传输数据。

        相对于I2C协议来说,SPI通信速率可以很高,一般能达到 MHz 甚至更高的级别,适用于高速数据传输;SPI支持全双工通信,主设备和从设备可以同时发送和接收数据,通信效率高;SPI时钟极性和相位可以调整,可以适应不同的外设和通信方式。但是,SPI线数多,并且不支持多主机连接,只能由一个主设备控制多个从设备。

二、接口

        SPI共有四根线,分别是MISO、MOSI、SCLK、CS。

  • MISO:主设备数据输入,从设备数据输出
  • MOSI:主设备数据输出,从设备数据输入
  • SCLK:同步时钟信号,由主设备产生
  • CS:从设备使能信号,由主设备控制。当总线上有多个从设备的时候,主设备如果需要和某个从设备通信,就将该设备对应的片选引脚拉低使能 

        学习完SPI的接口后,我们总结一下,要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。 片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送和接收同时进行。同时,SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样数据或移位数据。

三、传输模式

        在SPI中,主机可以选择时钟极性和时钟相位。在空闲状态期间,CPOL位设置时钟信号的极性。空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间。

        CPHA位选择时钟相位。根据CPHA位的状态,使用时钟上升沿或下降沿来采样或移位数据。主机必须根据从机的要求选择时钟极性和时钟相位。根据CPOL和CPHA位的选择,有四种模式可用。

SPI模式CPOLCPHA空闲状态下的时钟极性采样或移位的时钟相位
000逻辑低电平数据在上升沿采样,在下降沿移出
101逻辑低电平数据在下降沿采样,在上升沿移出
210逻辑高电平数据在下降沿采样,在上升沿移出
311逻辑高电平数据在上升沿采样,在下降沿移出

         看如下几张图,传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。

模式一

模式二

模式三

模式四

四、数据交换

        SPI设备之间的数据传输之所以被称为数据交换,是因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一共“发送者”或者“接收者”。事实上SPI设备在通信时两边各有一个移位寄存器,这样在发送一个bit的同时将会收到对方1个bit的数据,当发送完8bit数据后,也将收到对方的8bit数据,这也就意味着完成了1个byte的数据交换。

        SPI数据传输过程实际上就是主从设备两个移位寄存器的数据交换过程,所以SPI的读功能实际上可以由SPI的写功能实现,即随便写一个字节的无效数据即可。在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收到的数据有可能会被丢弃,导致SPI物理模块最终失效。 

五、多从机配置

        多个从机可与单个SPI主机一起使用。从机可以采用常规模式连接,或采用菊花链模式连接。

1、常规SPI模式

        在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI、MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

        但是常规SPI模式,随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。

优点

         每个从设备直接连接到主设备,数据传输路径短,延迟较低,适合实时性要求高的应用;每个从设备都有独立的片选信号(CS),一个从设备的故障不会影响其他从设备的正常工作,提高了系统的可靠性;每个从设备直接与主设备通信,无需中间设备转发数据,通信协议简单。

缺点

        每增加一个从设备,就需要一个额外的片选引脚,导致引脚资源消耗较大,限制了可以连接的从设备数量;需要为每个从设备布设独立的片选信号线,随着从设备数量的增加,布线复杂度增加;增加或移除从设备时,需要重新配置片选信号线和修改主设备的软件配置,灵活性较差。

2、菊花链模式

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

        使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需要的时钟周期数与菊花链中的从机位置成比例。例如在下图所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需要8个时钟。(注意:并非所有SPI器件都支持菊花链模式)

 优点

       菊花链模式通过串联多个设备,使得只需要一组SPI总线即可连接多个从设备,从而节省了主控设备的引脚资源;由于设备是串联的,所以布线相对简单,可以减少PCB上的布线复杂度;可以方便地添加或移除从设备,只需将新的设备串联在链的末端即可。

缺点

       每个设备都会引入一定的延迟,随着链条长度的增加,总延迟会累积,可能影响通信速度和实时性;如果链条中的一个设备故障,可能会影响后续所有设备的通信,降低系统的可靠性;传输的数据需要通过多个设备,中间设备需要对数据进行转发,这增加了信号的复杂性和系统设计的难度。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot【2】集成 MyBatis Plus

SpringBoot 集成 MyBatis Plus 前言修改 pom.xml修改配置文件添加 实体类添加 持久层接口添加 持久层 XxxMapper.xml 文件添加 业务接口层添加 业务接口实现类添加 控制层添加 MyBatis 配置AutoFillMetaObjectHandlerMyBatisPlusConfig 验证 前言 由于 MySQL 备份/恢复测试&am…

一文入门机器学习

一、什么是机器学习? OR 机器学习能帮我们做什么? 一句白话:人类在“创造、情感思维、灵活性”等方面拥有与生俱来的天赋,但是在处理“海量、复杂的数据”问题方面非常低效,而机器学习就是由人类创造出来高效解决这类…

Java8,11,17的新特性(待补充)

Java 8 新特性 Lambda 表达式&#xff1a; 引入了函数式编程的概念&#xff0c;使代码更简洁&#xff0c;增强了集合处理能力。 示例&#xff1a; List<String> names Arrays.asList("John", "Jane", "Tom"); names.forEach(name ->…

Spring-JdbcTemplate

了解知道即可 JdbcTemplate环境配置 先加入依赖&#xff1a; 在pom.xml中要引入spring和mysql的依赖&#xff1a; <!--仓库和依赖--><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><ur…

Java阻塞队列:ArrayBlockingQueue

Java阻塞队列&#xff1a;ArrayBlockingQueue ArrayBlockingQueue是Java中的一个阻塞队列&#xff08;Blocking Queue&#xff09;实现&#xff0c;它是线程安全的&#xff0c;并且基于数组实现。ArrayBlockingQueue常用于生产者-消费者模型&#xff0c;在这种模型中&#xff…

[英语单词] ellipsize,动词化后缀 -ize

openvswitch manual里的一句话&#xff1a;里面有使用ellipsize&#xff0c;但是查字典是没有这个单词&#xff0c;这就是创造出来的动词。将单词ellipsis&#xff0c;加动词化后缀&#xff0c;-ize。 Often we ellipsize arguments not important to the discussion, e.g.: &…

了解protoStuff

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;目前工作于上海某电商服务公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&…

一文了解IO流

主要是背八股太枯燥了&#xff0c;而且目前很少用这个知识点&#xff0c;所以总结一下&#xff0c;方便记忆。 IO流&#xff08;输入/输出流&#xff09;在Java中是一个核心概念&#xff0c;广泛用于数据的读取和写入。IO流主别用于处理所有输入和输出操作&#xff0c;无论数据…

某集团数字化转型蓝图规划项目案例(94页PPT)

案例介绍&#xff1a; 本集团数字化转型蓝图规划项目通过确定目标&#xff0c;如制定集团数字化转型的整体战略和规划&#xff0c;明确转型方向和目标。构建数字化业务体系&#xff0c;实现业务流程数字化、智能化。搭建数字化管理平台&#xff0c;提升集团内部的管理效率和决…

Pyshark——安装、解析pcap文件

1、简介 PyShark是一个用于网络数据包捕获和分析的Python库&#xff0c;基于著名的网络协议分析工具Wireshark和其背后的libpcap/tshark库。它提供了一种便捷的方式来处理网络流量&#xff0c;适用于需要进行网络监控、调试和研究的场景。以下是PyShark的一些关键特性和使用方…

C语言期末考试大纲详解

一&#xff1a; C语言的基本概念 C语言是一种通用的、过程式的计算机编程语言&#xff0c;设计提供了低级内存访问和简单、灵活的语言结构。以下是关于C语言的一些基本概念和组成部分的详细解释。 文件扩展名 .c&#xff1a;这是C语言源代码文件的扩展名。它包含了程序员编…

Noisee 和 Suno创作十二生肖震撼视频 – 有详细的实操步骤

历史文章 日赚800&#xff0c;利用淘宝/闲鱼进行AI音乐售卖实操 如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 抖音主播/电商人员有福了&#xff0c;利用Suno创作产品宣传&#xff0c;让产品动起来-小米Su7 用sunoAI写粤语歌的方法&#xff0c;博主已经亲自实践可行 …

docker desktop for mac os如何使用本地代理

在macbook上弄了个代理&#xff0c;然后按照网上所说的去配代理 然后测试下 docker pull busybox 结果无反应&#xff0c;超时。我去&#xff01;&#xff01;&#xff01; 鼓捣了半天&#xff0c;看了docker官网&#xff0c;问了chatgpt &#xff0c;按照它们所说的试了下也没…

想学编程,什么语言最好上手?

Python是许多初学者的首选&#xff0c;因为它的语法简洁易懂&#xff0c;而且有丰富的资源和社区支持。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;…

Web前端中表示上标:深度解析与实战技巧

Web前端中表示上标&#xff1a;深度解析与实战技巧 在Web前端开发中&#xff0c;表示上标是一个常见的需求&#xff0c;尤其是在处理数学公式、化学符号或者其他需要特殊格式化的文本时。本文将从四个方面、五个方面、六个方面和七个方面深入探讨如何在Web前端中表示上标&…

Gone框架介绍26 - Gone v1.x 版本 正式发布,更加强大的依赖注入,更加卓越的执行效率

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 优化和新特性gone 核心功能增强内置Goners覆盖测试 后续计划 优化和新特性 gone 核心功能增强 重构了函数参数依…

【区分】累次极限与二重极限

累次极限与二重极限不要混淆&#xff0c;区分好下面5个命题

Java Character类:功能、应用与最佳实践

Java中的Character类是一种用于处理字符数据的包装类&#xff0c;属于java.lang包。作为基础类型char的包装类&#xff0c;Character提供了一系列静态方法来操作和检索字符的各种特性。这包括字符的类别判断&#xff08;如字母、数字、空白等&#xff09;、大小写转换、字符比较…

Python学习笔记13 -- API的说明及使用

一、API说明 1、API&#xff1a;Application Programming Interface -- 接口 2、Restful API&#xff1a;基于网页的API 3、JSON&#xff1a;JavaScript objection Notation 4、很多数据都可以找到公用API 二、安装requests模块 在终端输入&#xff1a; 可以保证使用当前…

os.system() 函数

os.system() 是 Python 标准库 os 模块中的一个函数&#xff0c;用于在子终端中运行系统命令。它可以在 Python 脚本中调用外部命令或程序。具体来说&#xff0c;它通过执行命令字符串并返回执行状态来实现这一点。下面是对 os.system() 函数的详细解释&#xff1a; import os…