一、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 highdelay_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(0);SDA_OUT();IIC_SDA(0);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(1);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL(0);//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA((txd&0x80)>>7);txd<<=1;      delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL(1);delay_us(2); IIC_SCL(0);    delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL(0); delay_us(2);IIC_SCL(1);receive<<=1;if(READ_SDA)receive++;   delay_us(1); }                   if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}u8 BQ24295_ADDR=0X6B;  u8 BQ24295_Write_Reg(u8 reg,u16 val)
{ IIC_Start(); //BQ24295芯片的IIC地址:0X6B=110 1011//只有[6:0]7位地址为地址位//方向位为最低位,读数据时最低位为0,写数据时最低位为1.//110 1011(address) + 0(direction)=1101 0110向芯片写数据IIC_Send_Byte((BQ24295_ADDR<<1)&0XFE);                           //发送器件地址+写命令  if(IIC_Wait_Ack())return 1;                                   //等待应答(成功?/失败?) IIC_Send_Byte(reg);                                           //写寄存器地址if(IIC_Wait_Ack())return 2;                                   //等待应答(成功?/失败?) IIC_Send_Byte(val&0XFF);                                      //发送数据if(IIC_Wait_Ack())return 3;                                   //等待应答(成功?/失败?) IIC_Stop();return 0;
}                                                                       //已按照芯片标准重写后的数据写入协议u8 BQ24295_Read_Reg(u8 reg)
{ u8 temp=0;IIC_Start(); //110 1011(address) + 1(direction)=1101 0111向芯片读数据  IIC_Send_Byte((BQ24295_ADDR<<1)|0x01);                           //发送器件地址+读命令     if(IIC_Wait_Ack())return 254;                                   //等待应答(成功?/失败?) IIC_Send_Byte(reg);                                           //写寄存器地址if(IIC_Wait_Ack())return 253;                                   //等待应答(成功?/失败?) IIC_Start(); IIC_Send_Byte((BQ24295_ADDR<<1)|1);                           //发送器件地址+写命令   if(IIC_Wait_Ack())return 252;                                   //等待应答(成功?/失败?)     temp=IIC_Read_Byte(0);IIC_Stop();return temp;
}

四、BQ24295应用代码
初始化参数设置


//1、IIC管脚初始化  battery_IIC_Init(void);
//2、CE管脚拉低使能充电Battery_Shutdown_key_init();
//3、关闭看门狗battery_Set_WatchdogTimer(0);
//4、设置快速充电电流(看电池数据手册) battery_Set_Fast_Charge_Current(1024);//1024mA
//5、设置快速充电电压(看电池数据手册) battery_Set_Fast_Charge_Voltage(4208);//4208mV  电池电压低于该值才会充电?
//6、设置预充电电流限制值   battery_Set_Pre_Charge_Current(1);//预充电的电流限制值:256mA
//7、设置充电输入电压限制值4.76V  110  REG00[6:3]  battery_Set_Input_Voltage(4760);//输入电压限制值:4760mV
//8、设置充电输入电流限制值2A  1011 REG00[2:0]   battery_Set_Input_Current(6);//输入电流限制值:2A
//9、设置SYS系统输出电压最小值,battery_Set_SYS_Voltage(5);//SYS系统输出电压最小值:3.5V   也就是器件的整个电路的供电  REG01[3:1] 系统SYS(管脚15、16)输出电压3.5V
//10、设置充电时间  battery_Set_Fast_Charge_Timer(0);//充电5小时
//11、设置OTG模式 battery_Set_OTG(0);//关闭OTG模式
//12、设置升压值。开启OTG模式下才有用  battery_Set_Boost_Voltage(0X80);

寄存器功能函数:


