英集芯-IP5385开发调试总结
简介
我们开发的一款移动电源设备用到英集芯的IP5385,这里做一下开发调试总结,与各位朋友分享一下,欢迎交流。
IP5385是英集芯的一款移动电源SOC,支持 SCP、 PD3.0、 UFCS 等快充协议, 支持 2~6 节串联电池, 集成升降压驱动, 最大功率 100W。
支持多个USB口,寄存器数据种类丰富,可根据自己的需求进行相应的读写操作。
一、功能需求
这里使用IP5385主要是2路USB-C口做输入输出,1路USB-A口单向输出,输入功率最大30W,输出功率最大65W。
设备有几种工作状态,输入输出端口的电压电流数据,NTC温度需要从IP5385中获取。
1.1 状态数据
需要获取的状态:充电、放电状态,根据充放电状态,数码管显示不同的状态;
小电流状态,小电流模式下,数码管显示特定状态;
高温、低温、正常温度状态,温度异常状态下,数码管爆闪。
1.2 实时数据
当A1口输出时,获取A1口的输出电压,输出电流数据;
当C1口输入输出时,获取C1口的实时电压、电流数据;
当C2口输入输出时,获取C1口的实时电压、电流数据;
获取NTC的ADC值,换算成实际的温度。
二、寄存器读写
寄存器规格书中并不是每个端口的电压、电路数据都能获取到,有些数据获取的是三个MOS后端的总的数据,下面我们来详细看下数据怎么区分。
2.1 电压数据
当我们要获取每个端口的电压数据时,发现找不到此寄存器,最后找到一个VSYS电压寄存器,是的,这个就是电路中输入输出端总的电压,电路中具体位置,如下图所示。
这个电压寄存器,可作为C1,C2输入电压、A1,C1,C2输出电压,就是无论输入还是输出的电压,都是从这里流过。
这里需要读2个寄存器,分别是电压数据高8位和低8位,读上来之后合成为16位数据,再按照规格书中公式换算成实际电压值即可,VSYS电压寄存器如下图所示。
2.2 电流数据
2.2.1 输入电流
电流数据寄存器就比较多了,分为输入电流寄存器,输出电流寄存器。
只有C1,C2可作为输入端,所以输入电流寄存器只需要读C1,C2端的就可以,但是规格书中只有VBUS端的输入电流寄存器,VBUS端也就是C1端,C2端的输入电流数据寄存器没有,这里只能读VSYS端的电流寄存器。
把读取的VSYS端的电流寄存器,作为C1,C2端的输入电流,寄存器值如下图所示。
2.2.2 输出电流
A1,C1,C2端口的输出电流,规格书中都有对应的寄存器可读取,分别是VOUT1输出电流寄存器、IVBUS输出电流寄存器、IVIN输出电流寄存器。
对应的寄存器如下图:
2.3 状态寄存器
状态分为3中:充/放电状态、小电流状态、过温状态。
那么,对应的状态寄存器需要读取3个:充电状态指示寄存器、输入状态指示寄存器、NTC 状态指示寄存器。
2.3.1 充电状态指示寄存器
充电状态指示寄存器通过判断bit5的值,bit5为1表示充电状态,为0表示放电状态。
寄存器值如下图:
2.3.2 输入状态指示寄存器
该寄存器通过判断bit字节的数据,bit3:1-小电流模式,0-正常模式,这个是后期定制增加的,所以规格书中没有显示。
寄存器值如下图:
2.3.3 NTC 状态指示寄存器
过温状态通过判断此寄存器的bit6,bit7字节,来确定是NTC高温保护,还是低温保护。
寄存器值如下图:
三、代码实现
通过以上,我们可以知道主控对于IP5385的操作基本只有读数据操作,所以,我们只需要IIC通信的读数据操作就可以,这里代码例程以某一个寄存器读取为例。
寄存器宏定义代码如下:
#define PS_IP5385_ADDR 0xEA
#define PS_IP5385_GET_LITTLE_CUR_STA 0x33 //bit3:1-小电流模式,0-正常模式
#define PS_IP5385_GET_FASTCHRG_STA 0x32
#define PS_IP5385_GET_CHRG_STATE 0x31 //bit5=1充电,bit5=0放电,bit2-0=5充满
#define PS_IP5385_GET_NTC_STATE 0x30 //bit7=1高温保护,bit6=1低温保护
#define PS_IP5385_GET_NTC_L 0x4A
#define PS_IP5385_GET_NTC_H 0x4B
#define PS_IP5385_GET_VSYS_V_L 0x3A //VSYS电压:可做C1,C2输入电压、A1,C1,C2输出电压
#define PS_IP5385_GET_VSYS_V_H 0x3B
#define PS_IP5385_GET_ISYS_I_L 0x48 //IVSYS电流:可做C1,C2输入电流
#define PS_IP5385_GET_ISYS_I_H 0x49
#define PS_IP5385_GET_VOUT1_I_L 0x3E //VOUT输出电流
#define PS_IP5385_GET_VOUT1_I_H 0x3F
#define PS_IP5385_GET_IVBUS_L 0x42 //IP5385_C1输出电流
#define PS_IP5385_GET_IVBUS_H 0x43
#define PS_IP5385_GET_IVIN_L 0x44 //IP5385_C2输出电流
#define PS_IP5385_GET_IVIN_H 0x45
#define PS_IP5385_GET_MOS_STATE 0x35 //输出输入 MOS 状态指示寄存器
IIC读取状态寄存器代码例程如下:
if(I2CMasterReadData(PS_IP5385_ADDR,PS_IP5385_GET_LITTLE_CUR_STA,&u8IP5385LittleCurSta,1) == TRUE)
{if(((u8IP5385LittleCurSta >> 3) & 0x1) == 1){PS_BattState.EnterLittleCurFlag = 1;}else{PS_BattState.EnterLittleCurFlag = 0;}
}
IIC读数据寄存器代码例程如下:
case 8:if(MODBUS_GET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG)){if(I2CMasterReadData(PS_IP5385_ADDR,PS_IP5385_GET_VSYS_V_H,&u8VsysVol,1) == TRUE){su16IP5385VsysVolAdc = u8VsysVol;su16IP5385VsysVolAdc = su16IP5385VsysVolAdc << 8;}MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG);g_stuSysTim.m_u16SysTim5ms = 0;g_su8ReadDatSta = 9;}break;
case 9:if(MODBUS_GET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG)){if(I2CMasterReadData(PS_IP5385_ADDR,PS_IP5385_GET_VSYS_V_L,&u8VsysVol,1) == TRUE){su16IP5385VsysVolAdc |= u8VsysVol; u32IP5385VsysVolTem = (su16IP5385VsysVolAdc * 26855) / 10000; //mVstuBatDat.m_u16VsysVol = (uint16_t)u32IP5385VsysVolTem;}printf("stuBatDat.m_u16VsysVol(C1/C2/A1_Vsys电压):%d\r\n",stuBatDat.m_u16VsysVol); //调试MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG);g_stuSysTim.m_u16SysTim5ms = 0;g_su8ReadDatSta = 10;}break;
四、总结
综上,我们获取了这么多IP5385的寄存器数据,代码实现时需做好模块化设计,建议采用状态机+定时器的模式去设计,所有的寄存器地址采用宏定义,增加代码可读性。