BQ24295电源管理芯片驱动

一、BQ24295简介
数据手册:
https://www.ti.com/cn/lit/ds/symlink/bq24295.pdf
芯片作用:给锂电池充电和放电给系统
输入电压:3.9~6.2V
输入电流:100mA、150mA、500mA、900mA、1A、1.5A、2A、3A。
电脑端的USB-(TYPE-C接口)的电压时5V,500mA。
SYS端口提供3.5V电压给MCU。
在这里插入图片描述

管脚功能(可能理解不全面或者有误 狗头狗头~~):
VBUS:输入充电电压。
PMID:接入VBUS时,PMID电压等于VBUS,没接入VBUS时,BOOST模式下,BAT升压提供电压给PMID。
OTG:OTG模式,设备对设备模式。没用到接GND。
D+/D-检测输入电压和电流,没用到,两端接个10R电阻。
INT:中断管脚,报告充电设备的状态和错误。
CE:低电平使能充电功能。
ILIM:输入电流最大值设置,EN_ILIM=1时,输入电流最大值有外电路和寄存器REG00[2:0]共同决定。
STAT:指示灯作用,输出低电平时,
SCL:IIC时钟线
SDA:IIC数据线
SW:输出PWM波形
SYS:输出3.5V电压给MCU供电。
BAT:接电池的正极。
QON:低电平有效,BAT和QON之间接一个按键。是按下按键,QON接地,使能电池BAT给MCU供电??
TS:温度检测管脚,过温保护。

二、寄存器操作:
IIC Address: 6BH. REG00-07寄存器可读可写、 REG08-0A只可读。
写寄存器值时,IIC Address为:D6H
读寄存器值时,IIC Address为:D7H

I2C地址的问题:
最低位方向位0表示写,1表示读
1101011(address 0x6B)+0(direction)=11010110(B),即D6(H) 写寄存器
1101011(address 0x6B)+1(direction)=11010111(B),即D7(H) 读寄存器

寄存器0:输入电压和输入电流最大值设置。
寄存器1:寄存器复位、看门狗功能、OTG模式使能、CHG充电模式使能。
寄存器2:充电电流设置。
寄存器3:预充电电流和充电完成电流设置
寄存器4:充电电压设置
寄存器5:充电最长时间设置、看门狗时间设置
寄存器6:升压电压设置、过温阈值设置
寄存器7:D+/D-检测使能、电池错误和充电错误产生中断使能。
寄存器8:状态标志位(只读)
寄存器9:错误标志位(只读)。
寄存器10(A):芯片型号获取(只读)
过于具体的可以看数据(我理解的可能也有误,或者过于浅显)。

三、IIC驱动代码(还没验证过)
正点原子的IIC驱动。
只填了两个新函数:

u8 BQ24295_Write_Reg(u8 reg,u16 val);//写BQ24295寄存器
u8 BQ24295_Read_Reg(u8 reg);//读BQ24295寄存器
//IIC初始化
void IIC_Init(void)
{
   
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOH_CLK_ENABLE();   //使能GPIOH时钟
    
    //PH4,5初始化设置
    GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5;
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
    
    IIC_SDA(1);
    IIC_SCL(1);  
}

//产生IIC起始信号
void IIC_Start(void)
{
   
	SDA_OUT();     //sda线输出
	IIC_SDA(1);	  	  
	IIC_SCL(1);
	delay_us(4);
 	IIC_SDA(0);//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{
   
	SDA_OUT();//sda线输出
	IIC_SCL(0);
	IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL(1); 
	delay_us(4);			
	IIC_SDA(1);//发送I2C总线结束信号				   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
   
	u8 ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	IIC_SDA(1);delay_us(1);	   
	IIC_SCL(1);delay_us(1);	 
	while(READ_SDA)
	{
   
		ucErrTime++;
		if(ucErrTime>250)
		{
   
			IIC_Stop();
			return 1;
		}
	}
	IIC_SCL(0);//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
   
	IIC_SCL
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值