标题:
ti的电量计bq27750芯片.C .H与程序文件
[打印本页]
作者:
libinhb
时间:
2020-6-25 00:45
标题:
ti的电量计bq27750芯片.C .H与程序文件
bq27750 电量计芯片,适用于手持仪器的电量管理,本次上传的为本人初步使用,供学习参考,包括有TI的说明书;以压缩文件:BQ2750.RAR
单片机源程序如下:
/* Includes ------------------------------------------------------------------*/
//#include "bq27200.h"
#include "bq27750/bq27750.h"
#include "globalmvf.h"
// control register params
#define BQ27200_SOFT_FRSET 0x42 //全复位
#define BQ27200_SOFT_PRSET 0x48 //部分复位
#define BQ27750_RS 20 // Resistor sense mOhm
// Register
#define BQ27750_REG_CTRL_L 0X00 //控制寄存器
#define BQ27750_REG_CTRL_H 0X01
#define BQ27750_REG_TEMP_L 0x06 //温度寄存器
#define BQ27750_REG_TEMP_H 0x07
#define BQ27750_REG_VOLT_L 0x08 //电压寄存器
#define BQ27750_REG_VOLT_H 0x09
#define BQ27750_REG_FLAGS_L 0x0A //电池状态寄存器
#define BQ27750_REG_FLAGS_H 0x0B
#define BATTERY_FLAGS_CHARGING 0X00 //正充电
#define BATTERY_FLAGS_DISCHARGING 0X40 //正放电
#define BQ27750_REG_INSTCURR_L 0x0C //SENSOR电阻上瞬时电流 1秒刷新一次
#define BQ27750_REG_INSTCURR_H 0x0D
#define BQ27750_REG_AI_L 0x14 //平均电流寄存器
#define BQ27750_REG_AI_H 0x15
#define BQ27750_REG_RM_L 0x10 //预测的剩余容量
#define BQ27750_REG_RM_H 0x11
#define BQ27750_REG_FCC_L 0x12 //预设的满充容量
#define BQ27750_REG_FCC_H 0x13
#define BQ27750_REG_INT_TEMP_L 0x28 //内部温度 0.1K为单位
#define BQ27750_REG_INT_TEMP_H 0x29
#define BQ27750_REG_CCOUNT_L 0x2A //放电次数
#define BQ27750_REG_CCOUNT_H 0x2B
#define BQ27750_REG_SOC_L 0x2C //充电百分比
#define BQ27750_REG_SOC_H 0x2D
#define BQ27750_REG_SOH_L 0x2E //设计容量的百分比作为电池健康状况
#define BQ27750_REG_SOH_H 0x2F
#define BQ27750_REG_CV_L 0x30 //将充电电压
#define BQ27750_REG_CV_H 0x31
#define BQ27750_REG_CC_L 0x32 //将充电电流
#define BQ27750_REG_CC_H 0x33
#define BQ27750_REG_DC_L 0x3C //设计容量
#define BQ27750_REG_DC_H 0x3D
#define BQ27750_REG_MAC_L 0x3E //制造商数据访问指令
#define BQ27750_REG_MAC_H 0x3F
#define BQ27750_REG_MAC_DATA_L 0x40 //制造商数据
#define BQ27750_REG_MAC_DATA_H 0x5F
#define BQ27750_REG_MAC_DATA_SUM_L 0x60 //制造商数据校验和
#define BQ27750_REG_MAC_DATA_LEN_H 0x61 //制造商数据长度
//====设置设计参数 FLASH数据--------------------------------------------------------------------------------
#define DA_CONFIG_VALUE 0X10 //1串电池 睡眠使 默认值 0X11 2串电池 睡眠使
#define DESIGN_CAPACITY_MAH_VALUE 2000 //MAH 设计容量MAH 默认值 5300MAH
#define DESIGN_CAPACITY_CWH_VALUE 770 //CWH 设计容量CWH 默认值 2040CWH
#define DESIGN_VOLTAGE_VALUE 4100 //MV 设计电压MV 默认值 3850MV
//#define DEVICE_CHEMISTRY //按默认的锂电 LION 默认值 锂电 LION
#define COV_VALUE 4300 //过高电压值 默认值 4300MA
#define CUV_VALUE 2500 //过低电压值 默认值 2500MA
#define SHUTDOWN_VALUE 2300 //关断电压值 默认值 2300MA
#define OCC_VALUE 2000 //最大流电电流值 默认值 5000MA
#define OCD_VALUE 1500 //最大放电流值 默认值 5000MA
#define ASCC_VALUE 0X77 //100MA 5秒 //瞬时短路充电电流值 默认值 0X77 //100MA 5秒
#define ASCD_VALUE 0X77 //100MA 5秒 //瞬时短路放电电流值 默认值 0X77 //100MA 5秒
#define SOV_VALUE 4500 // 电池永久损坏值 默认值 4500MA
#define TEMP_SENSOR_SELECT 0X01 //内外温度传感器选择 选择内部的 默认值 0x03 内外两个
#define UTC_VALUE 0 //充电温度值 0度 默认值 0
#define UTD_VALUE 0 //放电温度值 0度 默认值 0
//#define BCAST //没有找到
//====设置设计参数 FLASH地址--------------------------------------------------------------------------------
#define ADDR_DA_CONFIG_VALUE 0X45E2 // 默认值 0X45E2=0X18
#define ADDR_DESIGN_CAPACITY_MAH_VALUE 0X4563 // 默认值 0X4563 =5300MAH 现设计为2000MAH
#define ADDR_DESIGN_CAPACITY_CWH_VALUE 0X4565 // 默认值 0X4565 =2040CWH 现设计为770CWH
#define ADDR_DESIGN_VOLTAGE_VALUE 0X4567 // 默认值 0X4567 =3850MV 现设计为4100MV
#define ADDR_DEVICE_CHEMISTRY 0X4095 //默认值 锂电 LION
#define ADDR_COV_VALUE 0X4602 //默认值 4300MA 现设计为4300MV //过高电压值
#define ADDR_CUV_VALUE 0X45FB //默认值 2500MA 现设计为2500MV //过低电压值
#define ADDR_SHUTDOWN_VALUE 0X4547 //默认值 2300MA 现设计为2300MV //关断电压值
#define ADDR_OCC_VALUE 0X4611 //默认值 9000MA 现设计为2000 //最大流电电流值
#define ADDR_OCD_VALUE 0X4617 //默认值 6000MA 现设计为1500 //最大放电流值
#define ADDR_ASCC_VALUE 0X46E7 //默认值 0X77 //100MA 0.4MS 现设计为 0X77 //100MA 0.4MS //瞬时短路充电电流值
#define ADDR_ASCD_VALUE 0X45E8 //0X77 //100MA 0.4MS //瞬时短路放电电流值 默认值 0X77 //100MA 0.4MS
#define ADDR_SOV_VALUE 0X4648 //默认值 4500MA 现设计为 4500 // 电池永久损坏值
#define ADDR_TEMP_SENSOR_SELECT 0X45E1 // 0X01 //内外温度传感器选择 选择内部的 默认值 0x03 内外两个
#define ADDR_UTC_VALUE 0X462A // 默认值 0 现设计为 0 //充电温度值 0度
#define ADDR_UTD_VALUE 0X462F // 默认值 0 放电温度值 0度 现设计为 0
//#define BCAST //没有找到
//#define SlaveAddress_read 0xAB //1 27200
//#define SlaveAddress_write 0xAA //0
#define SlaveAddress_write 0xAa // BIT0=1 27750
#define SlaveAddress_read 0xAb // BIT0=0
static void SDA_OUT(void); //PC2
static void SDA_IN(void); //PC3
static void BQ_I2C_DELAY_x100ns(u8 x100ns_data);
static void BQ_I2C_DELAY(void);
static u8 BQ_I2C_START(void);
static void BQ_I2C_STOP(void);
static void BQ_I2C_Ack(void);
static void BQ_I2C_NoAck(void);
static u8 BQ_I2C_WaitAck(void); //返回=1有ACK,=0无ACK
static void BQ_I2C_SendByte(u8 SendByte); //数据从高位到低位
//static u8 BQ_I2C_ReceiveByte(void); //数据从高位到低位
static u8 BQ_I2C_ReceiveByte(unsigned char ack);
//################################### IO口模拟法##############################################
extern void BQ27750_IO_I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PC3----SCL
//PC2----SDA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速度50M
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //GPIO_Mode_Out_PP;////GPIO_Mode_Out_PP; //GPIO_Mode_AF_OD; // GPIO_Mode_Out_PP; //输出 GPIO_Mode_IPU GPIO_Mode_Out_OD)
GPIO_Init(GPIOC, &GPIO_InitStructure);
BQ_SDA_H; //总线初始
BQ_SCL_H;
}
static void write_BQ_Delay(uint16_t X10MS)
{
TIM3_X10MS(X10MS); //主程序运行前延时2秒
while(timer3_X10ms>0);
TIM_Cmd(TIM3, DISABLE);
}
//IO方向设置
static void SDA_IN(void) //PC2
{
//1.FUNCTION MODE:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Mode_Out_OD; //开漏 GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
//2.REGISTER MODE:
//RCC->APB2ENR |= 0x00000010; //C口时钟开启
// GPIOC->CRL&=0XFFFFF0FF; //取PC2 IN
// GPIOC->CRL|=0X00000800;
}
static void SDA_OUT(void) //PC2
{
//1.FUNCTION MODE:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速度50M
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //开漏 GPIO_Mode_Out_PP; //输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
//2.REGISTER MODE:
//RCC->APB2ENR |= 0x00000010; //C口时钟开启
// GPIOC->CRL&=0XFFFFF0FF; //取PC2 OUT
// GPIOC->CRL|=0X00000300; // 3/7
}
//extern void BQ27200_Write_Design_Capacity(u16 capacity_xmah)
//{
//u8 set_CapPercent=1;
//u8 val_l=0,val_h=0;
//u16 val_76=0,set_capacity=0;
//float val=0;
//
//set_CapPercent=1; //100%
////高字节值:(Design_Capacity*R)/(256*3.57) : Design_Capacity=2000mah R=20毫欧 (2000*20)/(256*3.57)=43;
////低字节值:0X00
//
//set_capacity=capacity_xmah;
//val=set_capacity*BQ27200_RS;
//val=(val/256)/3.57;
//val=val*256;
//val_76=((int)val+0)*set_CapPercent;
//
//val_l=val_76/256; //高字节
//val_h=val_76%256; //低字节
//
//
//BQ_I2C_WriteByte(val_l, SlaveAddress_write, BQ27200_REG_AR_L);
//write_BQ_Delay(1); //10MS
//
//BQ_I2C_WriteByte(val_h, SlaveAddress_write, BQ27200_REG_AR_H);
//write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0X20, SlaveAddress_write, BQ27200_REG_MODE); //WRTNAC=1
//write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0Xa9, SlaveAddress_write, BQ27200_REG_CTRL); //
//write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0X40, SlaveAddress_write, BQ27200_REG_MODE); //WRTNAC=1
//write_BQ_Delay(1); //10MS
//}
extern void BQ27750_Write_SETTING_DESIGN_PARAMETERS(void)
{
//BQ_I2C_WriteByte(0x0012, 0XAA, 0X3E);
//BQ_I2C_WriteByte(0X00, 0XAA, 0X00); BQ_I2C_WriteByte(0X22, 0XAA, 0X01);
BQ_I2C_WriteByte_toflash(DA_CONFIG_VALUE , SlaveAddress_write, ADDR_DA_CONFIG_VALUE);
BQ_I2C_WriteByte_toflash(DESIGN_CAPACITY_MAH_VALUE , SlaveAddress_write, ADDR_DESIGN_CAPACITY_MAH_VALUE);
BQ_I2C_WriteByte_toflash(DESIGN_VOLTAGE_VALUE, SlaveAddress_write, ADDR_DESIGN_VOLTAGE_VALUE);
BQ_I2C_WriteByte_toflash(COV_VALUE , SlaveAddress_write, ADDR_COV_VALUE);
BQ_I2C_WriteByte_toflash(CUV_VALUE , SlaveAddress_write, ADDR_CUV_VALUE);
BQ_I2C_WriteByte_toflash(SHUTDOWN_VALUE , SlaveAddress_write, ADDR_SHUTDOWN_VALUE);
BQ_I2C_WriteByte_toflash(OCC_VALUE , SlaveAddress_write, ADDR_OCC_VALUE);
BQ_I2C_WriteByte_toflash(OCD_VALUE , SlaveAddress_write, ADDR_OCD_VALUE );
BQ_I2C_WriteByte_toflash(ASCC_VALUE , SlaveAddress_write, ADDR_ASCC_VALUE );
BQ_I2C_WriteByte_toflash(ASCD_VALUE , SlaveAddress_write, ADDR_ASCD_VALUE );
BQ_I2C_WriteByte_toflash(SOV_VALUE , SlaveAddress_write, ADDR_SOV_VALUE);
BQ_I2C_WriteByte_toflash(TEMP_SENSOR_SELECT, SlaveAddress_write, ADDR_TEMP_SENSOR_SELECT);
BQ_I2C_WriteByte_toflash(UTC_VALUE , SlaveAddress_write, ADDR_UTC_VALUE);
BQ_I2C_WriteByte_toflash(UTD_VALUE, SlaveAddress_write, ADDR_UTD_VALUE);
//
}
extern void BQ27200_Write_Design_Capacity(u16 capacity_xmah)
{
u8 set_CapPercent=1;
u8 val_l=0,val_h=0;
u16 val_76=0,set_capacity=0;
float val=0;
set_CapPercent=1; //100%
//高字节值:(Design_Capacity*R)/(256*3.57) : Design_Capacity=2000mah R=20毫欧 (2000*20)/(256*3.57)=43;
//低字节值:0X00
set_capacity=capacity_xmah;
val=set_capacity*BQ27750_RS;
val=(val/256)/3.57;
val=val*256;
val_76=((int)val+0)*set_CapPercent;
val_l=val_76/256; //高字节
val_h=val_76%256; //低字节
BQ_I2C_WriteByte(0x2b, SlaveAddress_write, 0X76); //ILMD: (2000*20)/(256*3.57)=43=0x2b
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0x77, SlaveAddress_write, 0X77); //SEVF: (3000/8)-256=119=0X77
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0xA2, SlaveAddress_write, 0X78); //SEV1: (3350/8)-256=162=0XA2
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0x0E, SlaveAddress_write, 0X79); //ISLC: (50*20)/7.14=14=0X0E
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0x58, SlaveAddress_write, 0X7A); //DMFSD:
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0x88, SlaveAddress_write, 0X7B); //TAPER: (100*20)/228 =8 ,BIT7=1
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0x70, SlaveAddress_write, 0X7C); //PKCXFG: GPIO禁止外用 4.112V -9.8UV 固定补偿
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0X16, SlaveAddress_write, 0x7D); //IMLC: (500*20)/457=22=0x16
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0X42, SlaveAddress_write, 0x7e); //DCOMP:
write_BQ_Delay(1); //10MS
BQ_I2C_WriteByte(0X7C, SlaveAddress_write, 0x7F); //TCOMP:
write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0X20, SlaveAddress_write, BQ27200_REG_MODE); //WRTNAC=1
//write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0Xa9, SlaveAddress_write, BQ27200_REG_CTRL); //
//write_BQ_Delay(1); //10MS
//BQ_I2C_WriteByte(0X40, SlaveAddress_write, BQ27200_REG_MODE); //WRTNAC=1
//write_BQ_Delay(1); //10MS
}
extern void BQ27750_Write_Design_Capacity(u16 capacity_xmah)
{
u8 set_CapPercent=1;
u8 val_l=0,val_h=0;
u16 val_76=0,set_capacity=0;
float val=0;
set_CapPercent=1; //100%
//高字节值:(Design_Capacity*R)/(256*3.57) : Design_Capacity=2000mah R=20毫欧 (2000*20)/(256*3.57)=43;
//低字节值:0X00
set_capacity=capacity_xmah;
val=set_capacity*BQ27750_RS;
val=(val/256)/3.57;
val=val*256;
val_76=((int)val+0)*set_CapPercent;
val_l=val_76/256; //高字节
val_h=val_76%256; //低字节
}
static void BQ_I2C_DELAY_x100ns(u8 x100ns_data)
{
u16 i=1; // //实验调到0.2US左右
u8 h=0;
for(h=0;h<x100ns_data;h++)
{
for(;i>0;i--) ;
}
}
static void BQ_I2C_DELAY(void)
{
u16 i=800; //800--1 //实验调到5-6US左右
//u16 i=4;
while(i) i--;
}
static void BQ_I2C_DELAY1(void)
{
u16 i=400; //400--1 //实验调到5-6US左右
//u16 i=4;
while(i) i--;
}
static void BQ_I2C_DELAY2(void)
{
u16 i=200; //200--1 //实验调到5-6US左右
//u16 i=4;
while(i) i--;
}
static x_sft(u8 shift_cnt)
{
u8 kk=2;
for(;shift_cnt>0;shift_cnt--) {kk=kk<<1;}
}
static u8 BQ_I2C_START(void)
{
SDA_OUT(); //SDA输出
BQ_SDA_H; //释放SDA总线
BQ_I2C_DELAY();
BQ_SCL_H;
BQ_I2C_DELAY();
//if(!BQ_SDA_READ) return 0; //SDA线低电平则总线忙 退出
BQ_SDA_L; //开始信号
BQ_I2C_DELAY();
//if(BQ_SDA_READ) return 0; //SDA线高电平则总线出错 退出
BQ_SCL_L;
BQ_I2C_DELAY();
return 1;
}
static void BQ_I2C_STOP(void)
{
SDA_OUT(); //SDA输出
BQ_SDA_L;
BQ_I2C_DELAY();
BQ_SCL_H;
BQ_I2C_DELAY();
BQ_SDA_H; //停止信号
BQ_I2C_DELAY();
BQ_I2C_DELAY();
}
static void BQ_I2C_Ack(void)
{
SDA_OUT(); //SDA输出
BQ_SCL_L;
BQ_I2C_DELAY();
BQ_SDA_L;
BQ_I2C_DELAY();
BQ_SCL_H;
BQ_I2C_DELAY();
BQ_SCL_L;
BQ_I2C_DELAY();
}
static void BQ_I2C_NoAck(void)
{
u8 ft=2;
//BQ_SCL_L; //应答脉冲形成前置0
//x_sft(2);
//SDA_OUT(); //SDA输出
BQ_SCL_L;
BQ_I2C_DELAY();
BQ_SDA_H;
BQ_I2C_DELAY();
BQ_SCL_H;
BQ_I2C_DELAY();
BQ_SCL_L;
BQ_I2C_DELAY();
}
static u8 BQ_I2C_WaitAck(void) //返回=1有ACK,=0无ACK
{
u8 ft=2;
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
BQ_SDA_H;
BQ_I2C_DELAY();
BQ_SCL_H;
BQ_I2C_DELAY();
while(BQ_SDA_READ) //检测应答的数据
{
ucErrTime++;
if(ucErrTime>250)
{
//BQ_I2C_STOP();
BQ_SCL_L;
return 0;
}
}
BQ_SCL_L;
return 1;
}
static void BQ_I2C_SendByte(u8 SendByte) //数据从高位到低位
{
u8 i=8,ft=1;
SDA_OUT(); //SDA输出
while(i--)
{
BQ_SCL_L;
BQ_I2C_DELAY1();
if(SendByte&0x80) BQ_SDA_H;
else BQ_SDA_L;
SendByte<<=1;
BQ_I2C_DELAY2();
BQ_SCL_H;
BQ_I2C_DELAY2();
}
BQ_SCL_L;
}
/**************************************************************
* 功能描述:读1字节
** 输入参数:ack,1--发送ACK
0--发送nACK
** 输出参数: 无
** 返 回:返回读取的一字节数据
***************************************************************/
static u8 BQ_I2C_ReceiveByte(unsigned char ack) //数据从高位到低位
{
u8 i=8;
u8 ReceiveByte=0;
SDA_IN();//SDA设置为输入
BQ_SDA_H;
while(i--)
{
ReceiveByte<<=1;
BQ_SCL_L;
BQ_I2C_DELAY1();
BQ_SCL_H;
BQ_I2C_DELAY1();
if( BQ_SDA_READ) ReceiveByte|=0x01;
}
BQ_SCL_L;
return ReceiveByte;
}
// 写入1字节数据 待写入数据 待写入地址 器件类型(BQ27200)
extern u8 BQ_I2C_WriteByte(u8 SendByte, u8 WriteAddress, u16 RrgAddress)
{
u32 j,ft=2;
BQ_I2C_START();
//if(!BQ_I2C_START()) return 0;
//BQ_I2C_SendByte( WriteAddress&0xFE);//写器件地址
BQ_I2C_SendByte( WriteAddress);//写器件地址 AB
BQ_I2C_WaitAck();
// if(!BQ_I2C_WaitAck()) //等应答 为0时返回 即器件没有应答
// { BQ_I2C_STOP();
// return 0;
// }
BQ_I2C_SendByte((u8)((RrgAddress>>8)&0XFF)); //设置寄存器地址
BQ_I2C_WaitAck();
// if(!BQ_I2C_WaitAck()) //等应答 为0时返回 即器件没有应答
// { BQ_I2C_STOP();
// return 0;
// }
BQ_I2C_SendByte((u8)(RrgAddress&0XFF)); //设置寄存器地址
BQ_I2C_WaitAck();
// if(!BQ_I2C_WaitAck()) //等应答 为0时返回 即器件没有应答
// { BQ_I2C_STOP();
// return 0;
// }
BQ_I2C_SendByte(SendByte); //写数据
BQ_I2C_WaitAck();
// if(!BQ_I2C_WaitAck()) //等应答 为0时返回 即器件没有应答
// { BQ_I2C_STOP();
// return 0;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
bq27750.7z
(1.09 MB, 下载次数: 43)
2020-6-28 02:54 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1