前言

最近在做EC方面的项目,客户需求带电池的方案。EC芯片用的是ITE的IT5571。

本人刚毕业,对EC方面很多都不懂,以下内容是我在网上找的各种资料经过自己的理解所总结。如有错误请指正谢谢!

1.智能电池组成

智能电池的构造简单来说主要分为电芯(cell)、电池保护板(bms)、电池外壳这几部分。

电芯仅仅用来提供电压电流。几个电芯串联起来就是电池包(package)。若一个电芯的电压为3.7V,电池包为3个电芯串联,则电池包电压为3.7X3=11.1V。

电池保护板则负责电池的充放电管理以及和OS数据通信。

2.智能电池和EC以及OS之间通信

智能电池是一个SMBus设备,通过SMBus总线来进行数据传输。电池信息数据到操作系统的数据流向:SMART BATTERY->EC SMBUS->EC 62/66 PORT->BIOS->OS。既然智能电池是SMBus设备,那么要和智能电池通信就要知道其相对应的设备地址。以bq29330+bq20z70电池保护板为例,查询芯片手册可知bq20z70的从设备地址为0x16。

下图为bq20z70 datasheet中提到的SMBus设备地址:

3.智能电池与EC连接

下图为某智能电池的保护电路原理图。我们需要注意PRES、SMBC、SMBD这三个引脚。SMBC与SMBD和EC上的一组SMBus channel直接相连。

PRES(System Present Flag)脚的作用是用作EC检测电池是否插入的判断脚。PRES连接EC的GPIO脚,GPIO脚配置为输入模式,初始上拉为高电平,需要提前去抖。当智能电池接入座子,则EC检测到PRES脚拉低,在代码中通过判断得知电池的存在。

保护电路板原理图:

4.智能电池标准SBS命令

所有的智能电池都符合Smart Battery System(SBS)规范。在此规范中统一定义了智能电池标准的查询信息命令,这些标准命令是所有电池公用的。不同的电池除了标准的SBS命令以外还会有自己独有的命令,在手册中查询Extended SBS Commands来查看相对应功能。

下图为智能电池规范中截取的标准SBS命令:

通过命令获取电池所需充电电流和充电电压值,写入charger的寄存器中即可实现智能电池的智能充电。

下图为获取电池所需充电电流和充电电压命令:

下图为截取的部分bq20z70 Extended SBS Commands:

bq20z70生产厂商为德州仪器,在官网可以下载专门调试电池的软件bqstudio。不知道是不是型号太老的原因,bq20z70会被识别为bq40z50。

5.EC代码

首先在EC的H2RAM中将电池相关的寄存器写入。

关于H2RAM,在相关的文档中找到这段话:

载板 EC 应该启用 256 个字节的 H2RAM 窗口以供 MMIO 中的 BIOS 访问 0xFE41_0400~0xFE41_04FF。

在 ACPI OS 中,在收到 ACPI_ENABLE 0x86 EC 命令之后,载板 EC 固件必须公开以下必需的内存 MMIO,并可以选择公开 UCSI/WMI MMIO 以进行 BIOS 访问:
        • 强制 128 字节只读 ELM_EC MMIO 区域 0xFE41_0400~0xFE41_047F。
        • 强制 128 字节读/写 ELM_EC MMIO 区域 0xFE41_0480~0xFE41_04FF。
        • 载板 EC 固件和软件可以使用 0xFE41_0000~0xFE41_3FFF 之间的任何未使用区域。 BIOS 将不会访问未定义的 EC MMIO 区域。

