一、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