0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式系统低速接口SPI讲解

云深之无迹 来源:云深之无迹 2023-08-14 09:59 次阅读

我一直以为SPI比IIC难的,因为可能是因为使用了比较“重型”的传感器才会搭配这个接口

但是今天用FPGA写了一个简单的移位寄存器,感觉不一样,甚至是不对劲。

65d370e2-3904-11ee-9e74-dac502259ad0.png

移位寄存器按照移位方向可分为左移位寄存器、右移位寄存器、双向移位寄存器。

65fa6076-3904-11ee-9e74-dac502259ad0.png

这个图记住,菊花链也跑不了

660cb41a-3904-11ee-9e74-dac502259ad0.png

这个是STM32F103的主从设备的示意

MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。

其实最近一段时间我频繁在机器人系统里面,比如FPGA和ARM的控制核之间,发现它们之间的交互都是使用SPI。也就是说设计人员需要具有简单的设备到设备数字接口的微控制器、外设和传感器,以便可以高速处理任意长度的数据,并且省去与协议相关的复杂编程任务。

6625da9e-3904-11ee-9e74-dac502259ad0.png

基本SPI全双工连接使用两条数据线(MOSI、MISO)、一条时钟线 (SCK) 和一条片选线 (CS)。从设备上的MOSI有时标记为从设备数据输入 (SDI)。MISO可标记为从设备数据输出 (SDO)。

6641936a-3904-11ee-9e74-dac502259ad0.png

两种处理多个从设备连接的配置。直接连接方式下每个从设备需要一个片选信号。菊花链连接方式仅使用一个片选信号,并将所有数据集中在一条线上。

6671c8e6-3904-11ee-9e74-dac502259ad0.png

主要看箭头,多个从机

66912164-3904-11ee-9e74-dac502259ad0.png

菊花链

在菊花链模式下,所有从机的片选信号连接在一起,数据从一个 从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI 时钟。

来自主机的数据直接送到第一个从机,该从机将数据提供 给下一个从机,依此类推。使用该方法时,由于数据是从一个从机传播到下一个从机,所以 传输数据所需的时钟周期数与菊花链中的从机位置成比例。

66cea4f8-3904-11ee-9e74-dac502259ad0.png

在图所示的8位系统中,为使第3个从机能够获得数据,需要24个 时钟脉冲,而常规SPI模式下只需8个时钟脉冲。

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

SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。

在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个 bit 大小的数据被交换了。一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以,Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上。

在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。

因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)。

在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/ SDI)上的数据)同时进行。

所以捏SPI没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

就像IIC一样,SPI也是需要找到谁在通讯的,比较费引脚,必须有一个片选的脚。来自主机的片选信号用于选择从机。这通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。

要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。

因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别 通过MOSI和MISO线路同时发送数据。

在SPI中,主机可以选择时钟极性和时钟相位。

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

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

66ecdff4-3904-11ee-9e74-dac502259ad0.png

数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。

671a3ae4-3904-11ee-9e74-dac502259ad0.png

SPI模式0,CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。

一采样,一移位。

由主设备控制并生成时钟。时钟的两个属性分别是时钟极性 (CPOL) 和时钟相位 (CPHA)。这些属性控制从设备相对数据进行计时的有效时钟边沿。CPOL = 0时,将时钟设为在逻辑0位置空闲。CPOL = 1时,时钟在逻辑1位置空闲。CPHA = 0时,数据在上升沿计时,CPHA = 1时,数据在下降沿计时(图3)。

67409dba-3904-11ee-9e74-dac502259ad0.png

SPI时钟模式选择确定了进行数据采样的有效时钟边沿。

主设备中的CPOL和CPHA线路设置决定了时钟极性以及进行数据计时的有效边沿。模式1是最常用的模式,但设计人员同样可以使用其他三种模式。

677d83ce-3904-11ee-9e74-dac502259ad0.png

上面的轨迹是数据线,中间的轨迹是时钟,底部的轨迹是片选信号。数据轨迹上的蓝色覆盖区显示的是十六进制解码内容。

让我来带你看个MC的芯片手册,看看不一样的SPI。

681eeb60-3904-11ee-9e74-dac502259ad0.png

一个SPI的温度计

68458d4c-3904-11ee-9e74-dac502259ad0.png

别问咋搞,直接街上

6855144c-3904-11ee-9e74-dac502259ad0.png

很多的时候,我们是使用传感器直接写,但是在机器人里面我们需要自己写一个传输的协议,这个是后话。

我们先看一个电气层的参数

6888000a-3904-11ee-9e74-dac502259ad0.png

首先建立这些的时间都是ns级别,怎么说呢,俺说不明白。

说说这些东西的意思,我觉得是满足不同人的需求,比如我现在就拿出一块51,我就能输出个高低电平,你能咋。

68a04264-3904-11ee-9e74-dac502259ad0.png

所以这些写模拟协议的时候就有用,因为对于器件来说,我才不管什么东西插了我,反正说的通就行。

片选 (Chip Enable, CE) 、串行时钟 (Serial Clock, SCK) 、串行数据输入 (Serial Data Input,SDI)以及串行数据输出(Serial Data Output, SDO )信号线。

CE 输入用于在有多个器件连接到串行时钟和数据线时选择器件。CE 为高电平有效,当 CE 等于逻辑高电平时,数据可以写入器件或从器件读出。CE 为低电平 时, SCK 输入被禁止。

68fbc4ae-3904-11ee-9e74-dac502259ad0.png

