【嵌入式硬件芯片开发笔记】LP87702/LP87524电源芯片配置流程
LP8752x-Q1 10-A Buck Converter With Integrated Switche
具有诊断功能的 LP87702-Q1 双路降压转换器和 5V 升压转换器
LP87702/LP87524从机地址都是0x60
LP87702/LP87524中的设备ID等寄存器,是根据OTP EPROM来确定的,每一个芯片其设备ID都不同,通过判断是否首次启动来进行不同的操作。
PWM和PFM两种工作模式:前者驱动电流更大,600mA或更大负载下用PWM。强制使用PWM模式时,若负载小,则会自动切换到PFM模式。配置相应寄存器可以控制,建议选择自动模式。
LP87702/LP87524开始运行
- 使能VCC_5V,(ENABLE_VCC_5V),VCC_5V_EN引脚输出高电平,EN_LP87702输出高电平(最好是延迟4ms后再延迟4ms)
- 根据EEPROM中的某一区域标志位判断LP87702/LP87524是否是首次启动(也可通过I2C_Judge函数来判断设备是否正常,则可忽略这一步骤):
LP87702/LP87524 首次启动:
①软件复位:LP87524 0x18和LP87702 0x1F写入0x01延迟10ms
②读取设备ID寄存器,写入到EEPROM对应部分,对应启动标志位置1
LP87702/LP87524 非首次启动:
①软件复位:LP87524 0x18和LP87702 0x1F写入0x01延迟10ms
②读取EEPROM的设备ID存储部分,读取设备ID寄存器,两者相同则向下进行,否则报错
3. 执行初始化
LP87702初始化.
- 将0x00写入LP87702_CONFIG,不选择下拉,此寄存器也可配置信号延时
- 配置以下寄存器,使CLKIN引脚用作控制看门狗的开启/禁用
#define LP87702_WD_DIS_CTRL_CODE 0x34 连续写入0x87,0x65,0x1B解锁
#define LP87702_WD_DIS_CONTROL 0x35 写入0x01
看门狗配置寄存器为0x1C-0x3E
配置WD_CTRL_2寄存器,可以设置WD_RESET输出方式和有效电平,Bit2默认为0表示WDI无下拉,写入0x00改为推挽输出
3. 依次配置以下寄存器,使B0输出1.8V,B1输出1.0V,BOOST输出5V:
#define LP87702_BUCK0_CTRL_1 0x02 默认0x08
#define LP87702_BUCK0_CTRL_2 0x03 默认0x1A
#define LP87702_BUCK1_CTRL_1 0x04 默认0x08
#define LP87702_BUCK1_CTRL_2 0x05 默认0x1A
#define LP87702_BUCK0_VOUT 0x06 写入0xB1
#define LP87702_BUCK1_VOUT 0x07 写入0x4D
#define LP87702_BOOST_CTRL 0x08 写入0x58
若需要延迟开启或关闭,则配置DEALY寄存器
若需启用电压监测,则配置PGOOD寄存器
最后一步再开启电压输出:
BUCK0_CTRL_1 先读取再写入使bit0置1
BUCK1_CTRL_1 先读取再写入使bit0置1
BOOST_CTRL 先读取再写入使bit0置1
4. 若有需要,可编程GPO引脚可以通过配置寄存器来输出高低电平。监测启用时,配置PG_CTRL寄存器可以使GPO用于监测输出。中断及状态在INT和STATUS寄存器内,中断屏蔽配置在MASK寄存器内。SEL_I_LOAD寄存器可开启电流测量。BOOST_ILIM_CTRL寄存器用于配置电流限度。
LP87524初始化
- 将0x40写入LP87524_CONFIG,CLKIN下拉,其他不选择下拉,此寄存器也可配置信号延时
- 将0x00写入PIN_FUNCTION寄存器,使其不使用GPIO功能
- 依次配置以下寄存器,使B0输出3.3V,B1输出1.8V,B2输出1.2V,B3输出1.0V
#define LP87524_BUCK0_CTRL1 0x02 写入0x34,bit7控制开启
#define LP87524_BUCK1_CTRL1 0x04 写入0x44,bit7和EN1控制开启
#define LP87524_BUCK2_CTRL1 0x06 写入0x54,bit7和EN2控制开启
#define LP87524_BUCK3_CTRL1 0x08 写入0x64,bit7和EN3控制开启
#define LP87524_BUCK0_VOUT 0x0A 写入0xFC
#define LP87524_BUCK0_FLOOR_VOUT 0x0B 写入0xFC
#define LP87524_BUCK1_VOUT 0x0C 写入0xB1
#define LP87524_BUCK1_FLOOR_VOUT 0x0D 写入0xB1
#define LP87524_BUCK2_VOUT 0x0E 写入0x75
#define LP87524_BUCK2_FLOOR_VOUT 0x0F 写入0x75
#define LP87524_BUCK3_VOUT 0x10 写入0x4D
#define LP87524_BUCK3_FLOOR_VOUT 0x11 写入0x4D
若需要延迟开启或关闭,则配置DEALY寄存器
若需启用电压监测,则配置PGOOD寄存器
最后一步再开启电压输出:
BUCK0_CTRL1 先读取再写入,使bit7置1
BUCK1_CTRL1 先读取再写入,使bit7置1,EN1输出高电平
BUCK2_CTRL1 先读取再写入,使bit7置1,EN2输出高电平
BUCK3_CTRL1 先读取再写入,使bit7置1,EN3输出高电平
3. 若有需要,可使能EN的GPIO复用功能,编程引脚可以通过配置寄存器来输出高低电平。中断及状态在INT和STAT寄存器内,中断屏蔽配置在MASK寄存器内。SEL_I_LOAD寄存器可开启电流测量。
代码例程
/*!
* @brief 使能LP87702_WDI引脚的定时器,开启定时器中断和PWM,并设置占空比为50
*
* @param None
*
* @return None
*/
void Enable_LP87702_WDI_TIM(void)
{
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_4,50);
}
/*!
* @brief 复位LP87702
*
* @param None
*
* @return false/true: 错误/正确标志
*/
bool Reset_LP87702(void)
{
uint8_t dat=0;
dat=0x01;
if(I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_RESET,1,&dat,1,true)!=true)
{
return false;
}
delay_ms(10);
return true;
}
/*!
* @brief 初始化LP87702
*
* @param None
*
* @return 0/1: 错误/正确标志
*/
uint8_t Init_LP87702(void)
{
uint8_t dat=0;
Enable_VCC_5V;
delay_ms(5);
Enable_LP87702_EN;
delay_ms(5);
if(!I2C_Judge(&hi2c4,LP87702_Slave_Add))
{
return 0;
}
if(!Reset_LP87702())
{
return 0;
}
dat=0x00;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_CONFIG,1,&dat,1,true);
dat=0x87;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_WD_DIS_CTRL_CODE,1,&dat,1,true);
dat=0x65;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_WD_DIS_CTRL_CODE,1,&dat,1,true);
dat=0x1B;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_WD_DIS_CTRL_CODE,1,&dat,1,true);
dat=0x01;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_WD_DIS_CONTROL,1,&dat,1,true);
dat=0x00;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_WD_CTRL_2,1,&dat,1,true);
dat=0x08;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK0_CTRL_1,1,&dat,1,true);
dat=0x1A;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK0_CTRL_2,1,&dat,1,true);
dat=0x08;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK1_CTRL_1,1,&dat,1,true);
dat=0x1A;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK1_CTRL_2,1,&dat,1,true);
dat=0xB1;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK0_VOUT,1,&dat,1,true);
dat=0x4D;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK1_VOUT,1,&dat,1,true);
dat=0x58;
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BOOST_CTRL,1,&dat,1,true);
delay_ms(10);
dat=I2C_Read_y(&hi2c4,LP87702_Slave_Add,LP87702_BUCK0_CTRL_1,1,1,true);
dat|=(1<<0);
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK0_CTRL_1,1,&dat,1,true);
dat=I2C_Read_y(&hi2c4,LP87702_Slave_Add,LP87702_BUCK1_CTRL_1,1,1,true);
dat|=(1<<0);
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BUCK1_CTRL_1,1,&dat,1,true);
dat=I2C_Read_y(&hi2c4,LP87702_Slave_Add,LP87702_BOOST_CTRL,1,1,true);
dat|=(1<<0);
I2C_Write_x(&hi2c4,LP87702_Slave_Add,LP87702_BOOST_CTRL,1,&dat,1,true);
return 1;
}
/*!
* @brief 复位LP87524
*
* @param None
*
* @return false/true: 错误/正确标志
*/
bool Reset_LP87524(void)
{
uint8_t dat=0;
dat=0x01;
if(I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_RESET,1,&dat,1,true)!=true)
{
return false;
}
delay_ms(10);
return true;
}
/*!
* @brief 初始化LP87524
*
* @param None
*
* @return 0/1: 错误/正确标志
*/
uint8_t Init_LP87524(void)
{
uint8_t dat=0;
Enable_VCC_5V;
delay_ms(5);
Disable_LP87524_EN1;
Disable_LP87524_EN2;
Disable_LP87524_EN3;
delay_ms(5);
if(!I2C_Judge(&hi2c2,LP87524_Slave_Add))
{
return 0;
}
if(!Reset_LP87524())
{
return 0;
}
dat=0x40;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_CONFIG,1,&dat,1,true);
dat=0x00;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_PIN_FUNCTION,1,&dat,1,true);
dat=0x34;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK0_CTRL1,1,&dat,1,true);
dat=0x44;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK1_CTRL1,1,&dat,1,true);
dat=0x54;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK2_CTRL1,1,&dat,1,true);
dat=0x64;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK3_CTRL1,1,&dat,1,true);
dat=0xFC;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK0_VOUT,1,&dat,1,true);
dat=0xFC;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK0_FLOOR_VOUT,1,&dat,1,true);
dat=0xB1;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK1_VOUT,1,&dat,1,true);
dat=0xB1;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK1_FLOOR_VOUT,1,&dat,1,true);
dat=0x75;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK2_VOUT,1,&dat,1,true);
dat=0x75;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK2_FLOOR_VOUT,1,&dat,1,true);
dat=0x4D;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK3_VOUT,1,&dat,1,true);
dat=0x4D;
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK3_FLOOR_VOUT,1,&dat,1,true);
dat=I2C_Read_y(&hi2c2,LP87524_Slave_Add,LP87524_BUCK0_CTRL1,1,1,true);
dat|=(1<<7);
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK0_CTRL1,1,&dat,1,true);
dat=I2C_Read_y(&hi2c2,LP87524_Slave_Add,LP87524_BUCK1_CTRL1,1,1,true);
dat|=(1<<7);
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK1_CTRL1,1,&dat,1,true);
Enable_LP87524_EN1;
dat=I2C_Read_y(&hi2c2,LP87524_Slave_Add,LP87524_BUCK2_CTRL1,1,1,true);
dat|=(1<<7);
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK2_CTRL1,1,&dat,1,true);
Enable_LP87524_EN2;
dat=I2C_Read_y(&hi2c2,LP87524_Slave_Add,LP87524_BUCK3_CTRL1,1,1,true);
dat|=(1<<7);
I2C_Write_x(&hi2c2,LP87524_Slave_Add,LP87524_BUCK3_CTRL1,1,&dat,1,true);
Enable_LP87524_EN3;
return 1;
}