2.问题分析
根据代码和现象确认 MCU 已经进入了 STOP2 模式。那么,这个电流是如何产生的呢?初步怀疑是有输出口在对外输出电流。
于是,找到电路图,对电路图进行了检查,客户的电路图并不复杂,没有很明显可能会导致往外输出电流的情况。
结合电路图,我们对 I/O 口的状态进行了检测,最后发现 MCU 的一个 I2C 接口上的两根信号线电平为低!这要分成两种情况
来看,一是这两个 I/O 口被配置为输入口,那么它是对的,不会产生电流;另一种情况是,它仍然为 I2C 功能的开漏输出口,
那么这个情况下将会产生漏电流。所以,需要对代码进行检查。
从电路图上来看, MCU 的 I2C 接口, SCL 和 SDA 两条线直接连接到外部器件,没有上拉电阻。所以,先检查 I/O 配置,这
两个口被配置为具有内部上拉的复用开漏功能模式,这是正确的配置,没有问题,使用了内部上拉电阻。但是,我们发现客
户在进入 STOP2 模式之前并没有对这两个口的配置进行更改,也就是说,它们仍然保持 I2C 功能的开漏输出结构,带着内部
上拉电阻。
但是,如果 I2C 是在空闲状态下进入 STOP2 模式,按道理,它们应该是保持在高电平。为什么两个引脚都是低电平呢?再检
查用户代码,发现代码中将数据写入 I2C 进行发送后,就直接进入 STOP2 模式了。问题来了,如果进入 STOP2 模式的时间
点上,数据还在发送过程中,此时,若 SCL 和 SDA 都处于低电平的情况下, I2C 外设时钟停止, SCL 和 SDA 的状态将被锁
定在输出低电平状态上。我们使用示波器对此情况进行测试,发现确实如此,在进入 STOP2 模式时, I2C 数据还在发送;处
于 STOP2 模式中, SCL 和 SDA 保持为输出低电平;从 STOP2 模式唤醒后, I2C 继续把剩下的 bits 发完。
来看一下此时 SCL 和 SDA 的 I/O 配置图:
到此,这个问题基本就理清楚了:当 I2C 在工作时,并在 SCL 线和 SDA 线上发送低电平时, N-MOS 被打开,电流从
VDDIOx 经过上拉电阻流入 I/O 口内部,经过 N-MOS 流入 VSS。若此时进入 STOP 2 模式,由于 Vcore 域的所有时钟停止,
导致 I2C 外设时钟停止,那么此 I/O 状态被保持,将导致在 STOP 2 模式下电流持续产生。
STM32L476 的内部上拉电阻为 25~55 kΩ,标称值为 40 kΩ , 3V 的工作电压,两个 I/O 的上的电流大约是
3V/40 kΩ * 2= 150uA
因为内部上拉电阻并非就是 40 kΩ,所以我们测得到 179.6uA 就是相当地正常了。
|