SPI协议及其工作原理详解

2023-05-16

一、概述.

     SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信.SPI最大的特点是由主设备时钟信号的出现与否来确定主/从设备间的通信。一旦检测到主设备的时钟信号,数据开始传输。

     SPI 主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术.

     参考:SPI Block Guide V04.01

二、接口定义
SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
(1)MOSI:主设备数据输出,从设备数据输入 master out slave in
(2)MISO:主设备数据输入,从设备数据输出 master in slave out
(3)SCLK :时钟信号,由主器件产生
(4)/SS:从器件使能信号,由主器件控制


三、内部结构

四、 特点

     1. 采用主-从模式(Master-Slave) 的控制方式

       SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作.

     2. 采用同步方式(Synchronous)传输数据

       Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.

     3. 数据交换(Data Exchanges)

       SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了.

       一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上.

       在数据传输的过程中,  每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃,  导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.

五、 工作机制

     1. 概述

       overview.jpeg 

      上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件(Module):

       SSPBUF, Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;

       SSPSR, Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;

       Controller, 泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式.

        通常情况下, 我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:

        SCK, Serial Clock, 主要的作用是 Master 设备往 Slave 设备传输时钟信号, 控制数据交换的时机以及速率;

        SS/CS, Slave Select/Chip Select, 用于 Master 设备片选 Slave 设备, 使被选中的 Slave 设备能够被 Master 设备所访问;

        SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被称为 Tx-Channel, 作为数据的出口, 主要用于 SPI 设备发送数据;

        SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被称为 Rx-Channel, 作为数据的入口, 主要用于SPI 设备接收数据;

        SPI 设备在进行通信的过程中, Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop), 就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF, Controller 确定 SPI 总线的通信模式, SCK 传输时钟信号.


      2. Timing.

            SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

CPOL — SPI Clock Polarity Bit
This bit selects an inverted or non-inverted SPI clock. To transmit data between SPI modules, the SPI
modules must have identical CPOL values. In master mode, a change of this bit will abort a
transmission in progress and force the SPI system into idle state.
1 = Active-low clocks selected. In idle state SCK is high.
0 = Active-high clocks selected. In idle state SCK is low.
CPHA — SPI Clock Phase Bit
This bit is used to select the SPI clock format. In master mode, a change of this bit will abort a
transmission in progress and force the SPI system into idle state.
1 = Sampling of data occurs at even edges (2,4,6,...,16) of the SCK clock
0 = Sampling of data occurs at odd edges (1,3,5,...,15) of the SCK clock

SPI主模块和与之通信的外设备时钟相位和极性应该一致。


以ADC为例:


     3. SSPSR.

         sspsr.jpeg 

        SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定.

        Bus-Width 的作用是指定地址总线到 Master 设备之间数据传输的单位.
        例如, 我们想要往 Master 设备里面的 SSPBUF 写入 16 Byte 大小的数据: 首先, 给 Master 设备的配置寄存器设置 Bus-Width 为 Byte; 然后往 Master 设备的 Tx-Data 移位寄存器在地址总线的入口写入数据, 每次写入 1 Byte 大小的数据(使用 writeb 函数); 写完 1 Byte 数据之后, Master 设备里面的 Tx-Data 移位寄存器会自动把从地址总线传来的1 Byte 数据移入 SSPBUF 里; 上述动作一共需要重复执行 16 次.

        Channel-Width 的作用是指定 Master 设备与 Slave 设备之间数据传输的单位. 与 Bus-Width 相似,  Master 设备内部的移位寄存器会依据 Channel-Width 自动地把数据从 Master-SSPBUF 里通过 Master-SDO 管脚搬运到 Slave 设备里的 Slave-SDI 引脚, Slave-SSPSR 再把每次接收的数据移入 Slave-SSPBUF里.

        通常情况下, Bus-Width 总是会大于或等于 Channel-Width, 这样能保证不会出现因 Master 与 Slave 之间数据交换的频率比地址总线与 Master 之间的数据交换频率要快, 导致 SSPBUF 里面存放的数据为无效数据这样的情况.


        4. SSPBUF.

          sspbuf.jpeg 

          我们知道, 在每个时钟周期内, Master 与 Slave 之间交换的数据其实都是 SPI 内部移位寄存器从 SSPBUF 里面拷贝的. 我们可以通过往 SSPBUF 对应的寄存器 (Tx-Data / Rx-Data register) 里读写数据, 间接地操控 SPI 设备内部的 SSPBUF.

          例如, 在发送数据之前, 我们应该先往 Master 的 Tx-Data 寄存器写入将要发送出去的数据, 这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO  管脚传给 Slave-SDI 管脚,  Slave-SSPSR 则把从  Slave-SDI 接收到的数据移入 Slave-SSPBUF 里.  与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.


         5. Controller.

          controller.jpeg 

          Master 设备里面的 Controller 主要通过时钟信号(Clock Signal)以及片选信号(Slave Select Signal)来控制 Slave 设备. Slave 设备会一直等待, 直到接收到 Master 设备发过来的片选信号, 然后根据时钟信号来工作.

          Master 设备的片选操作必须由程序所实现. 例如: 由程序把 SS/CS 管脚的时钟信号拉低电平, 完成 SPI 设备数据通信的前期工作; 当程序想让 SPI 设备结束数据通信时, 再把 SS/CS 管脚上的时钟信号拉高电平.

