TPS6594-Q1、TPS6593-Q1 和 LP8764-Q1 系列电源管理集成电路 (PMIC) 包含一个可配置的非易失性存储器 (NVM) 空间。借助可扩展 PMIC GUI,可以从通过 GUI 生成或手动生成的 NVM 配置(汇编文件)生成二进制映像。本文档详细介绍了硬件设置以及将二进制映像上传到 PMIC NVM 的步骤。
Other TMs
本文档中描述的配置过程写入 NVM 空间,旨在用于生产线或开发环境。该机制不适用于应用,因为该过程会影响稳压器输出和 GPIO 功能。
可扩展 PMIC GUI 提供了一种生成二进制映像的机制,该二进制映像可以上传到 PMIC 的 NVM。选择 Save as Binary Code,如图 1-1 所示,从 NVM 编程页面生成二进制文件。有关配置 PMIC 和从该配置生成映像的说明,请参阅可扩展 PMIC GUI 用户指南。
表 1-1 显示了二进制文件中的条目示例。每行包含页面信息、寄存器地址和数据。
二进制行 | 说明 |
---|---|
0x0004 = 0xa0 | 第 0 页条目 |
0x00d1 = 0x00 | |
0x0100 = 0x02 | 第 1 页条目 |
0x014A = 0x06 | |
0x3000 = 0x0A | 第 3 页条目 |
0x32ff = 0x00 | |
0x405 = 0xff | 第 4 页条目 |
0x409 = 0xff |
原理图检查清单中描述了硬件连接(请参阅参考文献 6)。表 2-1 和表 2-2 显示了与 NVM 配置相关的所需连接。
引脚 | 名称 | 用途 | 实现正确连接的要求 |
---|---|---|---|
2 | VOUT_LDOVINT | 用于噪声去耦电容器的内部 LDO 的输出引脚 | 电容器:Ctyp = 2.2µF; Vcap > 6.3V |
3 | VOUT_LDOVRTC | ||
4 | VCCA | 用于内部 LDO 和其他内部块的模拟输入电压 | 电容器:Cmin = 0.47µF; Ctyp = 1µF;Vcap > 6.3V |
5 | REFGND1 | 系统基准地 | 连接到实心接地层,但不连接顶层的散热焊盘。 |
6 | REFGND2 | ||
30 | SDA_I2C1、SDI_SPI | I2C 或 SPI 数据 | 连接到控制器的数据线。对于 I2C,请根据速度和 PCB 使用电阻值。 |
31 | SCL_I2C1/SCK_SPI | I2C 或 SPI 时钟 | 连接到控制器的时钟线。对于 I2C,请根据速度和 PCB 使用电阻值。 |
32 | CS_SPI1 | SPI 芯片选择 | 连接到 SPI 控制器的 CS |
33 | SDO_SPI1 | SPI SDO | 连接到 SPI 控制器的 SDO |
48 | VIO_IN | 数字电源输入,提供 GPIO 和 I/O 电源电压 | 电容器:Cmin = 0.47µF; Ctyp = 1µF;Vcap > 6.3V |
57 | 散热焊盘 | 电源地,也是封装的散热焊盘。 | 连接到顶层电源地多边形网络 |
引脚 | 名称 | 用途 | 实现正确连接的要求 |
---|---|---|---|
20 | VOUT_LDO | 用于噪声去耦电容器的内部 LDO 的输出引脚 | 电容器:Ctyp = 2.2µF; Vcap > 6.3V |
18 | VCCA | 用于内部 LDO 和其他内部块的模拟输入电压 | 电容器:Cmin = 0.1µF; Ctyp = 0.47µF;Vcap > 6.3V |
19 | AGND1 | 系统基准地 | 连接到实心接地层,但不连接顶层的散热焊盘。 |
21 | AGND2 | ||
5 | SDA_I2C1、SDI_SPI | I2C 或 SPI 数据 | 连接到控制器的数据线。对于 I2C,请根据速度和 PCB 使用电阻值。 |
4 | SCL_I2C1/SCK_SPI | I2C 或 SPI 时钟 | 连接到控制器的时钟线。对于 I2C,请根据速度和 PCB 使用电阻值。 |
2 | CS_SPI(1) | SPI 芯片选择 | 连接到 SPI 控制器的 CS |
3 | SDO_SPI(1) | SPI SDO | 连接到 SPI 控制器的 SDO |
24 | VIO | 数字电源输入,提供 GPIO 和 I/O 电源电压 | 电容器:Cmin = 0.1µF; Ctyp = 0.47µF;Vcap > 6.3V |
13/29 | PGND | 电源地 | 连接到顶层电源地多边形网络 |
必须应用 VCCA 和 VIO,并且必须可访问串行接口以更新 NVM。VIO 不得连接到或依赖 PMIC 中的任何 GPIO 或稳压器。同样,对于 I2C 串行接口,上拉电压也必须独立于 PMIC。通过 I2C 配置 NVM 时,仅需要 I2C1 接口。I2C2 接口仅在启用时才在应用中使用,并且仅用于看门狗通信。
尝试配置 NVM 之前,还必须了解初始 PMIC 状态。通常,PMIC 必须处于静态或空闲状态。在某些 NVM 配置中,激活 ENABLE 引脚之前,PMIC 不会上电。只将 ENABLE 引脚保持为低电平,即可有效保持 PMIC 处于已知的静态状态。
此外,如果将 NVM 配置为在轮询特定条件的状态之间连续循环,则可能会干扰解锁 NVM 的配置中的初始步骤。
最后,PMIC 允许在安全恢复硬件状态下配置 NVM。这提供了一种可在 NVM 配置错误并导致出错或关断时更改 NVM 的方法。定义 NVM 时,转换到安全恢复状态很重要,不得忽略。可扩展 PMIC GUI 中提供了多种示例模板,包括转换到安全恢复状态的示例。如果未进行转换,则必须处理关联的中断,以便成功解锁 NVM。
这些指令指的是页面和寄存器地址。当使用 I2C 串行接口时,页面由不同的 I2C 地址描绘,而在 SPI 中,页面信息包含在传输有效载荷的第二个字节中。可将串行接口作为 NVM 配置的一部分进行更改,如节 5中所述。请参阅有关页面实现的器件数据表。
位 | 字段 | 类型 | 复位 | 说明 |
---|---|---|---|---|
7-2 | 保留 | R/W | 0h | |
1-0 | PFSM_PAGE_SEL | R/W | 0h |
选择可寻址的第 3 页地址空间。 0:0x000-0x0FF 1:0x100-0x1FF 2:0x200-0x2FF |
串行控制接口寄存器为 0x11A、0x122 和 0x123。如表 5-1 所示,0x11A 是串行接口寄存器,用于指示串行接口是 I2C 还是 SPI,以及接口 I2C1 或 SPI 和 I2C2 上是否启用了 CRC。I2C1 地址存储在 0x122 中,I2C2 地址存储在 0x123 中。
第 1 页,寄存器地址 0x1A 位字段 | 说明 |
---|---|
位 2 |
|
位 1 |
|
位 0 |
|
成功解锁 NVM 后,即可更改串行接口。进行更改后,以前的串行接口不再适用,必须适当地更改主机端上的接口。在 I2C 地址更改的情况下,必须对页面进行必要的更新。例如,如果 I2C1 地址从 0x48 更改为 0x28,则更改前后的页面将在表 5-2 中表示。
第 1 页 |
|
|
---|---|---|
第 0 页 | 0x48 | 0x28 |
第 1 页 | 0x49 | 0x29 |
第 3 页 | 0x4B | 0x2B |
第 4 页 | 0x12 | 0x12 |
要从 SPI 更改为 I2C 或从 I2C 更改为 SPI,必须提供必要的 GPIO 来支持这两个接口。提供等待或延迟,以便在继续执行 NVM 指令之前将硬件正确配置为所需的串行接口。有关 I2C 接口和 SPI 的说明,请参阅器件数据表。
在 NVM 解锁期间,不使用 I2C2 物理接口,并且从 PMIC 的 I2C1(SDA_I2C1、SCL_I2C1)访问所有页面。
降压频率选择受第 1 页寄存器地址 0x18 中的位 3 保护。设置该位之前无法更新降压频率,除非解锁 NVM,否则无法设置该位。完成频率更新后,必须将该位清零。这通常是在写入第 1 页寄存器 0x18 时通过正常程序流程完成。
PFSM 分为多个子页。TPS659x 器件有 3 个子页,而 LP876x 系列器件有 2 个子页。子页的控制在第 0 页寄存器地址 0xa4 的位 0 和 1 中进行管理。存储在二进制文件中的 PFSM 的内容将移至第 3 页用户寄存器,如表 5-3 所示。
页面,寄存器地址 | 第 0 页,寄存器地址 0xA4 | 二进制文件 | |
---|---|---|---|
位 1 | 位 0 | ||
3,0x00-0xFF | 0 | 0 | 0x3000-0x30FF |
0 | 1 | 0x3100-0x31FF | |
1 | 0 | 0x3200-0x32FF |
要永久锁定 NVM,必须将第 1 页中的寄存器地址 0x41 更改为除 0xA5 以外的某个值。0xA5 是默认值,因此无需任何操作即可将 NVM 保持在解锁状态。当 NVM 永久锁定时,PMIC 功能保持不变,但 NVM 无法再更新。在 NVM 锁定期间,将保留对寄存器映射的访问,如图 3-1 所示。
更新第 3 页和第 1 页寄存器 CRC 内容的过程使用 PMIC 中的 CRC 更新特性。运行 CRC 更新之前,请清除地址 0xF0 到 0xFB 中的寄存器 CRC 内容。设置第 0 页寄存器 0xEF 的位 1 后,将执行 CRC 更新。该位会自行清除。更新完成后,第 0 页地址 0xFB 的内容变为非零值。建议对寄存器 0xFB 执行这项从 0 变为非零值的检查以确认 CRC 完成,然后再尝试继续执行下一步。
PMIC CRC 更新特性计算第 0、1、3 和 4 页的 CRC。第 2 页是受保护的存储空间以及相关的 CRC,本文档未对此进行介绍。在大多数应用中,用户寄存器的计算(第 1 页和第 4 页的组合)不正确。第 0 页寄存器 0x82 的值与默认值不匹配,请参阅AppendixB,并且只能从串行接口读取寄存器中的 SPMI_LPM_EN 位和 FORCE_EN_DRV_LOW 位。
第 0 页和第 4 页寄存器 CRC 有两个组成部分:包含持续和排除持续。如表 5-4 所示,包含持续 CRC 信息存储在第 0 页寄存器 0xF0 和 0xF1 中,排除持续存储在第 0 页寄存器 0xF2 和 0xF3 中。
寄存器 | 地址,第 0 页 | Bit7-Bit0 |
---|---|---|
CRC_1 | 0xF0 | REGMAP_USER_INCLUDE_PERSIST_CRC16_LOW |
CRC_2 | 0xF1 | REGMAP_USER_INCLUDE_PERSIST_CRC16_HIGH |
CRC_3 | 0xF2 | REGMAP_USER_EXCLUDE_PERSIST_CRC16_LOW |
CRC_4 | 0xF3 | REGMAP_USER_EXCLUDE_PERSIST_CRC16_HIGH |
以下代码片段中显示的 CRC 计算取自可扩展 PMIC GUI(请参阅参考文献 3)。AppendixC 作为寄存器信息的数组提供。与看门狗相关的信息将映射到适当的位置,如果不受 NVM 支持,寄存器将填充默认设置,如果未定义,则填充 0x00。
const CRC_POLYNOMIAL = 0x755b;
var calculate_register_crc = function(registers, regmap_json, include_persist, page) {
crc = 0xffff;
for (var address = 0; address < 0x100; address++) {
var data;
var json_address;
if (address >= 0xf0 && page === 0) {
// Watchdog registers is mapped from 0x0fX in array to 0x40X in register map
// Offset by 1 since 0x0f0 is mapped to 0x401
json_address = address + 0x310 + 1;
} else {
json_address = address + (page * 0x100);
}
if (registers[address] === undefined) {
if (json_address in regmap_json) {
// Non-NVM register uses reset value
data = regmap_json[json_address].reset;
} else {
// Register does not exist, so reads 0s
data = 0;
}
} else {
// Regsiter is NVM-backed, use value from device
data = registers[address];
}
var crc_mask = 0x00;
if (json_address in regmap_json) {
if (include_persist) {
crc_mask = regmap_json[json_address].crc_mask_include_persist;
} else {
crc_mask = regmap_json[json_address].crc_mask_exclude_persist;
}
}
data = data & crc_mask;
crc = crc_d8(crc, data);
}
return crc;
};
// Calculate CRC based on look-up table
var crc_d8 = function(crc, data) {
var table_index = data ^ ((crc & 0xff00) >> 8);
crc = (crc << 8) ^ lookup_table[table_index];
return crc & 0xffff;
};
// Compute lookup-table used for CRC calculation
crc = 0x8000;
for (var i = 1; i < 256; i <<= 1) {
if ((crc & 0x8000) !== 0) {
crc = ((crc << 1) ^ CRC_POLYNOMIAL) & 0xffff;
} else {
crc = (crc << 1) & 0xffff;
}
for (var j = 0; j < i; j++) {
lookup_table[i+j] = crc ^ lookup_table[j];
}
}
更新 NVM 并进行 PMIC 下电上电后,只需读出用户寄存器映射即可验证 NVM 内容。如果在上电期间 PFSM 指令覆盖寄存器设置,则需要仔细考虑。
或者,可以解锁 NVM,暂停 PFSM,并将 NVM 内容直接传输到用户寄存器。将 NVM 内容传输到用户寄存器后,可通过串行接口再次访问这些值。表 6-1 中描述了这种替代方法。
指令 | I2C 地址(页) | 读/写 | 寄存器地址 | 数据 | 说明 |
---|---|---|---|---|---|
1 | 0x28 (0) | 写入 | 0xA2 | 0x00 | 复位解锁逻辑 |
2 | 0x28 (0) | 写入 | 0xA2 | 0x98 | NVM 解锁序列 |
3 | 0x28 (0) | 写入 | 0xA2 | 0xB8 | |
4 | 0x28 (0) | 写入 | 0xA2 | 0x13 | |
5 | 0x28 (0) | 写入 | 0xA2 | 0x7D | |
6 | 0x28 (0) | 读取 | 0xA3 | 0xC0 | 确认 NVM 已成功解锁;已设置第 6 位 |
7 | 0x28 (0) | 写入 | 0xA3 | 0xC1 | 暂停 PFSM |
8 | 0x29 (1) | 写入 | 0xEF | 0x01 | 将配置从 NVM 传输到用户寄存器 |
9 | 0x29 (1) | 读取 | 0xF3 | 0x04 | 确认传输完成;位 1 清零。位 2 无关。 |
10 | 0x29 (1) | 读取 | 0x23 | 0x12 | 确定要读取的 I2C2 地址 |
11 | 0x28 (0) | 读取 | 0x01-0xFF | 阵列 | 从第 0 页读取内容。有效地址范围请参阅AppendixA。 |
12 | 0x29 (1) | 读取 | 0x00-0xFF | 阵列 | 从第 1 页读取内容。有效地址范围请参阅AppendixA。 |
13 | 0x12 (4) | 读取 | 0x00-0x0A | 阵列 | 从第 4 页读取内容。有效地址范围请参阅AppendixA。 |
14 | 0x28 (0) | 写入 | 0xA4 | 0x00 | 将 PFSM 设置为子页 0 |
15 | 0x2B (3) | 读取 | 0x00-0xFF | 阵列 | 从第 3 页子页 0 读取内容 |
16 | 0x28 (0) | 写入 | 0xA4 | 0x01 | 将 PFSM 设置为子页 1 |
17 | 0x2B (3) | 读取 | 0x00-0xFF | 阵列 | 从第 3 页子页 1 读取内容 |
18 | 0x28 (0) | 写入 | 0xA4 | 0x02 | 将 PFSM 设置为子页 2 |
19 | 0x2B (3) | 读取 | 0x00-0xFF | 阵列 | 从第 3 页子页 2 读取内容 |
20 | 0x28 (0) | 写入 | 0xA4 | 0x00 | 将 PFSM 设置为子页 0 |
21 | 0x28 (0) | 写入 | 0xA2 | 0x00 | 复位解锁逻辑 |