//获取BQ24295芯片型号
//看数据手册是REG0A[7:5]位
//读取到的值为110时,就是BQ24295芯片
//调用:battery_Get_Part_Number();//获取芯片型号
//返回值:1-成功 0-失败
u8 battery_Get_Part_Number()
{u8 regvalue;regvalue=battery_Read_Reg(0x0A);//读取寄存器A(REG0A)的值regvalue=((regvalue>>5)&0x07);//111   取[7:5]高3位的值if(0x06==regvalue) //110 型号正确{//printf("%s","BQ24295");return 1;}else{//printf("%s","false");return 0;}
}//设置看门狗时间来复位BQ24295芯片为默认模式
//看数据手册是REG05[5:4]位
//参数value:00(0) – Disable timer, 01(1) – 40 s, 10(2) –80 s, 11(3) – 160 s
//返回值:无
//调用:battery_Set_WatchdogTimer(0);//关闭看门狗
void battery_Set_WatchdogTimer(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x05);//读取寄存器5(REG05)的值regvalue&=0xCF;//1100 1111  清除[5:4]位regvalue|=(value&0x03)<<4;//11=0x03 设置[5:4]2位 battery_Write_Reg(0x05,regvalue);//写寄存器5(REG05)的值
}//设置预充电的电流限制值。
//看数据手册是REG03[7:4]高四位
//参数value:128 mA – 2048 mA (0000 –1111)   Default: 256 mA 0x01(0b0001)
//返回值:无
//调用:battery_Set_Pre_Charge_Current(1);//预充电的电流限制值:256mA
void battery_Set_Pre_Charge_Current(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x03);//读取寄存器3(REG03)的值regvalue&=0x0F;//0000 1111  清除[7:4]高四位  regvalue|=((value&0x0F)<<4);//1111 =0xF  设置[7:4]高4位battery_Write_Reg(0x03,regvalue);//写寄存器3(REG03)的值
}//设置快速充电的时间。
//看数据手册是REG05[2:1]
//参数value: 0 - 5 hrs, 1 - 8 hrs, 2 - 12 hrs, 3 - 20 hrs. Default: 2-12 Hrs
//返回值:无
//调用: battery_Set_Fast_Charge_Timer(0);//充电5小时
void battery_Set_Fast_Charge_Timer(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x05);//读取寄存器5(REG05)的值regvalue&=0xF9;//1111 1001  清除[2:1] regvalue|=((value&0x03)<<2);//11=0x3  设置[2:1]2位battery_Write_Reg(0x05,regvalue);//写寄存器5(REG05)的值
}//设置升压电压值
//看数据手册是REG06[7:4]高四位
//参数value: Range: 4.55 V – 5.51 V  64mV 128mV 256mV 512mV  Offset is 4.55V.  Default:5.126 V (1001) Set:5.12V 0X80(1000)
//返回值:无
//调用: battery_Set_Boost_Voltage(0X80);//升压电压:5.12V
void battery_Set_Boost_Voltage(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x06);//读取寄存器6(REG06)的值regvalue&=0x0F;//0000 1111  清除[7:4] regvalue|=((value&0x0F)<<4);//1111=0xF  设置[7:4]4位battery_Write_Reg(0x06,regvalue);//写寄存器6(REG06)的值
}//设置OTG模式
//看数据手册是REG01[5]第5位
//参数value: 0-disable 1-enable  default:1-enable  Set=0-disable
//返回值:无
//调用: battery_Set_OTG(0);
void battery_Set_OTG(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x01);//读取寄存器1(REG01)的值regvalue&=0xDF;//1101 1111  清除[5]第五位 regvalue|=((value&0x01)<<5);//1=0x01  设置[5]1位battery_Write_Reg(0x01,regvalue);//写寄存器1(REG01)的值
}//设置充电电压值  重点
//看数据手册是REG04[7:2]高6位
//参数vol:单位是mV  比如4200mV的充电电压
//返回值:无   Default: 4.208V, Range: 3.504V - 4.400V
//调用: battery_Set_Fast_Charge_Voltage(4208);
void battery_Set_Fast_Charge_Voltage(u16 vol)
{u8 temp_vol=0;u8 regvalue;//4208mV对应二进制数101100   (4208-3502)/16=101100temp_vol=((limit(vol,3504,4400)-3504)/16);//需要设置电压对应的寄存器值regvalue=battery_Read_Reg(0x04);//读取寄存器4(REG04)的值regvalue&=0x03;//0000 0011  清除[7:2]高6位 regvalue|=((temp_vol&0x3F)<<2);//1111 11  设置[7:2]6位battery_Write_Reg(0x04,regvalue);//写寄存器4(REG04)的值
}//设置快速充电时的电流限制值(也是充电电流值)。重点配置
//看数据手册是REG02[7:2]高6位
//参数value:512 – 3008 mA (000000 –100111)   Default: 1024mA 0x08(001000)
//返回值:无
//调用:battery_Set_Fast_Charge_Current(1024);//快速充电时的电流限制值:1024mA
void battery_Set_Fast_Charge_Current(u16 value)
{u8 temp_cur=0;u8 regvalue;//1024mV对应二进制数001000   (1024-512)/64=001000temp_cur=((limit(value,512,3008)-512)/64);//需要设置电流对应的寄存器值regvalue=battery_Read_Reg(0x02);//读取寄存器2(REG02)的值regvalue&=0x03;//0000 0011  清除[7:2]高6位regvalue|=((temp_cur&0x3F)<<2);//111111=0x3F  设置[7:2]高6位battery_Write_Reg(0x02,regvalue);//写寄存器2(REG02)的值
}设置充电输入电压限制值 4.76 (也充电电流最大值,大于这个值就会保护)110  REG00[6:3]
//看数据手册是 REG00[6:3]
//参数value:3.88 V – 5.08 V (0000 –1111)  Offset Default: 4.76V 0x0B(1011)
//返回值:无
//调用:battery_Set_Input_Voltage(4760);//输入电压限制值:4760mV
void battery_Set_Input_Voltage(u16 value)
{u8 temp_cur=0;u8 regvalue;//4760mV对应二进制数1011   (4760-3880)/80=temp_cur=((limit(value,3880,5008)-3880)/80);//需要设置电流对应的寄存器值regvalue=battery_Read_Reg(0x00);//读取寄存器0(REG00)的值regvalue&=0x03;//1000 0111  清除[6:3]四位regvalue|=((temp_cur&0x0F)<<4);//1111=0x0F  设置[6:3]四位battery_Write_Reg(0x00,regvalue);//写寄存器0(REG00)的值
}//设置充电输入电流限制值2A  1011 REG00[2:0]
//看数据手册是 REG00[2:0]
//参数value:0-100mA  1-150mA 2-500mA 3-900mA
//          4-1A     5-1.5A  6-2A    7-3A
//返回值:无
//调用:battery_Set_Input_Current(6);//输入电流限制值:2A
void battery_Set_Input_Current(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x00);//读取寄存器0(REG00)的值regvalue&=0xF8;//1111 1000  清除[2:0]3位regvalue|=((value&0x07)<<0);//111=0x07  设置[2:0]3位battery_Write_Reg(0x00,regvalue);//写寄存器0(REG00)的值
}//设置SYS系统输出电压最小值,也就是器件的整个电路的供电  REG01[3:1] 系统SYS(管脚15、16)输出电压3.5V
//看数据手册是 REG01[3:1]
//参数value:  Bit3~Bit1  0.4V 0.2V 0.1V  Offset:3.0V  Range:3.0V~3.7V Defalut: 3.5V  (101)=0X05
//返回值:无
//调用:battery_Set_SYS_Voltage(5);//SYS系统输出电压最小值:3.5V
void battery_Set_SYS_Voltage(u8 value)
{u8 regvalue;regvalue=battery_Read_Reg(0x01);//读取寄存器1(REG01)的值regvalue&=0xF1;//1111 0001  清除[3:1]3位regvalue|=((value&0x07)<<1);//111=0x07  设置[3:1]3位battery_Write_Reg(0x01,regvalue);//写寄存器1(REG01)的值
}//限制值在指定的范围
u16 limit(u16 val,u16 min,u16 max)
{if(val<min)return min;if(val>max)return max;return val;
}//读取寄存器8的值,状态值,只读寄存器 看数据手册P36页分析每个位的作用
void battery_Get_Reg8()
{u8 regvalue;regvalue=battery_Read_Reg(0x08);//读取寄存器8(REG08)的值printf("REG08=%x",regvalue);
}//读取寄存器9的值,状态值,只读寄存器 看数据手册P37页分析每个位的作用
void battery_Get_Reg9()
{u8 regvalue;regvalue=battery_Read_Reg(0x09);//读取寄存器9(REG09)的值printf("REG09=%x",regvalue);
}