Oem_memory.h//batt1--------------------------------------------------------------------
extern ECRegW xwBatt1Temperature           ;//_at_ (MEM_RO_CONFIG+0x50);
extern ECRegW xwBatt1Voltage               ;//_at_ (MEM_RO_CONFIG+0x52);
extern ECRegW xwBatt1Current               ;//_at_ (MEM_RO_CONFIG+0x54);
extern ECRegW xwBatt1RemainingCapacity     ;//_at_ (MEM_RO_CONFIG+0x56);
extern ECRegW xwBatt1FullChargeCapacity    ;//_at_ (MEM_RO_CONFIG+0x58);
extern ECRegW xwBatt1DesignCapacity        ;//_at_ (MEM_RO_CONFIG+0x5A);
extern ECRegW xwBatt1RelativeStateOfCharge ;//_at_ (MEM_RO_CONFIG+0x5C);
extern ECRegW xwBatt1ChargingCurrent       ;//_at_ (MEM_RO_CONFIG+0x5E);
extern ECRegW xwBatt1ChargingVoltage       ;//_at_ (MEM_RO_CONFIG+0x60);
extern XBITS_8 xbBatt1Status                 ;//_at_ (MEM_RO_CONFIG+0x62);
#define _xbBatt1Status         xbBatt1Status.byte
#define Batt1_AC_Present       xbBatt1Status.field.bit0
#define Batt1_Batt_Present     xbBatt1Status.field.bit1
#define Batt1_FullCharge       xbBatt1Status.field.bit2
#define Batt1_Chaging          xbBatt1Status.field.bit3
#define Batt1_Discharging      xbBatt1Status.field.bit4
#define Batt1_Critical_low     xbBatt1Status.field.bit5
#define Batt1_Over_Temperature xbBatt1Status.field.bit6
#define Batt1_Lid_Open         xbBatt1Status.field.bit7
//batt1--------------------------------------------------------------------
Oem_memory.c//batt1-------------------------------------------------------------
ECRegW xwBatt1Temperature           _at_ (MEM_RO_CONFIG+0x50);
ECRegW xwBatt1Voltage               _at_ (MEM_RO_CONFIG+0x52);
ECRegW xwBatt1Current               _at_ (MEM_RO_CONFIG+0x54);
ECRegW xwBatt1RemainingCapacity     _at_ (MEM_RO_CONFIG+0x56);
ECRegW xwBatt1FullChargeCapacity    _at_ (MEM_RO_CONFIG+0x58);
ECRegW xwBatt1DesignCapacity        _at_ (MEM_RO_CONFIG+0x5A);
ECRegW xwBatt1RelativeStateOfCharge _at_ (MEM_RO_CONFIG+0x5C);
ECRegW xwBatt1ChargingCurrent       _at_ (MEM_RO_CONFIG+0x5E);
ECRegW xwBatt1ChargingVoltage       _at_ (MEM_RO_CONFIG+0x60);
XBITS_8 xbBatt1Status               _at_ (MEM_RO_CONFIG+0x62);
//batt1-------------------------------------------------------------

在battery.h文件中定义SBS命令,电池地址和SMBuschannel。

Oem_battery.h#ifndef OEM_BATTERY_H
#define OEM_BATTERY_H#define Battery_Addr       0x16
#define Battery_Channel SMbusCh2
#define _SCIEVT_BATTERY                     0x09    //battery Q EVENT//****************************************
//            SBS command list
//****************************************
#define    _CMD_Temperature             0x08
#define    _CMD_Voltage                 0x09
#define    _CMD_Current                 0x0a
#define    _CMD_RemainingCapacity       0x0f
#define    _CMD_FullChargeCapacity      0x10
#define    _CMD_DesignCapacity          0x18
#define    _CMD_RelativeStateOfCharge   0x0d
#define    _CMD_ChargingCurrent         0x14
#define    _CMD_ChargingVoltage         0x15extern void vBattery_Init(void);
extern void vBattery_GetInfo(void);#endif

在Oem_memory.c文件中写查询信息函数。由于SMBus查询函数已经写好,只要填入相关参数调用即可。