六、工作方式 

    4种工作方式:

图1所示是由一个主机对接一个从机进行全双工通信的系统构成的方式。在该系统中,由于主机和从机的角色是固定不变的,并且只有一个从机,因此,可以将主机的丽端接高电平,将从机的SS端固定接地。

全双工主机/从机连接方法

  图1 全双工主机/从机连接方法

  若干个具备SPI接口的单片机和若干片兼容SPI接口的外围芯片,可以在软件的控制下,构成多种简单或者复杂的应用系统,例如以下3种。

  (1)一个主机和多个从器件的通信系统。

  如图2所示,各个从器件是单片机的外围扩展芯片,它们的片选端SS分别独占单片机的一条通用I/O引脚,由单片机分时选通它们建立通信。这样省去了单片机在通信线路上发送地址码的麻烦,但是占用了单片机的引脚资源。当外设器件只有一个时,可以不必选通而直接将SS端接地即可。

一个主机扩展多个外围器件

  图2 一个主机扩展多个外围器件

  (2)几个单片机互相连接构成多主机通信系统。

  图3所示为3个既可以当做主机也可以当做从机的单片机组成的系统。

多主机通信系统连接方法

  图3 多主机通信系统连接方法

  (3)主机、从机和从器件共同组成的应用系统。

  图4所示为一个主机、一个从机和多片外设芯片组成的应用系统。这些外设芯片有的只接收来自单片机信息,有的只向单片机提供信息,还有的既接收也发送信息。

主机、从机和从器件互连

  图4主机、从机和从器件互连

 

七、 SPI协议举例
       SPI
是一个环形总线结构,由sscs)、scksdisdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
       
假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
       
那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。

举例:
      
假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi8个时钟周期的数据情况演示一遍:假设上升沿发送数据

SPI协议简介 - Filter - 涂~墙       

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdisdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