学习链接:
https://www.ti2k.com/112599.html 硬件原理分析
https://www.ti2k.com/tag/bq24195/page/2 TI问题贴
https://daumemo.com/diy-signal-generator-battery-charging-circuit-with-bq24295-part-6/ GitHub上的硬件设计步骤原理分析
https://www.freesion.com/article/80311003089/
https://www.eefocus.com/analog-power/416673
http://www.eissass.com/power-art/80039465
https://github.com/electricimp/BQ24295/tree/master/examples
https://e2echina.ti.com/support/power-management/f/power-management-forum/112806/bq24295-ts
https://e2echina.ti.com/support/power-management/f/power-management-forum/65768/bq24295

五、总结
一步一步慢慢来就行了,慢就是快,急不得。
没认证过代码(狗头~~)。

BQ24295电源管理芯片驱动相关推荐

  1. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  ...

  2. android电池(五):电池 充电IC(PM2301)驱动分析篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8970363 android充电这块,有的电源管理芯片内部包含充电管理,如s5pv210 ...

  3. linux内核驱动子系统,linux内核中的MFD子系统

    分析用的内核版本为5.1.3 1.MFD全称 Multi-function Device,多功能设备 2. 为何会出现MFD子系统 由于出现了一类具有多种功能的外围设备或cpu内部集成的硬件模块 3. ...

  4. android电池(五):电池 充电IC(PM2301)驱动分析篇

    android电池(五):电池 充电IC(PM2301)驱动分析篇 关键词:android 电池  电量计  PL2301任务初始化宏 power_supply 中断线程化 平台信息: 内核:linu ...

  5. 电源管理之pmu驱动分析

    电源管理芯片可以为多设备供电,且这些设备电压电流有所不同.为这些设备提供的稳压器代码模型即为regulator. 说白了regulator就是稳压器,它提供电源供给.简单的可以gpio操作,高电平开电 ...

  6. 基于STM32-消防栓监测系统毕业设计---论文(附加最全面的从硬件电路设计->驱动程序设计->阿里云物联网搭建->安卓APP设计)

    设计展示视频连接:消防栓监测系统视频 驱动程序工程文件:消防栓监测系统驱动程序工程(全寄存器开发的) 消防栓监测系统所有设计资料:全栈设计,如下图所示 消防栓监测系统论文(图片看不清的可以下载文档看) ...

  7. 【搬运】电源管理芯片引脚定义

    1.VCC 电源管理芯片供电 2.VDD 门驱动器供电电压输入或初级控制信号供电源 3.VID-4 CPU与CPU供电管理芯片VID信号连接引脚,主要指示芯片的输出信号,使两个场管输出正确的工作电压. ...

  8. 电源管理芯片:LED驱动电源芯片的计划及面积

    LED主要分为:LED显示屏.景观LED照明.室内LED照明:不同使用场景的LED驱动芯片有不同的需求.依据电源管理芯片的统计,2018年LED驱动IC商场规模为38亿美元,其间亚洲商场份额最高,占比 ...

  9. 电源管理芯片:nxp电源管理芯片的参考与设计

    电源管理芯片:nxp电源管理芯片的参考和设计充电和监控功能.我们的产品旨在满足工业.通信.汽车.消费.医疗市场等不同领域的电源设计应用需求.提供工业-领先的电池管理IC解决方案,以应对当今的设计挑战- ...

