一、概述

在一个主机和多个从器件的典型 SPI 系统中, 通常采用专门的片选信号来寻址从器件。随着从器件数量不断增加, 片选线也随之增多。 这种情况将给电路板布板带来很大的挑战。

一个布板方法就是采用菊链结构。 本文详细讲述了 SPI 系统的菊链配置, 并展示如何使用软件向串联从器件发送命令。

标准 SPI™/QSPI™/MICROWIRE™兼容微控制器通过 3 线/4 线串口与从器件通信。典型接口包括片选信号(/CS)串行时钟(SCLK)数据输入信号(DIN) , 有时还会有数据输出信号(DOUT) 。如同 I² C 系统中一样, 单独寻址的器件能轻易的和总线上的其它器件通信。

二、基本串行通信接口

很多 SPI 器件并不是单独寻址的。 因此, 这些器件和总线上其它单个器件通信时, 就需要进行额外的硬件或者软件处理。 图 1 所示是一个微控制器和多个从器件通信的系统。

在上述系统中, 微控制器通过一个串行时钟输出(SCLK) 和一个主机输出/从机输入(MOSI) 信号线向各从器件发送命令。 主机为每个器件分配了一个独立的片选信号(/SS_) , 从而实现各个从器件的独立寻址。 由于所有从器件共享同一个时钟和数据线, 只有/CS 输入变低的从器件才会应答串行时钟和数据线。 当从器件数目较少时, 该系统较易实现。 如果系统中从器件数较多, 微控制器需要提供和从器件一样多的/SS_输出, 这种结构就增加了硬件和布板的复杂程度。

菊链方法

硬件空间方面的限制往往会使图 1 所示的电路无法实现或难以实现。可采用菊链法替代实现串行接口。 图 2 是一个有 N 个从器件的菊链系统结构。

采用一个/SS (或者/CS) 信号控制所有从器件的/CS 输入; 所有从器件接收同一个时钟信号。只有链上的第一个从器件(SLAVE 1) 从微控制器直接接收命令。 其他所有从器件都从链上前一个器件的 DOUT 输出获得其 DIN 数据。要保证菊链正常工作, 每一个从器件就必须能在给定的命令周期内(定义为每一个命令所需的时钟数) 从 DIN 引脚读入命令, 而在下一个命令周期从 DOUT 引脚输出同样的命令。 显然,从 DIN 到 DOUT 会有一个命令周期的延迟。 另外, 各个从器件只能在/CS 的上升沿执行写入的命令。 这意味着只要/CS 保持低电平, 从器件将不会执行命令, 并且会在下一个命令周期将命令通过 DOUT 引脚输出。 如果在给定命令周期之后/CS 变高, 所有从器件将立即执行写入 DIN 引脚的命令。 如果/CS 变高, 数据将不会从 DOUT 输出, 这就使得链上每个从器件可以执行不同的命令。只要菊链的这些要求能够满足, 微控制器只需三个信号(/SS、SCK 和 MOSI)就能控制网络上的所有从器件。

如何实现菊链

在菊链系统中(图 2) , SLAVE 1 从微控制器直接接收数据。 该数据在时钟驱动下进入 SLAVE 1的内部移位寄存器。 只要/CS (或/SS) 仍然保持低电平, 该数据将通过 SLAVE 1 的 DOUT 引脚输出。 SLAVE 1 的 DOUT 引脚接至 SLAVE 2 的 DI 引脚, 因此当数据通过 SLAVE 1 的 DOUT 引脚端输出时, 同时也被同步移入 SLAVE 2 的内部移位寄存器。 同理, 当 SLAVE 2 接收来自SLAVE 1 的数据的时候, 微控制器可同时向 SLAVE 1 发送另一个命令。 该新命令将覆盖 SLAVE1 移位寄存器中原来的数据。 只要/CS 保持为低, 数据会在整条菊链上传递, 直到每一个从器件都接收了相应的命令。 存储在每一个从器件移位寄存器中的命令将在/CS 的上升沿执行。下面例子使用 MAX5233 和 MAX5290 构成菊链。

电路图范例#1

