SPI器件的菊链配置

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

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

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

基本串行通信接口

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

图1. 带有多个从器件独立片选信号的微控制器。
图1. 带有多个从器件独立片选信号的微控制器。

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

菊链方法

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

图2. 微控制器连接多个从器件
图2. 微控制器连接多个从器件

采用一个/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发送另一个命令。该新命令将覆盖SLAVE 1移位寄存器中原来的数据。只要/CS保持为低,数据会在整条菊链上传递,直到每一个从器件都接收了相应的命令。存储在每一个从器件移位寄存器中的命令将在/CS的上升沿执行。下面例子使用MAX5233和MAX5290构成菊链。
 

电路图范例#1

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

图3. 菊链电路#1
图3. 菊链电路#1

图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)设置到零点

图4. 电路#1—命令时序A
图4. 电路#1—命令时序A

在第一个命令周期(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—空操作

图5. 电路#1—命令序列B
图5. 电路#1—命令序列B

在第一个三命令周期内,菊链上三个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 Name

State of Output

After Power-Up (RSTV = VDD)First Hardware AcTIve-Low LDACSecond Hardware AcTIve-Low LDAC
IC1A1MidscaleFull scaleFull scale
B1MidscaleMidscaleZero scale
IC2A2MidscaleZero scaleZero scale
B2MidscaleFull scaleFull scale
IC3A3MidscaleMidscaleFull scale
B3MidscaleFull scaleFull scale

 

电路范例#2

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

图6. 菊链电路#2
图6. 菊链电路#2

图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—空操作

图7. 电路#2命令时序示例
图7. 电路#2命令时序示例

器件在/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 Name

State of Output

After Power-Up (PU = VDD)After First ExcuTIonAfter Second ExecuTIonAfter Third ExecutionAfter Fourth Execution
IC1A1Full scaleZero scaleZero scaleFull scaleFull scale
B1Full scaleZero scaleZero scaleFull scaleFull scale
IC2A2Full scaleMidscaleShutdownShutdownFull scale
B2Full scaleMidscaleShutdownShutdownFull scale
IC3A3Full scaleFull scaleFull scaleZero scaleZero scale
B3Full scaleFull scaleFull scaleZero scaleZero scale
### KVM 的技术实现应用 #### 什么是 KVM? (Daisy Chain)是一种常见的连接方式,用于多个设备之间的串联通信。在 KVM 切换器领域, KVM 是指通过将多台 KVM 设备依次相连形成一条条式的结构,从而扩展单个 KVM 控制端能够管理的服务器数量[^1]。 这种架构允许管理员在一个控制台上操作更多的计算机资源,而无需增加额外的硬件成本或复杂度。相比于传统的单一 KVM 解决方案,模式可以显著提升系统的灵活性和可扩展性。 #### 技术实现原理 KVM 的核心在于如何有效地传递信号并保持数据的一致性和稳定性。以下是其实现的关键要素: 1. **串接接口设计** 每一台 KVM 设备都配备有输入/输出端口,支持其他同型号或其他兼容型号的 KVM 进行物理上的接。这些端口通常基于标准协议如 USB 或 CAT5 网络电缆来传输视频、键盘鼠标以及其他外设的数据流[^2]。 2. **信号放大机制** 当信号经过多次转发时可能会衰减甚至失真,因此高质量的 KVM 必须内置信号增强电路以确保即使处于较长距离下的末端节点也能获得清晰稳定的画面质量以及流畅的操作体验。 3. **带宽分配策略** 对于大规模部署场景而言,合理配置每条路径上可用带宽至关重要。现代数字化 KVM 常利用压缩算法减少所需流量负载,并动态调整优先级以便满足实时交互需求。 4. **安全性考量** 特别是在企业环境中使用时,必须考虑防止未授权访问的风险。这可以通过加密通讯通道、设置密码保护等方式加以防范。 #### 应用实例分析 以某大型数据中心为例说明 KVM 实际应用场景中的优势表现如下: - 数据中心内部署了几百上千台服务器群组,如果单独购置对应规模的传统独立式KVM,则不仅耗费巨大资金投入还会占用过多空间位置;相反借助菊花链形式构建起来的整体框架则有效缓解这些问题。 - 同样重要的是维护便利程度得到极大改善——只需坐在中央工作站前就能轻松切换查看任意目标机器状态信息或者执行具体任务命令,极大地提高了工作效率的同时降低了人为失误概率。 ```python # 示例代码展示简单的信号处理逻辑 def process_signal(input_data, device_count): processed = [] for i in range(device_count): amplified_data = amplify_signal(input_data) # 假设有这样一个函数用来加强信号强度 compressed_data = compress(amplified_data) # 另一假设存在的方法负责降低冗余部分大小 secure_transmission(compressed_data) # 加密后发送给下一个环节继续循环往复直至结束整个流程 processed.append(compressed_data) return processed ``` #### 总结 综上所述, KVM 提供了一种经济高效的方法来管理和监控大量计算资产,尤其适合那些追求性价比又不愿牺牲性能的企业客户群体选用。然而需要注意的是,在实际选型过程中应当充分权衡各方面因素比如品牌信誉度、售后服务水平等综合评判后再做决定。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值