抬高的时候,就是到我啦!

CE 线的上升沿启动读或写操作,而 CE 的下降沿结束读或写操作。

69109f5a-3904-11ee-9e74-dac502259ad0.png

SCK 输入由外部单片机提供,用于同步 SDI 和 SDO 线 的数据。

692631c6-3904-11ee-9e74-dac502259ad0.png

SDI 输入向传感器的控制寄存器写入数据,而 SDO从温度寄存器中输出温度数据和控制寄存器关断位的状态。

传感器具有能在 SCK输入信号为有效高电平或低电平时工作的能力。当 CE 信号变成高电平时,检测到 SCK 的 无效状态,而时钟输入 (CP)的极性决定数据是在系统时钟的上升沿或下降沿移入或移出。

694bf640-3904-11ee-9e74-dac502259ad0.png

给出了用于传送数据到寄存器和从寄存器移出数 据的相应时钟边沿。每个时钟脉冲传送一位数据,数据位以 8 位为一组传送。

696b8ac8-3904-11ee-9e74-dac502259ad0.png

A就是地址

先发送地址字节,随后为数据。地址的最高位 A7 决定 要进行读操作还是写操作。

如果 A7 =“0”,将进行一个或多个读操作;否则 A7 = “1”,进行一个或多个写操作。

69953c2e-3904-11ee-9e74-dac502259ad0.png

地址+L+M

数据可以采用单字节或多字节包的方式进行传送,如图所示。在 3 字节包中,数据序列包括温度数据的 MSb、温度数据的 LSb 和紧接着的控制寄存器数据。通 过向寄存器写入所需数据包的最高地址来启动多字节读功能。

这段有问题,我明天改正。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48110

    浏览量

    740142
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593242
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117746
  • 接口
    +关注

    关注

    33

    文章

    7640

    浏览量

    148512
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89644

原文标题:嵌入式系统低速接口-SPI

文章出处:【微信号:TT1827652464,微信公众号:云深之无迹】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    调试嵌入式系统设计中的低速串行总线

    调试嵌入式系统设计中的低速串行总线今天,嵌入式系统几乎遍布在人类社会的每个角落。嵌入式
    发表于 11-26 09:33

    嵌入式系统选型与接口设计

    嵌入式系统选型与接口设计
    发表于 08-19 23:31

    嵌入式基础教程之嵌入式系统组成

      本文创客学院嵌入式开发培训讲师为读者介绍嵌入式基础教程之嵌入式系统组成,嵌入式系统通常由
    发表于 06-28 13:59

    嵌入式系统知识系统讲解

    、计算机外围设备等)。从这些可以看出, 要完成一个以MCU为核心的嵌入式系统应用产品设计,需要硬件、软件及行业领域相关知识。硬件主要有MCU的硬件最小系统、输入/输出外围电路、人机接口
    发表于 08-29 14:16

    【转】嵌入式系统原理及应用教程- -嵌入式接口技术应用

    嵌入式嵌入式系统原理及应用教程- -嵌入式接口技术应用
    发表于 12-02 22:11

    嵌入式硬件通信接口协议SPI讲解

    嵌入式硬件通信接口协议-SPI(一)协议基础
    发表于 07-19 09:03

    嵌入式Linux系统基础概念讲解

    进行层次划分。嵌入式Linux系统做模块化处理就是可划分为Bootloader(引导程序),Kernel(内核),fs(文件系统),Shell(命令行界面),Gui(图形库)和 Embeded Sql
    发表于 12-25 16:37

    嵌入式硬件通信接口协议SPI解析

    嵌入式硬件通信接口协议-SPI模拟接口应用
    发表于 01-20 06:07

    如何系统的学习嵌入式

    都说嵌入式很难,即使去嵌入式培训机构做系统训练,其实只是没有掌握正确的学习嵌入式的方法,学习讲究的是一个循序渐进的过程,谁也不能一口吃出一个大胖子,从基础到专业,从简单到高深,下面达内
    发表于 03-09 06:23

    嵌入式系统接口应用

    嵌入式系统原理与接口技术》——嵌入式系统接口应用基础本文为我负责编写的电子工业出版社出版的《
    发表于 08-09 06:56

    嵌入式系统接口测试

    嵌入式系统接口测试策略嵌入式系统接口测试策略摘要:在日益广泛应用的
    发表于 10-27 08:41

    嵌入式系统接口有哪些应用呢

    嵌入式系统接口类型有哪些?如何对嵌入式微控制器的I/O口进行配置呢?
    发表于 11-12 07:21

    嵌入式的通讯接口对比

    1. 嵌入式的通讯接口嵌入式系统中,我们熟知的通讯接口无非有串口,SPI,IIC,CAN,USB
    发表于 01-14 07:25

    调试嵌入式系统设计中的低速串行总线(二)

    调试嵌入式系统设计中的低速串行总线(二)SPI背景知识串行外设接口总线(SPI)最初是摩托罗拉在
    发表于 11-26 21:39 1087次阅读
    调试<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>设计中的<b class='flag-5'>低速</b>串行总线(二)

    嵌入式系统低速接口SPI和UART的区别

    继续说SPISPI来说就是没有IIC那么固定。它就是设计了一种二进制流的交互方式,所以这也是为什么它那么灵活的原因。它可以在任何两个嵌入式的设备之间交换消息。
    的头像 发表于 08-14 11:44 817次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>低速</b><b class='flag-5'>接口</b><b class='flag-5'>SPI</b>和UART的区别