最新文章

  1. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
  2. 收集下关系数据库处理亿万级别的数据
  3. “约见”面试官系列之常见面试题第三十七篇之CSS3新属性(建议收藏)
  4. ubuntu13.10 编译时 关于链接xlib 库阶段出错的问题解决
  5. Java0steam_Java学习 - Stream 使用
  6. HDC2020开发者大会鸿蒙,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
  7. nusoap传递数组对象
  8. 微服务 java9模块化_Java9系列第8篇-Module模块化编程
  9. 组态王曲线控件读取access_组态王,历史趋势曲线控件例程说明文档
  10. 容灾服务器作用,存储容灾服务
  11. linux pkill窗口,在Linux系统中pkill命令的基础,附pkill命令的使用示例
  12. (转)对冲基金不信中国经济数据,转用卫星监控6000块工业用地
  13. 鸿蒙系统屏幕录制,鸿蒙系统游戏性能出色;三星折叠屏发布屏下摄像头
  14. 01 社会网络分析基础理论!
  15. [BZOJ3144]切糕
  16. Android开发项目管理7宗罪之五——项目组个性文档文件的管理
  17. 阿里云访问控制简要说明
  18. linux系统发生假死状态处理办法
  19. 迅捷pdf转换器——如何提取pdf中的图片
  20. 推荐几款好用的思维导图软件

热门文章

  1. 虹科激光雷达在车队管理中的应用 ——关于出租车自动泊车
  2. JAVA计算机毕业设计大学生健康管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  3. HTML网页制作:制作锚点链接
  4. 中型钢材全自动液压打捆机设计(论文+CAD图纸+答辩+翻译……)
  5. 学校网站UI设计分析
  6. python异步requests_Python异步Request操作: aiohttp
  7. 战斗回路的一键必杀宏,脚本设置
  8. C# excel工具栏菜单栏等操作
  9. 看图猜口袋妖怪属性,这个神经网络可能比你强!(教程)
  10. LED 实验玉和国际15758980009D13蓝色 LED 闪烁