#include <CORE_INCLUDE.H>
#include <OEM_INCLUDE.H>int vCheck_BattPlugIn(void)
{if(IS_MASK_CLEAR(GPDRA, BIT(0)) // 这里应检测pres对应脚是否位低电平,如果为低则表示电池接入{Batt1_Batt_Present = 1;WriteBatterySCI_Buffer(_SCIEVT_BATTERY);}else{Batt1_Batt_Present = 0;}return Batt1_Batt_Present;
}void vBattery_Init(void)
{vCheck_BattPlugIn();
}void vBattery_GetInfo(void){if(Batt1_Batt_Present){
//函数参数分别为channel,protocol,addr,CMD,*var
if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_Temperature,&xwBatt1Temperature,SMBus_NoPEC)){
//读取电池温度}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_Voltage,&xwBatt1Voltage,SMBus_NoPEC)){
//读取电压}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_Current,&xwBatt1Current,SMBus_NoPEC)){
//读取电流}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_RemainingCapacity,&xwBatt1RemainingCapacity,SMBus_NoPEC)){
//读取剩余容量    }if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_FullChargeCapacity,&xwBatt1FullChargeCapacity,SMBus_NoPEC)){
//读取充满电容量}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_DesignCapacity,&xwBatt1DesignCapacity,SMBus_NoPEC)){
//读取设计容量}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_RelativeStateOfCharge,&xwBatt1RelativeStateOfCharge,SMBus_NoPEC)){
//读取相对容量}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_ChargingCurrent,&xwBatt1ChargingCurrent,SMBus_NoPEC)){
//读取充电电流}if(bRWSMBus(Battery_Channel,SMbusRW,Battery_Addr,_CMD_ChargingVoltage,&xwBatt1ChargingVoltage,SMBus_NoPEC)){
//读取充电电压}}
}

初始化SMBus主设备,在相关文档找到SMBus的操作频率:

在init文件中写入电池SMBus主设备初始化。

Oem_init.cvoid Init_SMBus_Regs(void)
{vSMBus_SW_Timing(_i2c_100k);vSMBus_Master_Enable(_SMBusChC, _SMB2, _i2c_fix_100k, _FifoSize_256_Byte);//Battery}

一切都写好,正当我沾沾自喜时,突然出现一个致命的问题,在系统下读取的电池温度,容量等等数值都是不正确的!用ITE专门的调试软件NewWinECU连接EC后,直接查看H2RAM中关于电池寄存器的值。发现数值读取出来怪怪的不对劲。琢磨了很久终于发现是高低位调换了所导致读数不正确!

正常情况下应该在代码中将高低位的数值调换一下,不过我选择了一个很投机取巧的方法(笑)将电池所用的这组channel中的数据寄存器高低位直接调换即可。

Oem_smbus.cconst sSMBus code asSMBus[]=
{{ &HOCTL_C, &TRASLA_C, &HOCMD_C, &HOSTA_C, &D1REG_C, &D0REG_C, &HOBDB_C,   &IER2,  &ISR2,  Int_SMBUS2,   &PECERC_C},//用的这个channel接的电池,将数据寄存器高低位调换位置,即D1REG_C和D0REG_C{ &HOCTL_D, &TRASLA_D, &HOCMD_D, &HOSTA_D, &D0REG_D, &D1REG_D,   &HOBDB_D,   &IER0,  &ISR0,  Int_SMBUS3,   &PECERC_D},//这是没改的
};

大功告成。这次确实读数正确了! 关于电池充电方面后续研究。目前这样写是能够在windows下读取到电池的信息了。

6.关于各种电量指标理解

下图为在acpi config power interface spec文档中找到各种电量的示意图:

关于相对容量和绝对容量的计算方法:

Relative State Of Charge = Remaining Capacity/Full Charge Capacity

Absolute State Of Charge = Remaining Capacity/Design Capacity

EC智能电池信息读取相关推荐

  1. smbus电池信息读取

    smbus协议的智能电池,我们可以使用i2c的读写方式获取ic信息,也可以使用smbus协议的接口获取 编译方法 :arm-none-linux-gnueabi-gcc  batterygetdemo ...

  2. 14.嵌入式控制器EC实战 SMBus读取电池信息并控制充放电

    文章目录 1.充放电芯片初始化 2.智能电池初始化 3.智能电池内部信息读取命令 4.充放电管理芯片内部寄存器 5.充放电逻辑控制 5.1电池充电逻辑 5.2电池放电逻辑 在EC中,除了使用SMBus ...

  3. SBEC016智能电池管理方案

    智能电池管理方案 X86平台双电池智能电池管理方案 SBEC016智能电池管理方案功能说明 1.   SBEC016方案控制芯片采用Atmel AVR系列芯片,低功耗,工作稳定 2.   支持19V/ ...

  4. 物联网电动汽车智能电池监控

    简介 本文演示的硬件和软件,以创建一个实用的移动工程工具来监控和检查卫生随着铅酸蓄电池等诸多参数的组合,汽车电池被选为一个简单的例子.许多现代类型的电池(如锂电池)的设计与智能电池芯片内置的,它提供了 ...

  5. Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据

    获取手机信息,代码复制可用,开发工具为:Android Studio 1.手机品牌 2.手机型号 3.屏幕分辨率 4.像素密度 5.屏幕尺寸 6.Android 系统版本 7.运行内存 8.储存空间 ...

  6. CocosCreator之KUOKUO带你搞反射-获取电池信息

    摘要 在使用 CocosCreator 打包的原生应用中,我们可以通过引擎封装好的反射机制调用 Java 的静态方法,从而实现提示.相册.支付跳转等功能.本次内容为利用 jsb 读取返回的电池信息. ...

  7. AGV车托盘信息读取CK-UR08-E02工业级超高频RFID读写器|读卡器性能与接线、PLC组网说明

    CK-UR08-E02是天线一体式超高频读写器头,工作频率为920MHz-925MHz,符合EPC Global Class l Gen 2/IS0-18000-6C标准,最大输出功率26dBm.读卡 ...

  8. cpc无法获取系统office信息_智能云信息发布系统解锁信息获取新方式

    智能云信息 发布系统 为满足现代人快捷获取信息的需求 智能云信息发布系统应运而生 其靠易用.稳定高效特性 解锁了在商超.车站.银行. 酒店.影院等场景 获取信息的正确方式 在商场 尽享纵情购物时刻 进 ...

  9. 华御密盾智能防信息泄密系统

    计算机与网络的普及应用让信息的生产.存储.获取.共享和传播更加方便,同时也增加了组织内部重要信息泄密的风险.来自 Gartner 的调查显示:有超过 85%的安全威胁来自组织内部:各种安全漏洞造成的损 ...

最新文章

  1. Kafka 安装配置及快速入门
  2. 2019天梯赛(总结-无题解)
  3. (二十):response 对象 (JSP学习第六天)
  4. flink的checkpoint实验-scala版本
  5. [CityLife]“背后的故事”---贫嘴曾志伟
  6. VB100十月测试:360可牛凯歌高奏 金山失利瑞星缺席
  7. 鸿蒙os智能座舱,华为智能座舱的野心:HiCar上车,为鸿蒙OS铺路
  8. linux内核分析第五次实验
  9. 你不知道的三大 JavaScript “黑话”!
  10. flex制作一个用户登录框(含验证码)
  11. PS暂存盘已满怎么办
  12. LittleVGL-键盘控件
  13. Docsify+github/gitee搭建个人博客
  14. ❤️FFmpeg❤️ MP4格式文件,将MPEG4的编码方式转为H.264
  15. Spring之IOC~控制反转
  16. qtxlsx编译报错_QtXlsx编译错误*** [Makefile:37: sub-xlsx-qmake_all] Error 2
  17. Pygame(四)画椭圆,弧
  18. 数据处理的基本方法--简要介绍
  19. JVM参数无效(-XX:+HeapDumpOnOutOfMemoryError设置无效)
  20. CRF条件随机场模型笔记

热门文章

  1. 【建议收藏】ChatGPT 联网版抢先体验,学会这 8 大高阶实用技巧,让你秒上手!
  2. 徒手撸一个好玩的App:美图
  3. 直播svga礼物特效设计
  4. python最好用的助手_让Python爬虫变成你的好助手
  5. font-awesome样式只显示方框
  6. 苹果摊上事了,iPhone 13新机大翻车,坑害无数人
  7. HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)
  8. python基础-元组、集合 、字典
  9. MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法
  10. MySQL之父开发的 MariaDB 数据库,扩展了新功能……