在EC中,除了使用SMBus读取温度传感器信息外,SMBus的另外一个用途是笔记本智能充放电管理,这路SMBus会与控制充放电的芯片和智能电池连接起来,通过读取智能电池的状态来控制充放电芯片对智能电池进行充放电管理,以电池充电管理芯片ISL88731CHRTZ-T为例进行介绍,具体的连接方式如下所示:
EC的同一路SMBus下挂在了两个从设备,分别是智能电池和充放电管理芯片,他们的地址分别是:
- 充放电芯片ISL88731C的设备地址为 00010010,十六进制表示为0x12;
- 智能电池的地址为0x16;地址宏定义如下:
#define SMBA_DEV1_ADDR 0x16
#define SMBA_DEV3_ADDR 0x12
1.充放电芯片初始化
充放电芯片ISL88731C的各个引脚及电路图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Lj0LlTh-1652761739581)(https://files.mdnice.com/user/30213/3ddd79aa-719c-42b3-8f9c-a0f216f60021.png)]
看到电路图中,EC_SMB_CK1和EC_SMB_DA1是直接连接到EC上面的,剩下需要关注的引脚有ACIN和ACOK,这里不过多的讲解硬件知识以及充电的具体过程,这里只介绍充放电芯片和EC的通信过程,首先适配器插入,插入后适配器电压通过ACIN输入到充放电芯片中,当充放电芯片正常工作后,会通过ACOK引脚输出一个高电平,这个引脚直接连接到了EC的GPIO引脚上,EC将该GPIO引脚设置为输入模式,当读取到该引脚为高电平时,EC会将内部用来表示适配器状态的信息更新为适配器插入,并通过SCI中断通知操作系统,适配器接入了。此时EC还需要进一步判断,如果此时电池插入了主板,则切换为适配器对主板供电,并根据电池的状态来判断是否对电池进行充电。
2.智能电池初始化
在笔记本电脑的智能电池中,一般有一个内部电芯,电池的内部电芯保护着电池并保存着电池的状态信息。
在主板上一般会留一个电池的接口座子,智能电池通过接口座子接入到主板,本主板的接口座子如下图所示:
在这里CLK_SMB和DAT_SMB和充放电芯片的SMBus是同一路,直接连接到了EC的SMBus,BATT_PRS在电池内部串联一个10K电阻直接接地,所以在电池插入座子后该引脚会拉低,这个引脚也会直接连接到EC的GPIO引脚,EC会将该GPIO引脚设置为输入模式,当EC检测到该引脚为低电平时,EC就知道了此时电池是存在的。
3.智能电池内部信息读取命令
通过智能电池规范手册可以得知,通过SMBus向电芯发送对应的命令可以得到对应的值,智能电池通过以下功能与SMBus主机、智能电池充电器以及通过SMBus连接的其他设备进行通信,功能说明如下:
在代码中的定义如下:
extern XBYTE BAT1_ManufacturerAccess;
extern XBYTE BAT1_BatteryMode;
extern XBYTE BAT1_Temperature;
extern XBYTE BAT1_Voltage;
extern XBYTE BAT1_Current;
extern XBYTE BAT1_AverageCurrent;
extern XBYTE BAT1_MaxError;
extern XBYTE BAT1_RelativeStateOfChg;
extern XBYTE BAT1_AbsoluteOfCharge;
extern XBYTE BAT1_RemainingCapacity;
extern XBYTE BAT1_FullChargeCapacity;
extern XBYTE BAT1_ChargingCurrent;
extern XBYTE BAT1_ChargingVoltage;
extern XBYTE BAT1_BatteryStatus;
extern XBYTE BAT1_CycleCount;
extern XBYTE BAT1_DesignCapacity;
extern XBYTE BAT1_DesignVoltage;
extern XBYTE BAT1_SpecificationInfo;
extern XBYTE BAT1_ManufactureDate;
extern XBYTE BAT1_SerialNumber;
extern XBYTE BAT1_ManufacturerName[];
extern XBYTE BAT1_DeviceName[];
extern XBYTE BAT1_DeviceChemistry[];
extern XBYTE BAT1_ManufacturerData;
以上比较关注的命令有如下几个:
- Voltage(0x09),返回智能电池的电压值,单位是mV,电压值保将通过两个字节返回给EC,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,意思是读取两个字节的内容,两个字节可以表示的电压范围在0—65535mV之间。
- Current(0x0A),返回智能电池能够提供(或接收)的电流值,单位为mA,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,范围在-32768–32767之间,0–32767mA表示的是充电电流的大小,-32768–0mA,表示放电电流的大小。
- AverageCurrent(0x0b),返回智能电池的平均电流,单位是mA,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,范围在-32768–32767之间,0–32767mA表示的是充电电流的平均大小,-32768–0mA,表示放电电流的平均大小。
- RemainingCapacity(0x0f),返回电池的剩余容量,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这里有两种单位表示方式,mAh和10mWh,这里需要根据Battery Mode的CAPACITY_MODE bit来判断,为0时用mAh表示,为1时用10mWh表示,范围都是0–65525。
- FullChargeCapacity(0x10),在充满电时电池容量,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这里有两种单位表示方式,mAh和10mWh,这里需要根据Battery Mode的CAPACITY_MODE bit来判断,为0时用mAh表示,为1时用10mWh表示,范围都是0–65525。
- BatteryStatus(0x16),返回智能电池的状态,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这个非常重要,在电池异常时需要根据这两个字节的内容来判断电池的状态信息,具体内容如下:
智能电池需要关注的信息大概就是上述六种,其他的等遇到了再进行讲解。
4.充放电管理芯片内部寄存器
充放电管理芯片内部的信息相对智能电池就比较简单,我们需要关注的信息大概就只有三个,分别是充电电压,充电电流和适配器的输入电流,在数据手册中列出如下:
- ChargeCurrent(0x14),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mA,写入的值即是从放电管理芯片输出的充电电流大小;
- ChargeVoltage(0x15),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mV,写入的值即是从放电管理芯片输出的充电电压大小;
- InputCurrent(0x3F),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mA,写入的值即是接收适配器电流输入的大小;
5.充放电逻辑控制
这里假设电池和适配器都是接入了笔记本,并且电池是电量不满的状态。EC端通过充放电管理芯片的ACOK(高有效)判断到适配器的接入,通过智能电池的BATT_PRS(低有效)判断电池接入。
在电池和适配器都接入的情况下,电池进入充电状态,适配器除了给主板供电还需要智能电池充电。
5.1电池充电逻辑
在电池和适配器都接入的情况下,EC通过SMBus的read word协议来获得智能电池的剩余电池容量信息,代码如下:
{ _SMB_RD_WORD, _CMD_RemainingCapacity, &BAT1_RemainingCapacity },
EC通过SMBus的read word协议来获得智能电池的满充容量信息,代码如下:
{ _SMB_RD_WORD, _CMD_FullChargeCapacity, &BAT1_FullChargeCapacity },
通过两个参数相除可以获得电池的剩余电量百分比:
remaining_percent = BAT1_RemainingCapacity / BAT1_FullChargeCapacity;
- 如果remaining_percent = 100%,停止智能电池的充电,适配器只对主板供电。
EC通过SMBus对充放电管理芯片内部的ChargeCurrent和ChargeVoltage设置为0来停止智能电池的充电。
- 如果remaining_percent < 100%,电池进入充电状态,适配器除了给主板供电还需要智能电池充电。
EC通过SMBus获取智能电池需要的充电电流和充电电压的值:
{ _SMB_RD_WORD, _CMD_ChargingVoltage, &BAT1_ChargingVoltage },
{ _SMB_RD_WORD, _CMD_BatteryStatus, &BAT1_BatteryStatus },
EC再通过SMBus将读读取到的智能电池需要的充电电流和充电电压写入到充放电管理芯片中,这样充放电管理芯片就可以输出智能电池需要的电流和电压来对自己进行充电了。
5.2电池放电逻辑
电池放电的条件:
- 适配器不存在;
- 电池电量大于断电电量;
因为只要有适配器存在,电池是不会进行放电的。有些EC设置了当电量小于某个阈值(比如5%)时,会强制笔记本进入休眠状态,以此来保护电池。
|