电源系统管理的寻址
扫描二维码
随时随地手机看文章
引言
包括凌力尔特电源系统管理 (PSM) 在内的所有 PMBus 应用的基础都是,PMBus 主器件 (系统主器件) 能够与总线上的所有 PMBus 从属器件 (PSM 控制器、PSM 管理器、PMS µModule 和 PMBus 单片器件) 通信。总线上的每个从属器件都必须拥有与其他器件不冲突的、独一无二的地址。
总线主器件还必须能够在几种并非大多数人都认为顺理成章的情况下与 PSM 从属器件通信,包括:
• 地址发现
• 全局行动
• 多相轨
• 无效非易失性存储器 (NVM)
• 总线 MUX
器件寻址是由基址寄存器加上外部地址选择 (ASEL) 引脚以及特殊的全局、轨、ARA 地址及其他特殊地址相结合实现的。
本文探讨凌力尔特 PSM 系列的基本设计原则、有关产品系列之间不同之处的详细信息、以及实际例子和建议。诸如无效 NVM 等特殊情况也会讨论。
凌力尔特的优势是,设计不仅从第一天开始就正常运行,甚至在情况变坏时依然正常运行。例如,如果正在用 LTpowerPlay 软件写 NVM 时掉电了,那么设计是可恢复的。此外,如果选择采用凌力尔特 Linduino 参考代码中提供的“In Flight Update”1,那么设计在现场也是可恢复的。最后,还能够识别系统退化的症状,并解决系统退化问题。
一旦了解了怎样实现凌力尔特 PSM 寻址,就能够快速设计可靠的系统了。
基本的 PMBus 运行方式
PMBus 是一种由 SMBus 扩展而来的串行通信标准,类似于 I2C。两条开漏导线 SCL 和 SDA 支持主器件和从属器件的双向通信总线。主器件是控制通信的器件,一般是微控制器或 FPGA。从属器件是受主器件控制的器件,一般是小型集成电路,在本文中,这是诸如 LTC2977 等电源管理器或者诸如 LTC3880 等电源控制器。
一个系统可以有超过一个主器件,但是实际上这种情况很少见。通常有多个从属器件。甚至在只有一个从属器件的系统中,主器件每次也通过使用地址,来指挥与从属器件的通信。这意味着,每个从属器件必须拥有一个独一无二的地址,以实现恰当的系统功能。
凌力尔特的电源系统管理器件使用一个 EEPROM 和引脚电阻器来设定每个 (从属) 器件独一无二的地址。因此,寻址过程确保,如果任何 EEPROM 中没有有效数据,那么主器件就可以修补系统,使系统达到每个 (从属) 器件都有独一无二地址的状态。
以下各部分详细解释了这些地址配置机制,包括怎样选择、设计和修补地址。
基本的 PMBus 寻址
PMBus 寻址由 PMBus 标准引用的 SMBus 标准定义。SMBus 寻址与 I2C 标准相同。为清晰起见,讨论范围限定在 SMBus 标准上。
考虑 SMBus 3.0 标准图 29 中定义的 Read Byte 协议 (参见图 1)。起始位 (S) 之后是任何交易的地址,地址在 ACK 位 (A) 之前结束。在 (S) 和 (A) 之间有 8 个位,前 7 位是地址,其余 1 位用来指示写 (Wr) 或读 (Rd)。
图 1:Read Byte 协议 (SMBus 3.0 标准,图 29)
7 位意味着有 128 个可能的地址。在本“应用指南 (Application Note)”中,所写地址不包括 (Wr/Rd) 位,如下所示:
0x00 至 0x7F (7 位寻址) 2
有时,程序员写地址时喜欢额外带上保持为零的 (Wr/Rd) 位,例如:
0x00 至 0xFE (8 位寻址)
这些数字全都是偶数。示波器和监视工具 (例如 Total Phase Beagle 协议分析仪) 使用与本应用指南相同的格式,因此自然使用 0x00 至 0x7F,所以我们也这么做。然而,当工程师提供一个地址但并未指明格式时,请格外注意。给定地址也许需要左移一位,因此看起来的地址比实际地址大一倍。
请注意,Read Byte 协议使用两次地址,但是在第二次使用的地址之前有一个重复开始 (Sr) 指示位。重复开始指示位是所有读交易的组成部分。在本文中,(S) 和 (Sr) 之后必须使用相同的地址。
地址图
不是所有地址都可用于 PSM 从属器件,因为 SMBus 标准保留了某些地址。SMBus 3.0 规范的附录 C 有一个预分配地址表。没必要了解这些地址打算怎样使用,所以有一个简化的表就够了。
表 1 所示的 SMBus 地址图使用了一种简单的编码方法。保守的设计仅使用“用途”(Description) 列中有白色底纹的地址。这就避开了所有保留的地址和特殊地址。可能除了为 PMBus 3.1 区域操作添加的地址 0x28 和 0x37 以外,PSM 设计可以使用地址列中所有具白色底纹的地址。
表 1:SMBus 地址图
PSM 全局地址
还有一些地址由 PSM 使用,不能分配给任何器件,甚至非 PSM 器件也不行,以防引起系统级问题。
第一类特殊地址是全局地址,即 0x5A 和 0x5B。总线主器件用这些地址一次与多个器件通信。就LTC388X 系列而言,地址 0x5A 是不被呼叫的全局地址。就 LTC388X PSM 系列和 LTC297X 系列而言,地址 0x5B 都是被呼叫的全局地址。如果一个 PSM 器件的地址被设定为两个全局地址之一,那么总线主器件向该器件发送命令时,总线上的所有 PSM 器件都会响应该命令。LTpowerPlay 也会出现意想不到的行为。
第三个全局地址是 0x7C。如果 LTC388X PSM 系列器件的 EEPROM 中有 CRC 错误,那么这些器件就响应这个地址。因此不要使用这个地址。
其他全局地址
非 PSM 器件也可能有全局地址。分配 PSM 地址时,这些地址必须避开。
轨地址
有些 PSM 器件有一种称为轨地址的特殊地址。用轨地址可以同时寻址多个器件或页面。轨地址的主要功能是,使总线主器件能够用一条命令与一个轨的几个相位通信。例如,设定多相轨的 VOUT 电压。
轨地址用一种称为 MFR_RAIL_ADDRESS (0xFA) 的寄存器设定。这个寄存器的缺省值是 0x80,这个值禁止轨寻址。将轨地址设定为其他任何值都可启动轨寻址。
总线主器件对待轨地址就像对待总线上的器件一样,即使它不是一个单独的器件。总线主器件分辨不出二者的差别。因此,轨地址是系统总地址图的组成部分,一定不能与其他地址相冲突。
通道地址
最后一种特殊地址称为通道地址。这个地址也像轨地址一样是用一个寄存器 MFR_CHANNEL_ADDRESS (0xD8) 设定的。通道地址给总线增加了一种指向特定页面的地址。因此,使用通道地址时,就不必使用 PAGE 寄存器了。
总线主器件对待通道地址就像对待总线上的另一个器件一样,通道地址不可能与其他地址相冲突。
地址规划
地址规划很简单。创建一个电子数据表,列入所有器件和地址,使用以下所有地址类型:
• 普通地址
• 全局地址
• 轨地址
• 通道地址
• 特殊地址 (ARA)
• 非 PSM 地址
除了全局地址,地址不可重叠,当所有地址都使用一个共用基址时,每个地址都必须是独一无二的。
设定地址
在怎样分配地址以及器件的行为方式方面,尽管 LTC388X DC/DC 控制器系列和 LTC297X 管理器系列之间通常很相似,但是仍然存在细微差别。同一系列之内的不同器件之间也存在微小差别。不过,运行原理是相似的,所以在考虑具体差异之前,可以按照一般规则考虑所有器件。
就所有 PSM 器件而言,总线上 PSM 器件的实际地址由称为基址 (BASE ADDRESS) 的寄存器值加上由连至器件引脚的电阻器决定之可选变址构成,这些器件引脚称为 ASEL 引脚,即地址选择引脚。
使用 ASEL 引脚而不是使用预先设定器件的方法有几个原因。首先,预先设定需要花时间,有成本问题,而且人们也许不想按照一般规则预先设定所有器件。很多器件还具有用来设定输出电压的配置引脚,这些引脚也许就足够了。其次,如果一个器件有 CRC NVM 差错,那么该器件可能会丢失地址,这时总线主器件就无法独一无二地与每个器件通信以重新设定器件了。
因此,解决方案是 ASEL 引脚和一个基址。总线主器件可利用全局地址 0x5B 与所有器件通信。如果主器件可以与所有器件通信,那么就可以设定基址,因为所有 PSM 器件都支持 MFR_I2C_BASE_ADDRESS 3 寄存器。之后,总线主器件可以强制所有器件读取其地址引脚,而且所有器件都将拥有总线主器件已知和独一无二的地址。一旦总线主器件可以与每个器件单独通信,就可以重新设定 EEPROM 了。
这意味着以下事实,而且这些事实是本文中需要记住的最重要的事情:当总线上的所有器件共用一个基址时,这些器件必须各自拥有独一无二的地址,而且这些器件的 ASEL 引脚已经被读取和使用。
如果遵循这个原则,那么当发生任何 NVM 讹误时,用 LTpowerPlay、Linduino 参考代码或定制固件就可修复系统。因此,修复系统时,永远不需要将凌力尔特 PSM 器件脱焊。
以下内容提供产品系列的详细信息,以全面了解怎样设定地址以及怎样用地址图给出的参数进行设计。
LTC388X PSM 系列
LTC388X 系列 PSM 器件的地址是由基址值和经由 ASEL 引脚获得的值相结合来设定的。有些 LTC388X 器件有一个 ASEL 引脚,有些则有两个 ASEL 引脚,因此需要以不同的方式对待这两种器件。
一个 ASEL 引脚
表 2 显示了 LTC3880 数据表列出的 ASEL 引脚。LTC3880 有一个 ASEL 引脚。从属地址列中的“xyz”3 位是基址,存储在 MFR_I2C_BASE_ADDRESS (0xE6) 寄存器中。除非在 ASEL 引脚上没有电阻器,否则 ASEL 引脚设定表中的 4 个 LSB。在这情况,使用基址的所有 7 个位。
表 2:LTC3880 ASEL
仅当总线上只有一个器件时,才设定 ASEL 引脚开路。在任何多器件应用中,都必须使用 ASEL 引脚来设定地址。如果使用单个 ASEL 引脚设定器件,总线上的地址数量就限定为 16 个。
总线 MUX 为增加地址数量提供了一种解决方案,将在本文的总线分段部分讨论。
双 ASEL 引脚
双 ASEL 引脚将 16 个地址的限制扩展到 127 个。
表 3 显示了 LTC3882 数据表列出的 ASEL 引脚。如果 ASEL1 设定为“来自 EEPROM”,那么 ASEL0 的表现就像 LTC3880 的单个 ASEL 表现一样。连至 ASEL1 引脚的电阻器控制器件地址的 3 个 MSB。这将独一无二的地址数量扩展至 127 个。
在由单和双 ASEL 引脚器件组成的系统中,每种单 ASEL 引脚器件类型可能有多达 16 个,而且可能有与可用地址一样多的双 ASEL 器件。
表 3:LTC3882 ASEL
LTC297X PSM 系列
LTC297X 系列的主要不同是加到基址上的 ASEL 引脚选择值。“加到”意味着增加,而不是取代或屏蔽一些位。
表 4 显示了 LTC2975 的地址查询表。这些 ASEL 引脚有 3 种状态,高、低或未连接。两个引脚选择 9 个不同的、显示为“N =”的值。在这个表中,基址是 0x5C,当 N = 0 时,地址为 0x5C。
这个表还有一个 8 位的列。这是本应用指南使用的地址,像之前讨论的那样,左移一位 (对习惯于这种惯例的人而言)。
表 4:LTC2975 ASEL
CRC 失配
所有凌力尔特 PSM 器件都有 EEPROM,用来存储决定输出电压、监察限制和基本操作的设置值。存储器中的任何差错都可能导致损坏负载。凌力尔特 PSM 器件的 EEPROM 保存规格为 10 年。不过,写 EEPROM 时遭遇意外系统情况,例如高温或电源电压崩溃,可能导致写失败,从而使 EEPROM 保存的内容出现讹误。
CRC 的目的是验证 EEPROM 保存的内容是否正确。有效的 CRC 确保器件安全运行,无效的 CRC 禁止器件运行,并通过 PMBus ALERTB 通知主机。
CRC 怎样起作用?
当 PSM 器件第一次加电时,该器件将 EEPROM 中的内容传送给 RAM,因为 RAM 是器件的运行存储器。传送的同时,器件计算 RAM 所存内容的 CRC 值,然后与 EEPROM 中存储的 CRC 比较 4。如果两个 CRC 值相同,器件就运行;如果不相同,器件就报告 CRC 故障,并保持在复位状态。
连接所有 PSM 器件的 GPIOB/FAULTB 引脚,设定器件以分享故障信息并在故障期间禁止运行,将使整个系统之内的任何 CRC 都能够防止对系统内的所有轨供电。一般而言,这是最佳的系统设计,除非多故障分析已经证实,故障的所有组合都是安全的。当所有轨都关断时,分析简单得多,而且系统变得安全得多,因为任何故障都导致所有轨完全断电。
LTC388X CRC
如果一个 LTC388X 器件出现 CRC 失配,那么它的地址将变成 0x7C。如果其他 LTC388X 器件也出现 CRC 失配,那么这些器件的地址也将同时变为 0x7C。在用有效数据重写这些器件的 NVM 且这些器件经过由 MFR_RESET (0xFD) 命令或加电周期启动的初始化之前,这些器件的地址会一直保持为 0x7C。
LTC297X CRC
如果一个 LTC297X 器件发生 CRC 失配,那么其值可能是两个地址之一。简单情况是缺省基址 0x5C,当整个 EEPROM 发生 CRC 失配时,出现这种情况。
因为 LTC297X 成块处理 EEPROM,而且靠近底部的块可能拥有有效的 CRC,靠近顶部的块可能没有有效的 CRC,所以地址也有可能是所存储的基址。
这与 LTC388X 是不同的,因为 LTC388X 在确定地址之前,对整个 EEPROM 进行一次完整的 CRC 验证,而 LTC297X 则是逐步确定地址。
解决 CRC 失配问题
一般而言,CRC 失配绝不会手动解决。LTpowerPlay 用其编程工具可非常容易地解决 CRC 失配问题,而且 In Flight Update 也会解决 CRC 失配问题。不过,了解这些方法怎样解决 CRC 失配问题,对更好地理解寻址是有帮助的。解决 CRC 失配问题的第一步是,逐个访问所有出现 CRC 失配问题的器件。这意味着,发送 PMBus 命令以恢复各个地址。
向全局地址 0x5B 发布一条 MFR_I2C_BASE_ADDRESS 命令。然后发送一系列命令,强制所有器件读取其 ASEL 引脚。
注:可以单独针对一个出现 CRC 失配问题的器件,如果你能确定其目前的地址,例如对 LTC388X 而言是 0x7C,或者 LTC297X 的缺省基址。不过,使用全局地址却简单得多,因为这种方式不损害其他器件。此外,如果总线未得到良好规划,LTC297X 落在了非 PMBus 器件的地址上,那么单独针对一个器件的做法可能产生副作用。
第二步是向器件发送数据。理论上,器件支持的所有命令都可以使用,但是通过 MFR_EE_DATA 命令发送批量数据更高效。LTpowerPlay 和 In Flight Update 都使用这条命令。
对规划不佳、未使用 ASEL 引脚将所有器件设定为拥有独一无二地址的地址设计而言,第一步不起作用。如果设定 MFR_I2C_BASE_ADDRESS 导致一个以上的 PSM 器件拥有相同的地址,那么就无法用 MFR_EE_DATA 修复单个器件,因为拥有相同地址的任何器件都会被相同的数据设定。
总线分段
对 PMBus 分段有两个主要原因:
1. 寻址
2. 电容/速度
但是分段以实现寻址这种方法一般仅用在非常大的系统中。
当总线主器件以 400kHz 运行时,在非常大和具有很长总线布线的系统中,可能出现电容问题。这可能导致违反定时规范,或干扰性能目标。
一般情况下,会使用多路转换器 LTC4306。LTC4306 的主要功能是,能够一次连接一个段或者同时连接所有段。
当修复 CRC 失配问题时,使用该器件,使总线主器件一次连接一个段。当由固件使用时,用该器件将所有段连接成单条总线。当所有段作为单条总线连接时,所有地址都必须是独一无二的。
一步步地看一个典型例子,了解怎样满足修复流程需求以及怎样作为单条总线起作用,这是有帮助的。
总线分段举例
这个作为例子的系统由以下各部分组成:
• 4 段 (参见图 2)
• 每段有 16 个 LTC3880 器
• 一个多路转换器 LTC4306
图 2 总线分段举例
LTC4306 的地址用 3 个 ASEL 引脚设定为 0x50。该器件还有一个全局批量写地址 (Mass Write Address) 0x5D。LTC3880 有 0x5A 和 0x5B 两个全局地址。这种设计将 4 个基址 0x20、0x30、0x40 和 0x60 分配给 4 个段。这避开了 0x50 至 0x5F 的地址范围,所有凌力尔特 PSM 器件的地址在这个范围都是可编程的。此外,大多数凌力尔特 I2C/SMBus 器件都支持这个地址范围。LTC4316 I2C 器件非常容易使其他任何器件与这个寻址范围兼容。
还有可能在 0x5X 范围内对多相轨寻址,或者在小于 0x10 或大于 0x6F 的可用地址范围内对多相轨寻址。
图 2:总线分段举例
固件运行
通过将 LTC4306 的寄存器 3 设定为 0xF0,电路板管理控制器 (Board Management Controller) 将输入 PMBus 连至所有输出 PMBus 段。在这种情况下,总线上有 64 个器件的地址处于以下范围:0x20 至 0x2F、0x30 至 0x3F、0x40 至 0x4F 和 0x60 至 0x6F。全局地址 0x5A 和 0x5B 用于全局操作。如果器件正常运行,没有 CRC 失配问题,就不会响应地址 0x7C。
系统设定
系统设定指的是,用 LTpowerPlay 或 In Flight Update 对所有总线分段进行初始设定。通过将寄存器 3 的值分别设定为 0x80、0x40、0x20 和 0x10,LTC4306 会一次连接一个段。
LTpowerPlay 或 In Flight Update 会设定由 LTC4306 连接的特定段。用于被连接段的 MFR_I2C_BASE_ADDRESS 用全局地址 0x5B 设定。ASEL 的引脚电阻器确保被连接段上的每个器件都拥有独一无二的地址。
用于每个段上各个器件的 ASEL 引脚电阻器是相同的,并在 0x00 至 0x0F 范围内选择一个地址变址数。一次连接一个段,针对每个段单独设定 MFR_I2C_BASE_ADDRESS,就可以使所有 64 个器件都拥有独一无二的器件地址。
注:如果使用有两个 ASEL 引脚的器件,那么所有分段都有可能包含超过 16 个器件,因为两个 ASEL 引脚允许用一个基址创建多达 128 个器件地址。
解决 CRC 失配问题
这种情况与系统设定情况是相同的。LTpowerPlay 和 In Flight Update 以同样的方式对待设定流程。在两种情况下,设定过程中都会使用 MFR_I2C_BASE_ADDRESS。
每个段都是一个一个连接和设定的。
固件运行与系统设定的互动
LTC4306 缺省设置为所有段均断接。因此,如果电路板管理控制器 (BMC) 保持在复位状态以进行系统调试,连接了 DC1613 PMBus-to-USB 控制器且 LTpowerPlay 正在运行,那么 DC1613 就不会连接到总线上的任何 PSM 器件上。
有两种方式确保固件不干扰 LTpowerPlay。第一种是为 BMC 提供调试模式,以便 BMC 退出复位状态,并连接所有段,然后暂停。这使 LTpowerPlay 能够与完整的总线互动,以便系统进入运行和调试状态。
BMC 暂停时,会阻止与 LTpowerPlay 互动。即使 LTpowerPlay 能够进行多重控制,依赖 PAGE 命令的多个命令也会互动。因此,暂停可防止固件和 LTpowerPlay 得到错误的遥测数据。
第二种方式是在调试时保持 BMC 处于复位状态,并允许 LTpowerPlay 控制 MUX。一般而言,这是最安全的情况,因为当 BMC 从复位状态释放出来之后,例如在关断 LTpowerPlay 之后,会将多路转换器设定到适当的状态,而不管目前处于何种状态。
当 BMC 和 LTpowerPlay 交替控制总线时,主器件不应该假设多路转换器的状态。无论何时,只要采取重要行动,例如任一主器件退出暂停状态继续运行时,首先应该将多路转换器设定到适当的状态。
总结
电源系统管理的地址规划并不复杂,但是必须注意设定以及系统从 CRC 失配中恢复的特殊情况。所有凌力尔特 PSM 器件都是兼容的。
所有凌力尔特的 PSM 器件都通过基址和 ASEL 引脚设定的变址相结合来产生独一无二的地址。如果在设定时掉电,所有 PSM 器件都可能遭遇 CRC 失配问题。通过设定基址、重新设定 EEPROM、以及复位器件,可以全面恢复系统。LTpowerPlay 和 In Flight Update 自动处理合适的地址计划的恢复。
通过地址规划,可分配基址和 ASEL 引脚,因此绝对不会出现两个器件永久使用相同地址的情形。使用拥有两个 ASEL 引脚的器件或者用一个诸如 LTC4306 那样的 I2C 多路转换器对总线分段,可以设计较大型的系统。
必须在进行 PCB 设计之前进行地址规划,因为 ASEL 引脚和总线分段依靠电阻器和引脚来设定。
注 1:In Flight Update 是一种设定引擎 (C 代码),使用 LTpowerPlay 输出的 ISP/HEX 文件。Linduino 版本中的 In Flight Update 示例代码被移植给了固件。
注 2:有些地址是保留的。
注 3:在有些器件中,MFR_I2C_BASE_ADDRESS 是以不同方式编制的,但命令代码始终是 0xE6。
注 4:当写操作通过 RAM 或从外部向 EEPROM 写数据时, PSM 器件在其 EEPROM 中创建 CRC。
注 5:DC1613 与 LTpowerPlay 一起使用,以配置和调试 PSM 设计。