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 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电源管理芯片驱动相关推荐
- 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
关键词:android 电池 电量计 MAX17040 任务初始化宏 power_supply 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0 ...
- android电池(五):电池 充电IC(PM2301)驱动分析篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/8970363 android充电这块,有的电源管理芯片内部包含充电管理,如s5pv210 ...
- linux内核驱动子系统,linux内核中的MFD子系统
分析用的内核版本为5.1.3 1.MFD全称 Multi-function Device,多功能设备 2. 为何会出现MFD子系统 由于出现了一类具有多种功能的外围设备或cpu内部集成的硬件模块 3. ...
- android电池(五):电池 充电IC(PM2301)驱动分析篇
android电池(五):电池 充电IC(PM2301)驱动分析篇 关键词:android 电池 电量计 PL2301任务初始化宏 power_supply 中断线程化 平台信息: 内核:linu ...
- 电源管理之pmu驱动分析
电源管理芯片可以为多设备供电,且这些设备电压电流有所不同.为这些设备提供的稳压器代码模型即为regulator. 说白了regulator就是稳压器,它提供电源供给.简单的可以gpio操作,高电平开电 ...
- 基于STM32-消防栓监测系统毕业设计---论文(附加最全面的从硬件电路设计->驱动程序设计->阿里云物联网搭建->安卓APP设计)
设计展示视频连接:消防栓监测系统视频 驱动程序工程文件:消防栓监测系统驱动程序工程(全寄存器开发的) 消防栓监测系统所有设计资料:全栈设计,如下图所示 消防栓监测系统论文(图片看不清的可以下载文档看) ...
- 【搬运】电源管理芯片引脚定义
1.VCC 电源管理芯片供电 2.VDD 门驱动器供电电压输入或初级控制信号供电源 3.VID-4 CPU与CPU供电管理芯片VID信号连接引脚,主要指示芯片的输出信号,使两个场管输出正确的工作电压. ...
- 电源管理芯片:LED驱动电源芯片的计划及面积
LED主要分为:LED显示屏.景观LED照明.室内LED照明:不同使用场景的LED驱动芯片有不同的需求.依据电源管理芯片的统计,2018年LED驱动IC商场规模为38亿美元,其间亚洲商场份额最高,占比 ...
- 电源管理芯片:nxp电源管理芯片的参考与设计
电源管理芯片:nxp电源管理芯片的参考和设计充电和监控功能.我们的产品旨在满足工业.通信.汽车.消费.医疗市场等不同领域的电源设计应用需求.提供工业-领先的电池管理IC解决方案,以应对当今的设计挑战- ...
最新文章
- go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
- 收集下关系数据库处理亿万级别的数据
- “约见”面试官系列之常见面试题第三十七篇之CSS3新属性(建议收藏)
- ubuntu13.10 编译时 关于链接xlib 库阶段出错的问题解决
- Java0steam_Java学习 - Stream 使用
- HDC2020开发者大会鸿蒙,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
- nusoap传递数组对象
- 微服务 java9模块化_Java9系列第8篇-Module模块化编程
- 组态王曲线控件读取access_组态王,历史趋势曲线控件例程说明文档
- 容灾服务器作用,存储容灾服务
- linux pkill窗口,在Linux系统中pkill命令的基础,附pkill命令的使用示例
- (转)对冲基金不信中国经济数据,转用卫星监控6000块工业用地
- 鸿蒙系统屏幕录制,鸿蒙系统游戏性能出色;三星折叠屏发布屏下摄像头
- 01 社会网络分析基础理论!
- [BZOJ3144]切糕
- Android开发项目管理7宗罪之五——项目组个性文档文件的管理
- 阿里云访问控制简要说明
- linux系统发生假死状态处理办法
- 迅捷pdf转换器——如何提取pdf中的图片
- 推荐几款好用的思维导图软件
热门文章
- 虹科激光雷达在车队管理中的应用 ——关于出租车自动泊车
- JAVA计算机毕业设计大学生健康管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
- HTML网页制作:制作锚点链接
- 中型钢材全自动液压打捆机设计(论文+CAD图纸+答辩+翻译……)
- 学校网站UI设计分析
- python异步requests_Python异步Request操作: aiohttp
- 战斗回路的一键必杀宏,脚本设置
- C# excel工具栏菜单栏等操作
- 看图猜口袋妖怪属性,这个神经网络可能比你强!(教程)
- LED 实验玉和国际15758980009D13蓝色 LED 闪烁