转载于:https://www.cnblogs.com/hello2mhb/p/3518974.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPI协议及其工作原理详解 的相关文章

  • 获取文件的行数

    获取文件行数 function getFileLineCount fileName fp 61 fopen fileName 34 r 34 line 61 0 while feof fp 每次读取1M if data 61 fread f
  • debian 安装使用NTP

    编程之路刚刚开始 xff0c 错误难免 xff0c 希望大家能够指出 领导要求 xff0c 要4台机器时钟同步 xff0c 上网查了查 xff0c 主要看了看ptp和ntp xff0c 感觉ntp就够用 xff0c 索性就直接上手ntp了
  • iTOP-4418开发板和6818开发板-第五路串口介绍

    iTOP 4418开发板和6818开发板 的除去默认 4 个串口的配置和用法 4418 的开发板最多支持 5 路串口 xff0c 如下图所示 xff0c 4418 的 datasheet 6818 的开发板最多支持 6 路串口 xff0c
  • 如何让sublime编译c语言,让sublime支持c/c++语言的编译

    sublime只是一个编辑器 xff0c 让sublime支持c或者c 43 43 则是通过设定sublime快捷键调用相关的命令 xff0c 达到编辑和执行c代码的目的 首先需要下载一个c语言的编译器 xff0c 对于 Windows 和
  • mysql repos_mysql yum源安装

    部署服务器环境的时候经常要安装mysql 以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装 yum源下载 进入https dev mysql com downloads 页面 xff0c 可以看到有很多的
  • you-get帮助使用手册

    you get使用手册 可选参数 V version 查看版本并退出 h help 查看帮助信息 不影响使用的选项 i info 查看页面视频信息 u url 查看页面视频信息包括解析的url地址 json 以json格式查看页面视频信息
  • openSUSE leap 42.3 实现有线 无线同时用

    因为工作的原因 xff0c 经常会用有线网卡连接服务器进行配置 xff0c 无线网卡上外网 一 查看当前网关信息 pipci 64 openSUSE gt ip route show 可以看到前两行default开头的就是默认网关 192
  • PHP连接mongodb的现代用法---使用Monogodb\Driver\Manager

    目的 xff1a 在php程序端查询文档相关集合存储情况 lt php Created by PhpStorm User Administrator Date 2018 11 29 Time 2 23 require 34 mongocon
  • CTreeListCtrl

    CTreeListCtrl 转载于 https www cnblogs com long80226 archive 2009 10 13 1582770 html
  • MongoDB——副本集成员配置

    选举仲裁者 仲裁者的唯一作用就是参与选举 仲裁者并不保存数据 xff0c 也不会为客户端提供服务 xff1a 它只是为了帮助具有两个成员的副本集能够满足 大多数 这个条件 由于仲裁者并不需要履行传统mongod服务器的责任 xff0c 所以
  • qemu 虚拟机和宿主机之间传输文件

    实现简单的虚拟机和宿主机之间的文件传输 使用dd创建一个文件 xff0c 作为虚拟机和宿主机之间传输桥梁 dd if 61 dev zero of 61 opt share img bs 61 1M count 61 200格式化share
  • 解决远程桌面连接过去后是蓝色屏幕问题

    其实此时的远程服务器并非不能正常工作了 并不需要重启 只是桌面不显示了 服务还在正常运行 解决方法 1 使用ctrl 43 shift 43 Esc键 调出远程桌面的任务管理器 2 点击任务管理器工具栏的 文件 新建任务 运行 在运行窗口选
  • ssl 服务器证书,客户端信任证书

    Secure Socket Layer SSL technology allows web browsers and web servers to communicate over a secure connection In this s
  • Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多 xff0c 所以选择了Laravel admin后台框架进行开发 节省了权限控制以及页面处理等问题的时间 Laravel admin文档地址 http laravel admin org docs zh 由于项
  • linux分区btrfs,系统基础之Btrfs文件系统详解

    btrfs文件系统 技术预览版 centos7 描述 Btrfs B tree Butter FS Better fs GPL授权 Orale 2007 写实复制特性 Cow cp reflink 只能在btrfs文件系统中使用 想取代ex
  • UITableView 总结

    UITableView 1 重用代理 64 interface ViewController UIViewController lt UITableViewDelegate UITableViewDataSource gt 2 定义 tab
  • 【转】ASP.Net2.0 AJAX Extensions 1.0的安装

    文章出处 xff1a DIY部落 http www diybl com course 4 webprogram asp net asp netshl 2008828 138230 html 以前一直没有去应用ajax xff0c 这2天用了
  • pip国内源

    pip 国内源 xff1a 清华 xff1a https pypi tuna tsinghua edu cn simple 阿里云 xff1a http mirrors aliyun com pypi simple 中国科技大学 https
  • 视频教程-C语言入门篇-C/C++

    C语言入门篇 23年C 43 43 语言编程经验 xff0c 经历过多个行业的开发项目包括网络安全 xff0c 网络游戏 xff0c 通信行业等等 xff0c 多年的摸爬滚打使自身具备了深厚的开发实力和实战经验 王健伟 98 00 立即订阅
  • ubuntu - 如何以root身份使用图形界面管理文件?

    nautilus 是gnome的文件管理器 xff0c 但是如果不是root账号下 xff0c 权限受限 xff0c 我们可以通过以下方式以root权限使用 xff01 一 xff0c 快捷键 ctrl 43 alt 43 t 调出shel