图 3 给出的菊链结构中连接了 3 个 MAX5233。 MAX5233 为双路、 10 位 DAC (包含两个 DAC 通道, 通道 A 和 B) 。 将 RSTV 接至 VDD, 模拟输出的上电状态被设置到中点。

图 4 给出了将 IC1 (A1 和 B1) 、 IC2 (A2 和 B2) 和 IC3 (A3 和 B3) 的输出分别设为零点、 中点和满刻度的命令序列图。 在这个例子中, 使用了以下的命令:

  • 0x7FF8—将满刻度数据加载到 IC3 DAC 寄存器, 并将两路输出(A3、 B3) 设置到满刻度
  • 0x7000—将满刻度数据加载到 IC2 DAC 寄存器, 并将两路输出(A2、 B2) 设置到中点
  • 0x6000—将满刻度数据加载到 IC1 DAC 寄存器, 并将两路输出(A1、 B1) 设置到零点

在第一个命令周期(16 个 SCLK 脉冲序列) , 将 0x7FF8 载入 IC1 的移位寄存器。 当/CS 保持低电平, 这一数据将在 IC1 内传递, 并且在下一个命令周期内通过 DOUT1 输出。 在第二个命令周期内, IC1 输出端 DOUT1 上的数据输入到 DIN2, 将 0x7FF8 载入 IC2 的移位寄存器中。 同时, 新的命令 0x7000 将载入 IC1 移位寄存器, 覆盖了前一个命令。第三个命令周期内, 第一个命令 0x7FF8 将载入 IC3 的移位寄存器, 而第二个命令 0x7000将载入 IC2 的移位寄存器, 同时 IC1 将接收到新的命令 0x6000。 此时, 三个 IC 都从菊链上接收到命令并存储在他们的移位寄存器中。 一旦/CS 变高, 将执行已存储的命令; A1 和 B1被设为零点、 A2 和 B2 被设为中点、 A3 和 B3 被设为满刻度。

图 5 给出了更为复杂的命令序列。 在这个例子中, 使用以下的命令(更多详细信息, 请参考MAX5233 数据资料) :

  • 0x3FF8—将满刻度数据加载到输入寄存器 A, 不改变 DAC 寄存器和输出
  • 0x3000—将中点数据加载到输入寄存器 A, 不改变 DAC 寄存器和输出
  • 0x2000—将零点数据加载到输入寄存器 A, 不改变 DAC 寄存器和输出
  • 0xBFF8—将满刻度数据加载到输入寄存器 B, 不改变 DAC 寄存器和输出
  • 0xB000—将中点数据加载到输入寄存器 B, 不改变 DAC 寄存器和输出
  • 0xA000—将零点数据加载到输入寄存器 B, 不改变 DAC 寄存器和输出
  • 0x0000—空操作

在第一个三命令周期内, 菊链上三个 IC 中的各个器件的移位寄存器军接收到一条命令。IC1、IC2、 IC3 接收到的命令分别为 0xB000、 0xBFF8 和 0xBFF8。 器件将在/CS 的上升沿执行这些命令(第一次执行) 。 执行完之后, IC1、 IC2、 IC3 的输入寄存器 B 中分别加载了中点、 满刻度和满刻度的数据。 此时, 由于各 IC 的 DAC 寄存器 B 保持不变, 因此 B1、 B2、 B3 均未改变。

在接下来的三命令周期内, 每个 IC 的移位寄存器中均写入了仅向输入寄存器 A 加载数据的命令。 DAC 寄存器 A 和输出保持不变。 在/CS 的上升沿, IC1、 IC2、 IC3 的输入寄存器 A 分别加载了满刻度、 零点和中点数据。 此时, 由于只更新了输入寄存器 A 而不是 DAC 寄存器 A,因此 A1、 A2、 A3 均保持不变。

在第二次执行命令之后, 硬件/LDAC 命令(驱动/LDAC 为低) 将输入寄存器中的数据加载到相应的 DAC 寄存器中。 这样, DAC 的输出就被刷新为相应的 DAC 寄存器中的数据。 A1、 B2 和B3 变为满刻度。 A2 变为零点而 A3 仍为中点状态。

在第三个命令周期, IC2 和 IC3 接收了空操作命令(0x0000) , 而 IC1 接收 0xA000 命令, 将零点数据加载到 IC1 的输入寄存器 B。 第三次执行命令之后, 所有的输出仍旧没有改变。

