小猫爪:TI PMIC LP87745简介
1 前言
这一章来简单介绍一下TI的PMIC LP87745。
2 功能简介
2.1 FSM
LP87745内部有个电源状态机,每个电源状态对应LP87745的一种工作模式。LP87745共有以下几种模式,或者几种状态:
状态名称 | 描述 |
---|---|
NO SUPPLY | 没电状态,就是LP87745没有供电 |
INIT | 初始化状态,这个状态中,LP87745从其自身的NVM中读取寄存器配置信息并且初始化自身 |
BOOT BIST | 自测试阶段,即进行build-in self-test,可通过置位NVM中的LBIST_BYPASS_EN位来跳过这个状态 |
STANDBY | 相当于低功耗模式,在这个状态下,基本上所有的功能都没有了,开关电源也不会输出电源,可被唤醒。 |
ACTIVE | 正常工作模式,在这个模式下,所有的功能正常使用 |
SAFE RECOVERY | 安全恢复模式,当LP87745检测到错误时或者检测到有序关机请求时。检测到错误时,LP87745会尝试恢复,如果恢复次数超过阈值RECOV_CNT_THR,那么LP8774状态就会永远停留在SAFE状态,除非进行上下电操作。 |
LP87745状态机切换顺序以及切换条件如下图所示:
从图中可以看到状态的切换主要受LP8774的一些系统条件控制,那么如果同一时间,出现了多个系统条件时,LP8774该怎么切换状态呢? 很简单,LP8774给这些条件排了优先级,如果同一时间出现了多个系统条件,则根据最高优先级条件来做反应,序号越小,优先级越高,系统条件的优先级顺序如下:
- VCCA > VCCA_UVLO (NO SUPPLY).
- Emergency shutdown.
- Immediate shutdown.
- Orderly shutdown.
- Cold boot request.
- OFF request.
- Warm reset.
所以要想让LP87745工作状态发生切换,那么就需要主动或者被动去触发LP87745出现这些系统条件,让其工作状态发生切换。
2.2 系统条件
2.2.1 ON/OFF Requests
观察上一节的状态切换图,发现ON/OFF Requests可以让LP87745在ACTIVE和STANDBY两种状态中发生切换。那么什么事件会让LP87745触发该系统条件呢,如下:
事件名称 | 描述 |
---|---|
ON Request | 拉低ENABLE引脚持续8us后即可触发,该事件无法屏蔽 |
OFF Request | 拉高ENABLE引脚持续8us后即可触发,该事件无法屏蔽 通过SPI接口发送命令,该事件无法屏蔽 |
2.2.2 Warm Reset
观察上一节的状态切换图,发现Warm Reset并不能直接让LP87745的工作状态发生切换,但是每发生一次Warm Reset,RESET_CNT会累加1,一旦超过阈值RESET_CNT_THR,那么就会让LP87745触发orderly shutdown事件,让其切换至SAFE状态并清除RESET_CNT。
Warm Reset只能在ACTIVE状态下发生,Warm Reset会toggle nRSTOUT 引脚而让MCU复位。另外system conditional 还可以让某些寄存器复位至默认值。具体有哪些寄存器这里就不一一列举,感兴趣的小伙伴可参考数据手手册。
最关键的来了,LP87745有哪些事件会触发Warm Reset事件呢?如下:
事件名称 | 是否可屏蔽 | 描述 |
---|---|---|
MCU Request | No | MCU sends request over SPI interface |
VCCA _UV | Yes | VCCA input supply Under-Voltage event |
BUCKn_UV | Yes | BUCKn Under-Voltage event |
BOOST_UV | Yes | BOOST Under-Voltage event |
VIO_LDO_UV | Yes | VIO_LDO Under-Voltage event |
VMONn_UV | Yes | VMON Under-Voltage event |
VCCA _OV | Yes | VCCA input supply Over-Voltage event |
BUCKn_OV | Yes | BUCKn Over-Voltage event |
BOOST_OV | Yes | BOOST Over-Voltage event |
VIO_LDO_OV | Yes | VIO_LDO Over-Voltage event |
VMONn_OV | Yes | VMON Over-Voltage event |
BUCKn_SC | Yes | BUCKn Short Circuit event |
BOOST_SC | Yes | BOOST Short Circuit event |
VIO_LDO_SC | Yes | VIO_LDO Short Circuit event |
WD Fail Count | Yes | When WD Fail Count exceeds programmed WD Fail Count reset threshold value (WD_FAIL_CNT = WD_RST_TH) |
ESM Fail Count | Yes | When ESM Fail Count exceeds programmed ESM Fail Count reset threshold value (ESM_ERR_CNT =ESM_ERR_CNT_RST_TH) |
nINT Error | Yes | nINT pin readback error |
2.2.3 Shutdown Request
Shutdown Request分为Orderly和Immediate两种,观察状态切换图可以看出,Orderly Shutdown Request可以让LP87745从ACTIVE切换至SAFE状态,而Immediate Shutdown Request可以让其从任何状态切换至SAFE状态。
对于Orderly Shutdown Request,进入到SAFE状态后,NRSTOUT会被激活,所有电源会无输出,GPIO会被拉低,所以为了让LP87745进入SAFE之前有个缓冲区,用户可以为其所有输出行为加上一个延迟,分别是BUCKn_SHUTDOWN_DELAY,BOOST_SHUTDOWN_DELAY,VIO_LDO_SHUTDWN_DELAY, GPO_SHUTDOWN_DELAY和NRSTOUT_SHUTDOWN_DELAY。
下表表明了哪些事件可以触发Orderly Shutdown Request:
事件名称 | 是否可屏蔽 | 描述 |
---|---|---|
MCU Request | No | |
RECOV_CNT >RECOV_CNT_THR | Yes (for debug/char purposes only) | SAFE state recovery counter reaches max programmed threshold value |
RESET_CNT[3:0] ≥RESET_CNT_THR[3:0] | Warm reset counter reaches max programmed threshold value | |
Tj ≥ TSD_ORDERLY | Yes (for debug/char purposes only) | Junction temperature reaches threshold level for orderly shutdown |
GPOn_READBACK_ERROR | Yes | GPOn pin readback error |
NRSTOUT_READBACK Error | Yes | NRSTOUT pin readback Error |
VIO_LDO/VMON1/VCCA OV/UV | Yes | When *_OV/UV_SEL=10,11 |
BOOST and BUCK OV,UV,SC | Yes | When *OV/UV_SEL=10 and PWRERR_OSD_SEL=1 |
BOOST,BUCK,VIO_LDO,VMON1 RV | yes | When RV (residual voltage) detected and *_RV_CON=1 |
对于Immediate Shutdown Request,进入到SAFE状态后,NRSTOUT会被激活,所有电源会无输出,GPIO会被拉低,所有操作会立即被执行。
下表表明了哪些事件可以触发Immediate Shutdown Request:
事件名称 | 是否可屏蔽 | 描述 |
---|---|---|
Tj ≥ TSD_IMMEDIATE | No | Junction temperature reaches threshold level for immediate shutdown |
VCCA_OVP | Yes (for debug/char purposes only) | Input supply at VCCA pin >VOVP |
Main clock error | Yes (for debug/char purposes only) | Internal clock out of range. Recovery by power cycling. |
VINT UV | NA | Internal LDO under-voltage. Recovery when internal LDO voltage is valid. Device is reset. |
VINT OV | Yes (for debug/char purposes only) | Internal LDO over-voltage. Recovery when internal LDO voltage is valid. Device is reset. |
2.2.4 MCU Commands
MCU可以通过SPI接口直接触发一些系统事件让FSM发生状态切换,具体如下:
MCU REQUEST | Command | COMMENT |
---|---|---|
OFF request | 1001 1001 | From ACTIVE to STANDBY |
Cold boot request | 0101 0101 | From ACTIVE to INIT |
Warm Reset request | 1100 1100 | Increments RESET_CNT |
Disable BIST Bypass | 1101 0010 | |
SAFE Recovery Request | 0100 1011 | From ACTIVE to SAFE, increments RECOV_CNT |
Reserved | 1000 0111 | |
Reserved | 0001 1110 |
2.3 错误检测和处理
LP87745有非常强大的错误检测和处理机制,在讲解系统条件时其实就列举了非常多的事件,这些事件大部分其实都是错误检测和处理,当LP87745检测到错误时就会触发系统条件,让LP87745发生进行状态切换。下图显示LP87745内部所定义的错误类型以及错误发生后相应的行为响应:
在上图中,红色框内的为错误类型定义,蓝色框内的相应的行为响应。简单列举一下相关信息如下(具体还得参考数据手册):
错误类型 | 触发条件 | 行为反应 |
---|---|---|
Power Rail Error | 检测到电源输出有UV,OV,SC错误 | 行为反应可做选择,可以触发中断,输出nINT,触发Orderly Shutdown |
Moderate Errors | $Die温度超过阈值TSD_IMMEDIATE, VCCA > VOVP | 触发 Immediate Shutdown |
Emergency Shutdown Errors | 内部LDO OV/UV事件 | 触发 Immediate Shutdown |
Watchdog (WDOG) Error | ||
ESM error | 检测外部MCU信号错误信号 | |
nINT and Warnings | 电流超限,nINT回读错误等 | 触发WARM RESET和相应中断 |
Boot BIST Error | 自测试出现错误 | 触发中断 |
2.4 启动时序
LP87745上电后状态切换时序如下图所示:
上电和下电时序如下图所示:
2.5 看门狗
看门狗的原理很简单,里面有一个计数器叫WD_FAIL_CNT,还有两个阈值WD_FAIL_TH和WD_RST_TH,当喂狗成功或者喂狗失败后,WD_FAIL_CNT就会相应的增加或者减少,一旦这个该值满足了以下条件PMIC就会进行相应操作,具体如下:
情况 | 响应 |
---|---|
WD_FAIL_CNT≤ WD_FAIL_TH | No change to nINT or NRSTOUT outputs. MCU can set the CAN_DIS bit if no other error flags are set. |
WD_FAIL_TH < WD_FAIL_CNT≤ (WD_FAIL_TH+ WD_RST_TH) | The device sets error-flag WD_FAIL and activates the nINT pin.CAN_DIS bit is cleared. |
WD_FAIL_CNT> (WD_FAIL_TH+ WD_RST_TH) | If configuration bit WD_RST_EN=1, device goes through a warmreset, sets the error-flag WD_RST, and activates the nINT pin low. |
2.5.1 初始化
在PMIC上电启动释放nRSTOUT后,看门狗会进入Long Window期,在这个时间内,MCU可以对看门狗进行初始化操作。对于看门狗需要初始化的有以下参数:
参数 | 描述 |
---|---|
WD_LONGWIN | Long Window持续的时间 |
WD_PWRHOLD | 看门狗的disable-function |
WD_RETURN_LONGWIN | 用来让看门狗重新进入Long Window在当前看门狗序列完成 |
WD_WIN1 | Window-1时间间隔的持续时间 |
WD_WIN2 | Window-2时间间隔的持续时间 |
WD_RST_EN | 使能/失能看门狗的reset-function |
WD_EN | 使能/失能看门狗 |
WD_FAIL_TH | 设置阈值WD_FAIL_TH |
WD_RST_TH | 设置阈值WD_RST_TH |
WD_QA_FDBK | answer-generation配置 |
WD_QA_LFSR | question-generation配置 |
WD_QUESTION_SEED | 第一次question-generation的起始点 |
WD_QA_CFG |
对于WD_LONGWIN的配置比较特别,具体如下:
WD_LONGWIN | Long Window期持续的时间 |
---|---|
0 | 80ms |
1 | 125ms |
2 ~ 64 | 250ms ~ 8s,每增加1,时间增加125ms |
65 ~ 255 | 12s ~ 12.867min,每增加1,时间增加4s |
2.5.2 同步
当所有寄存器配置完毕,需要看门狗退出Long Window进入正常工作模式,MCU必须要做两件事来完成其同步操作:
- 清除WD_PWRHOLD位来失能Disable-function
- 写WD_ANSWER寄存器4次
如果MCU在Long Window期间并没有正常完成看门狗的同步操作,那么就会触发warm reset系统条件,并且触发WD_LONGWIN_TIMEOUT_INT中断。
2.5.3 Disable-function
为了防止MCU中没有喂狗程序而导致PMIC反复触发warm reset,所以就整出了一个Disable-function,Disable-function被激活时,看门狗就会永远处于Long Window。当PMIC上电时,CS_SPI/WD_DIS引脚为低时,disable-function就会被使能, 清除WD_PWRHOLD位可以失能Disable-function。
2.5.4 序列周期
所有看类型的门狗都有一个周期,MCU必须在这个周期内按照规定给看门狗进行喂狗,不然看门狗就会报告相关错误。那么LP87745中看门狗的规则是什么呢?
LP87745的看门狗的喂狗模式被称为Question-Answer,这种模式下,在每个看门狗周期内,看门狗都会出一个Question,MCU需要读取这个Question计算出正确Answer,并将Answer按照顺序在规定时间窗口内发送给LP87745,只有Answer正确,才算是喂狗成功。
1 Question
LP87745在每个周期序列开始前都会根据一定的规则更新Question,MCU可以直接通过读取寄存器WD_QUESTION[3:0]得到一个4bit的Question,也可以软件按照这个规则去计算这个Question,至于计算方法请参考数据手册。
2 Answer
根据问题计算ANSWER,ANSWER一共有四个字节,分别是ANSWER-3,ANSWER-2,ANSWER-1,ANSWER-0,WD_ANSW_CNT的值则显示了当前需要往WD_ANSWER写哪个ANSWER,如果保持寄存器WD_QA_CFG的默认配置,则其真值表如下图所示:
MCU不仅需要计算出ANSWER,还需要在规定时间窗口内按照规定顺序写入ANSWER,具体如下:
如上图所示,具体为在窗口WINDOW-1内写入依次ANSWER-3,ANSWER-2,ANSWER-1,然后在窗口WINDOW-2内写入ANSWER-0,当ANSWER-0写入成功后,当前周期序列结束。
3. 定时器设计
另外WINDOW-1和WINDOW-2的时间窗口计算公式如下:
下面代码为计算时间窗口的示例代码:
window1 = (uint8_t)((WINDOW_1_INTERVAL / 0.55) - 1);
window2 = (uint8_t)((WINDOW_2_INTERVAL / 0.55) - 1);
计算完两个窗口时间之后,就需要设计定时器来完成两个窗口的喂狗行为,仔细看喂狗流程图中的介绍,可以发现WINDOW1窗口的时间结束后WINDOW2窗口开始,而写入最后一个answer后WINDOW2结束,所以以WINDOW1窗口开始的时间节点为开始计时,在WINDOW1的窗口时间内(0 < t < WINDOW_1_INTERVAL )完成前三个ANSWER的写入,在WINDOW2的窗口时间内(WINDOW_1_INTERVAL < t < WINDOW_1_INTERVAL + WINDOW_2_INTERVAL )完成最后一个ANSWER的写入。
2.6 ESM
ESM(error signal monitor)可以检测一个外部输入是否满足要求,可以将GPO2引脚作为ESM输入引脚。ESM有两种工作模式,分别是LEVEL模式和PWM模式,可通过ESM_MCU_MODE去选择工作模式。MCU可以通过置位ESM_MCU_START来启动ESM,清除该位即可停止ESM。
其中LEVEL模式就比较好理解了,输入信号发生电平翻转,且维持有效电平时间超过 tdegl_ESM(13us ~ 17us),就会触发ESM错误并且开始ESM错误处理流程。
对于PWM模式,就是输入信号的周期和占空比必须与PMIC中设置的值符合,这样才会正常,如果不匹配的话,则会产生错误。不同于LEVEL模式,PWM模式中,ESM有一个错误计数器,只有当ESM检测ESM_MCU_ERR_CNT,检测到周期和占空比不符合时(其实就是判断在不在一个提前配置好的区间内),该计数器加2,符合时则减1。一旦ESM_MCU_ERR_CNT超过阈值ESM_MCU_ERR_CNT_TH,就会触发ESM错误并且开始ESM错误处理流程,这里对错误处理流程就不多做介绍了,详情请参考数据手册。
以上提到的ESM错误处理流程根据配置分成了两种情况,总之比较复杂,在这里就不多作介绍了,具体请参考数据手册。
2.7 IO
LP87745有两个可操控的IO脚,两个引脚可通过GPO1_SEL和GPO2_SEL来配置其功能,如下图:
- VMON1: 作为模拟输入,可监控外部电压。
- GPO:GPIO模式,可操控其输出
- FAULT:错误输出,用来输出PMIC当前错误状态
- nERR:ESM错误输入,可通过该引脚向LP87745内部输入错误
- CAN_DIS:通常使用该引脚控制CAN的收发器
2.8 SPI操作时序
LP87745的SPI接口非常简单,POL=0,PHA=1,SPI模式1,CS低有效,另外为了保证通信的安全,还加入了CRC-8检测机制,CRC-8默认不使能,可通过设置SPI_CRC_EN为1来使能。
CRC没有使能下,写寄存器时时序如下:
对于Master端这边,具体内容如下:
总线位置,MSB | 值 |
---|---|
0-7 | 寄存器偏移地址 |
8-10 | 页 |
11 | 写操作,为0 |
12-15 | Reserved |
16-23 | 需要写的值 |
对于Slaver端这边回复的内容:
总线位置,MSB | 值 |
---|---|
0 | 0 |
1-7 | SPI_STATUS |
8 | 1 |
9-15 | SPI_STATUS的非 |
16-23 | 无意义 |
CRC没有使能下,读寄存器时时序如下:
对于Master端这边,具体内容如下:
总线位置,MSB | 值 |
---|---|
0-7 | 寄存器偏移地址 |
8-10 | 页 |
11 | 写操作,为1 |
12-15 | Reserved |
16-23 | 无意义 |
对于Slaver端这边回复的内容:
总线位置,MSB | 值 |
---|---|
0 | 0 |
1-7 | SPI_STATUS |
8 | 1 |
9-15 | SPI_STATUS的非 |
16-23 | 读取的数据 |
注:对于CRC使能情况下,需要变换的只是需要在读写数据后面加上CRC的校验值,在这里就不详细介绍了,详情请参考数据手册。
在上面时序表格中,出现了SPI_STATUS这个参数,这个参数其实简单的反应了当时LP87745的状态,每一位具体代表的含义如下所示:
位 | 值 |
---|---|
• Bit 7 | always 0 |
• Bit 6 | COMM_ADR_ERR_SWINT |
• Bit 5 | COMM_CRC_ERR_SWINT |
• Bit 4 | COMM_FRM_ERR_SWINT |
• Bit 3 | ESM_MCU_PIN_SWINT |
• Bit 2 | TWARN_SWINT |
• Bit 1 | WD_SWINT |
• Bit 0 | NINT_READBACK_SWINT |
2.9 展频功能
由于LP87745内部开关电源的频率很高,最高能达到17.6MHz,而开关电源的电感是外置的,在进行EMC辐射测试的时候是有可能不通过的,所以PMIC非常贴心的提供了展频功能,而开启展频功能也是非常的简单,只需要置位SS_EN就好了。