随机推荐

  • debian添加删除用户

    debian添加删除用户 增加普通用户 命令 xff1a adduser abc passwd abc exit 用abc登录 etc passwd中保存了用户信息 LINUX创建用户的命令 useradd g test d home te
  • MongoDB——副本集的同步、选举和回滚

    1 同步 复制用于在多台服务器之间备份数据 MongoDB的复制功能是使用操作日志oplog实现的 xff0c 操作日志包含了主节点的每一次写操作 oplog是主节点的locl数据库中的一个固定集合 备份节点通过查询这个集合就可以知道需要进
  • ftp (文件传输协议)

    ftp xff08 文件传输协议 xff09 锁定 本词条由 科普中国 百科科学词条编写与应用工作项目 审核 FTP 是File Transfer Protocol xff08 文件传输协议 xff09 的英文简称 xff0c 而中文简称为
  • SQL Server 中的 JSON 数据

    下面是 JSON 文本的示例 34 name 34 34 John 34 34 skills 34 34 SQL 34 34 C 34 34 Azure 34 34 name 34 34 Jane 34 34 surname 34 34 D
  • 去除地址栏带#的问题

    vue cil搭建的项目 第一步 xff1a 找到目录下router js文件 第二步 xff1a 在new Router xff08 routes xff1a xff09 中添加mode属性 xff0c 默认mode是hash expor
  • 如何给自己的Python项目制作安装包

    Packaging Python Projects 本教程将指导您如何打包一个简单的Python项目 它将向您展示如何添加必要的文件和结构来创建包 xff0c 如何构建包以及如何将其上载到Python包索引 A simple project
  • linux安装解压工具gzip,笔记6 压缩工具(gzip,bzip2,xz,zip,tar)。

    压缩打包 常见的压缩文件 windows rar zip 7z Linux zip gz bz2 xz tar gz tar bz2 tar xz gzip压缩工具 不能压缩目录 gzip压缩后边直接跟文件名就可以 xff0c gunzip
  • 洛谷 P3367 【模板】并查集

    P3367 模板 并查集 题目描述 如题 xff0c 现在有一个并查集 xff0c 你需要完成合并和查询操作 输入输出格式 输入格式 xff1a 第一行包含两个整数N M xff0c 表示共有N个元素和M个操作 接下来M行 xff0c 每行
  • js计算器(正则)

    lt doctype html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 我的计算器 lt title gt lt style gt mar
  • MySQL 分组后取每组前N条数据

    与oracle的 rownumber over partition by xxx order by xxx 语句类似 xff0c 即 xff1a 对表分组后排序 创建测试emp表 DROP TABLE IF EXISTS emp CREAT
  • archlinux 安装搜狗输入法

    安装可能需要 archlinuxcn 的源 xff0c 我这里已经配置好了 一 安装 fcitx fcitx configtool fcitx im pacman S fcitx fcitx configtool fcitx im 二 在
  • MongoDB——JavaAPI详解

    环境配置 引入MongoDB驱动 xff1a span class token tag span class token tag span class token punctuation lt span dependency span sp
  • 练习题||并发编程

    线程 进程 队列 IO多路模型 操作系统工作原理介绍 线程 进程演化史 特点 区别 互斥锁 信号 事件 join GIL 进程间通信 管道 队列 生产者消息者模型 异步模型 IO多路复用模型 select poll epoll 高性能IO模
  • luogu P2078 朋友

    题目背景 小明在A公司工作 xff0c 小红在B公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A公司有N名员工 xff0c 其中有P对朋友关系 B公司有M名员工 xff0c 其中有Q对朋友关系 朋友的朋
  • Debian 9 Stretch国内常用镜像源

    使用说明 一般情况下 xff0c 修改 etc apt sources list文件 xff0c 将Debian的默认源地址改成新的地址即可 xff0c 比如将http deb debian org改成https mirrors xxx c
  • ubuntu下编译ffmpeg并用eclipse调试

    一 下载ffnpeg源码 下载地址 xff1a http ffmpeg org download html 二 解决版本问题 可能之前你编译过ffmpeg xff0c 或者装过相关的库 xff0c 那都要先卸载掉 xff0c 否则用的时候会
  • 定时器初值计算

    1 定时器初值的计算 xff1a xff08 1 xff09 计算出机器周期 每次定时计算器加1所用的时间 xff08 2 xff09 根据你要定时的时间去算出初值 xff1a 假设你要定时Xms xff08 X lt 65 535ms x
  • ceph部署出现错误及解决

    ceph deploy new error hostname node1 is not resolvable 解决办法 xff0c 修改 etc hosts 127 0 0 1 localhost 127 0 1 1 ubuntu1 192
  • WordNet词网研究6——之JWI(Java Wordnet Interface)WordNet Java接口

    JWI the MIT Java Wordnet Interface is a Java library for interfacing with Wordnet JWI supports access to Wordnet version
  • SPI协议及其工作原理详解

    一 概述 SPI Serial Perripheral Interface 串行外围设备接口 是 Motorola 公司推出的一种同步串行接口技术 SPI 总线在物理上是通过接在外围设备微控制器 PICmicro 上面的微处理控制单元 MC