在第四个命令周期内, IC1 和 IC2 接收空操作命令, 而 IC3 接收到 0x3FF8 命令。 第四次执行命令之后, IC3 的输入寄存器 A 加载满刻度数据。 另一个硬件/LDAC 命令将输入寄存器的数据加载到相应 DAC 寄存器。 这将使 B1 从中点变为零点, A3 从中点变为满刻度。 其他的输出仍旧不变。

表 1. 命令序列 B 中, 上电后以及执行硬件/LDAC 命令后, IC1、 IC2 和 IC3 的输出状态

Analog Output State of Output
Name After Power-Up
(RSTV = VDD)
First Hardware
Active-Low LDAC
Second Hardware
Active-Low LDAC
IC1 A1 Midscale Full scale Full scale
B1 Midscale Midscale Zero scale
IC2 A2 Midscale Zero scale Zero scale
B2 Midscale Full scale Full scale
IC3 A3 Midscale Midscale Full scale
B3 Midscale Full scale Full scale

电路范例#2

图 6 给出的菊链结构中有三个 MAX5290 (双路 12 位 DAC) 。 将 PU 接至 DVDD, 则上电时模拟输出设置为满刻度。 MAX5290 没有专用于菊链的数字输出。 因此, 需通过串口将两个 UPIO (用户可编程输入/输出) 引脚中的任意一个编程设置为 DOUTDC_模式。 更多详细信息请见MAX5290 数据资料。

图 7 给出了命令序列示例, 使用了以下的命令(更多详细信息请见 MAX5290 数据资料) 。

  • 0xDFFF—将满刻度数据加载到所有输入寄存器和 DAC 寄存器, 刷新 DAC 的 A 和 B 输出
  • 0xD800—将中点数据加载到所有输入寄存器和 DAC 寄存器, 刷新 DAC 的 A 和 B 输出
  • 0xD000—将零点数据加载到所有输入寄存器和 DAC 寄存器, 刷新 DAC 的 A 和 B 输出
  • 0xE400—将 DAC 的 A 和 B 输出置于关断模式
  • 0xE40F—使 DAC 的 A 和 B 输出跳出关断模式
  • 0xFFFF—空操作

器件在/CS 上升沿时执行已经加载到每个器件移位寄存器中的命令。 第一次执行命令后, 所有 DAC 输出均刷新。 IC1 的 DAC 输出为零点, IC2 的 DAC 输出为中点, 而 IC3 的 DAC 输出为 满刻度。第二个命令周期时, 执行命令 0xE400, IC2 的 DAC 的 A 和 B 输出都进入关断模式。 IC1 和 IC3由于执行空操作命令而不受影响。 第三个命令周期后, IC1 的输出变为满刻度, IC3 的输出变为零点。 而 IC2 的输出仍处于关断模式, 其内部输入寄存器和 DAC 寄存器数据已被刷新。在最后的命令周期, IC2 恢复正常工作模式, 所有输出变为满刻度。

表 2. 命令序列示例中, 上电后和执行命令后, IC1、 IC2、 IC3 的输出状态

Analog Output State of Output
Name After Power-Up
(RSTV = VDD)
After First
Excution
After Second
Excution
After Third
Excution
After Fourth
Excution
IC1 A1 Full scale Zero scale Zero scale Full scale Full scale
B1 Full scale Zero scale Zero scale Full scale Full scale
IC2 A2 Full scale Midscale Shutdown Shutdown Full scale
B2 Full scale Midscale Shutdown Shutdown Full scale
IC3 A3 Full scale Full scale Full scale Zero scale Zero scale
B3 Full scale Full scale Full scale Zero scale Zero scale

SPI菊花链原理和配置相关推荐

  1. STM32——SPI接口原理与配置

    一.SPI接口简介 SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口,是Motoroal首先在其MC68HCXX系列处理器上定义的. SPI是一种 ...

  2. SPI接口原理与配置

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理器上定义的. SPI,是一种高速的,全双工, ...

  3. SPI菊花链走线思考

    来源:菊花链_百度百科 (baidu.com) SPI菊花链(daisy chain)拓扑: 来自:SPI菊花链原理和配置_好大一只鱼的博客-CSDN博客 SCK 需不需要走等长,即主器件到每个从器件 ...

  4. SPI通信原理---STM32F4--HAL

    SPI接口原理 SPI是一种高速全双工同步通信,在芯片管脚上占用四根线,主要应用在EEPROM.FLASH.实时时钟.AD转换器,还有数字信号处理器和数字信号解码器之间. SPI接口使用4根线通信. ...

  5. SPI 通信原理详述

    SPI 通信原理详述 1.物理层 1.1 SPI接口 1.2 SPI互连 2 协议层 2.1 SPI时序 1)时钟极性 2)时钟相位 2.2数据格式 3.传输速率 4 优缺点 SPI(Serial P ...

  6. SPI通讯原理,SPI驱动程序编写,EEPROM,Tja1145,CAN收发器驱动程序,嵌入式,单片机,软件

    一.SPI通信原理讲解 0.架构讲解 1.通常CPU芯片(如TI的280049.英飞凌的TC234)中集成了SPI模块,CPU可使用SPI通讯模块实现与外部设备的通讯,如CPU与EEPROM模块的通讯 ...

  7. STM32的SPI的原理与使用(W25Q128附代码)

    目录 一.SPI介绍 二.SPI接口框图 三.SPI优缺点 四.SPI工作原理总结 五.时序图 六.SPI程序编写过程 七.W25Q12xx的原理及应用 7.1 分析W25Q128指令 7.2 擦除扇 ...

  8. 静态路由_【零基础学云计算】静态路由!静态路由!静态路由!原理与配置

    本次和各位小伙伴分享的是静态路由的原理和配置,接下来我会从以下几个方面来和大家进行解析: 1.路由器的工作原理 2.路由表的形成 3.静态路由和默认路由 4.路由器转发数据包的封装过程 5.静态路由和 ...

  9. centeros7网络服务无法启动_Linux网络服务02——DHCP原理与配置

    Linux网络服务02--DHCP原理与配置 一.DHCP服务概述 1.DHCP(Dynamic Host Configuration Protocol)动态主机配置协议 DHCP是由Internet ...

最新文章

  1. apache php 执行shell,PHP执行普通shell命令流程解析
  2. linux 查看发行版 名称 版本号
  3. centos7 nat模式配置静态ip_Manjaro 配置静态网络IP
  4. 比较合适的工作看板组合形式
  5. 乐鑫代理-启明云端分享|乐鑫ESP8266模组ESP-WROOM-02D和ESP-WROOM-02U有什么不同
  6. Python数据分析之初识numpy常见方法使用案例
  7. PageHelper分页插件使用
  8. 组件注册-@Scope-设置组件作用域
  9. 对于electron-react-boilerplate(ERB)的学习笔记(legacy)
  10. 9-4-插值查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
  11. Ubuntu 系统安装 MATLAB 2016b
  12. 3G来了,我们能干点啥软件?(转)
  13. 联想笔记本如何重启计算机,联想电脑总是自动重启怎么处理
  14. 怎么创建Gitee仓库,并将项目源码上传到Git?
  15. [渝粤教育] 长安大学 互换性与技术测量 参考 资料
  16. AAC音频压缩(转载)
  17. 实习 | QQ音乐(深圳)娱乐营销实习生
  18. 富爸爸穷爸爸阅读思考
  19. Sparkthrift-sql执行报错-File does not exist: hdfs://xxx/t_bd_materialgroup/xxx.parquet
  20. 通过免费api获取天气

热门文章

  1. python编程输入名字配对情侣网名_名字配对测试两人关系,亲测有点准。
  2. vscode全局搜索不了
  3. 饮料代理品牌的选择有多重要?新手应该如何选择?
  4. Extjs6.2 第一堂课 HelloWorld
  5. 天天基金网每日关注基金数据爬取
  6. java的jlabel_java – JLabel在另一个JLabel之上
  7. devenv 设置 未能完成操作。参数错误
  8. Unity3D 中PlayerPrefs保存或读取数组的方法
  9. 常用API——Object
  10. 阿里云OSS 203 Non-Authoritative Information问题解决