主题中讨论的其他器件:BQSTUDIO
尊敬的先生/女士:
我在使用 BQ7695203时遇到问题,MCU 通过 SPI 总线进行通信,并按照设置正确初始化和工作。
BQ 在警报锁存模式下配置--SCDL,OCDL =1 ,但每当像 OCD2/OCD3 /SCD 这样的故障发生时, bq 发送命令关闭放电 MOSFET,但在250mS 后,它再次打开。
请检查以下初始代码并建议进一步修改、以使我无法在使用 MCU 时控制 FET
void BQ769x2_Init (void )
{
int32_t i32_temp;
int16_t i16_temp;
uint32_t u32_temp=0;
Beaner_on();
//配置器件 RAM 中的所有参数
//进入 configupdate 模式(子命令0x0090)-需要处于 CONFIG_UPDATE 模式才能对器件 RAM 设置进行编程
//请参见 TRM 了解 CONFIG_UPDATE 模式的完整说明
CommandSubcommands (SET_CFGUPDATE);
//进入 CONFIG_UPDATE 模式后、可以对 RAM 寄存器进行编程。 对 RAM 进行编程时、校验和及长度也必须
//编程以使更改生效。 BQ769x2 TRM 中详细介绍了所有 RAM 寄存器。
//一种更简单的查找说明的方法是在 BQStudio Data Memory 屏幕中。 当您将鼠标移到寄存器名称上时、
//屏幕上会弹出寄存器和位的完整说明。
//'Power Config'- 0x9234 = 0x2D80
//设置 DSLP_LDO 位会允许 LDO 在器件进入深度睡眠模式时保持活动状态
//将唤醒速度位设置为00以获得最佳性能
U_powercfg.value=0x2D90;
u_powercfg.value_b.loop_SLOW=0;
u_powercfg.value_b.CB_LOOPSLOW=1;
u_powercfg.value_b.FastADC=0;
BQ769x2_SetRegister (PowerConfig、u_powercfg.value、2);
//"默认报警屏蔽"- 0x..82启用 FullScan 和 Adscan 位、默认值= 0xF800
BQ769x2_SetRegister (DefaultAlarmMask、0xF882、2);
//"RE 0 Config"-设置 REG0_EN 位以启用前置稳压器
BQ769x2_SetRegister (REG0Config、0x01、1);
//'RE 12配置'-启用具有5.0V 输出的 REG1 (3.3V 为0x0D、5V 为0x0F)
BQ769x2_SetRegister (REG12Config、0x0F、1);
//设置 DFETOFF 引脚以控制 CHG 和 DSG FET - 0x92FB = 0x42 (设置为0x00以禁用)
//BQ769x2_SetRegister (DFETOFFPinConfig、0x42、1);
//设置 ALERT 引脚- 0x92FC = 0x2A
//这会将 ALERT 引脚配置为在启用时驱动为高电平(REG1电压)。
// ALERT 引脚可在触发保护或有新测量可用时用作 MCU 的中断
BQ769x2_SetRegister (ALERTPinConfig、0x2A、1);
//设置 TS1以测量电芯温度- 0x92FD = 0x07
BQ769x2_SetRegister (TS1Config、0x00、1);
//设置 TS3以测量 FET 温度- 0x92FF = 0x0F
//BQ769x2_SetRegister (TS3Config、0x00、1);
//设置 HDQ 以测量电芯温度- 0x9300 = 0x07
// BQ769x2_SetRegister (HDQPinConfig、0x00、1);// EVM HDQ 引脚上未安装热敏电阻、因此设置为0x00
//启用内部温度作为 FET 温度/Cell Protection- 0x9303 = 0x1E 的内部温度
//用户 mV = 10mV 并且用户 A = 10mA
BQ769x2_SetRegister (DAConfiguration、0x06、1);
//'VCell Mode'-启用16个单元- 0x9304 = 0x0000;写入0x0000将设置默认的16个单元
BQ769x2_SetRegister (VCellMode、0x7FFF、2);
//'CC3样片- 0x9307 = 200;
BQ769x2_SetRegister (CC3Samples、32、1);//从200个样本减少至32个样本
BQ769x2_SetRegister (ProtectionConfiguration、0x0002、2);
//启用"Enabled Protections A"中的保护0x9261 = 0xBC
//启用 SCD (短路)、OCD1 (放电过流)、OCD2、OCC (充电过流)、
// COV (过压)、CUV (欠压)
U_ENPROTA_REG.VALUE=0x00;
//if (EnableSCD)
U_ENPROTA_reg.value_b.SCD=1;
U_ENPROTA_reg.value_b.OCD2=1;
U_ENPROTA_reg.value_b.OCC=1;
U_ENPROTA_reg.value_b.COV=1;
U_ENPROTA_reg.value_b.CUV=1;
BQ769x2_SetRegister (EnableProtectionsA、U_ENPROTA_reg.value、1);
//启用'Enabled Protections B'中的所有保护0x9262 = 0xF7
//启用 OTF (过热 FET)、OTINT (内部过热)、OTD (放电过热)、
// OTC (充电过热)、UTINT (内部欠温)、UTD (放电欠温)、UTC (充电欠温)
//BQ769x2_SetRegister (EnableProtectionsB、0xFF、1);
U_ENPROTB_reg.value=0;
U_ENPROTB_reg.value_b.OTF=1;
BQ769x2_SetRegister (EnableProtectionsB、U_ENPROTB_reg.value、1);
//禁用"Enabled Protections C" 0x9263 = 0x00中的所有保护
U_ENPROTC_reg.value=0;
U_ENPROTC_reg.value_b.OCD3=1;
U_ENPROTC_reg.value_b.OCDL = 1;
U_ENPROTC_reg.value_b.COVL=1;
IF (EnableSCDL)
U_ENPROTC_reg.value_b.SCDL=1;
BQ769x2_SetRegister (EnableProtectionsC、U_ENPROTC_reg.value、1);
//Enable/Disable "充电 FET"中的所有保护0x9265 = 0x98
U_CHRGFET_PROTA_reg.value=0;
// u_CHRGFET_PROTA_reg.value_b.SCD=1;
// u_CHRGFET_PROTA_reg.value_b.OCC=1;
//BQ769x2_SetRegister (CHGFETProtectionsA、U_CHRGFET_PROTA_REG.value、1);
BQ769x2_SetRegister (CHGFETProtectionsA、0x98、1);
//Enable/Disable "充电 FET"中的所有保护0x9266 = 0xD5 //禁用所有保护
U_CHRGFET_PROTB_reg.value=0;
// u_CHRGFET_PROTB_reg.value_b.OTINT=1;
BQ769x2_SetRegister (CHGFETProtectionsB、U_CHRGFET_PROTB_reg.value、1);
//Enable/Disable "充电 FET"中的所有保护0x9267 = 0x56 //禁用所有保护
U_CHRGFET_PROTC_reg.value=0;
U_CHRGFET_PROTC_reg.value_b.SCDL=1;
BQ769x2_SetRegister (CHGFETProtectionsC、U_CHRGFET_PROTC_reg.value、1);
//Enable/Disable "充电 FET" 0x9269/0x926A/0x926B=默认设置中的所有保护
//默认启用:UV、Cur,保护层1/2/3启用
//默认值 SCD 启用,OCD1/OCD2/SCD UV
U_DSGFETPROTA_reg.value=0;
U_DSGFETPROTA_reg.value_b.SCD=1;
U_DSGFETPROTA_reg.value_b.OCD2=1;
U_DSGFETPROTA_reg.value_b.CUV=1;
BQ769x2_SetRegister (DSGFETProtectionsA、0xE4、1);
// BQ769x2_SetRegister (DSGFETProtectionsB、0x0、1);//默认0xE6
U_DSGFETPROTB_reg.value=0;
BQ769x2_SetRegister (DSGFETProtectionsB、U_DSGFETPROTB_reg.value、1);//Default 0xE6
DSGFETPROTC_reg.value=0;
DSGFETPROTC_reg.value_b.OCD3=1;
DSGFETPROTC_reg.value_b.SCDL=1;//禁用、预充电可用
DSGFETPROTC_reg.value_b.OCDL = 1;
BQ769x2_SetRegister (DSGFETProtectionsC、DSGFETPROTC_reg.value、1);//Default 0xE2
BQ769x2_SetRegister (OCDLLatchLimit、1、1);//
BQ769x2_SetRegister (OCDLCounterDecDelay、120、1);//
BQ769x2_SetRegister (OCDLRecoveryTime、1、1);//
BQ769x2_SetRegister (OCDLRecoveryThreshold、5000、2);//
BQ769x2_SetRegister (FETOptions、0x25、1);
//禁用电荷泵和电荷泵电平5.5V,0X9309
BQ769x2_SetRegister (ChgPumpControl、0x02、1);
//设置电池放电状态的放电电流--0x9310=0x0A-1.0A
BQ769x2_SetRegister (DsgCurrentThreshold、CHRGE_Disc_CUR_CBTHD、1);
//设置电池充电状态的充电电流--0x9312=0x0A-1.0A
BQ769x2_SetRegister (ChgCurrentThreshold、CHRGE_Disc_CUR_CBTHD、1);
//设置断线检查时间--0x9314=0x1E-30秒
BQ769x2_SetRegister (CheckTime、0x1E、1);
//设置电芯平衡配置- 0x9335 = 0x03 -在 RELAX 或 CHARGE 模式下自动平衡
//另请参见 TI.com 上的"使用 BQ769x2电池监控器实现电池平衡"文档
U_CB_Config_reg.value_b.CB_CHG=1;
U_CB_Config_reg.value_b.CB_RLX=1;
BQ769x2_SetRegister (平衡配置、u_CB_Config_reg.value、1);
//设置电池平衡间隔//0X9339=30秒
BQ769x2_SetRegister (CellBalanceInterval、1、1);
//设置电池平衡最大电芯数//0X933A=1
BQ769x2_SetRegister (CellBalanceMaxCells、SetMaxCellBalancing、1);
//设置充电期间电池平衡最小电芯电压//0X933B=3600mV
BQ769x2_SetRegister (CellBalanceMinCellVCharge、2800、2);
//设置充电期间电池平衡最小增量电芯电压//0X93D=40mV
BQ769x2_SetRegister (CellBalanceMinDeltaCharge、40、1);
//设置充电期间电池平衡最小差值停止电压//0X933e=20mV
BQ769x2_SetRegister (CellBalanceStopDeltaCharge、20、1);
//设置张弛电池电压
// BQ769x2_SetRegister (CellBalanceMinCellVRelax、3500、1);
//关断
//设置电池组电压//0X9241=2000.0V
BQ769x2_SetRegister (ShutdownStackVoltage、2000、2);
//设置电池组电压低于//9243=60秒时的关断延迟
BQ769x2_SetRegister (LowVShutdownDelay、60、1);
//设置停机温度//0X9244=70度
BQ769x2_SetRegister (ShutdownTemperature、90、1);
//设置停机温度延迟//0X9245=5秒
BQ769x2_SetRegister (ShutdownTemperatureDelay、5、1);
//设置 FET 关断延迟//0X9252=0意味着与 RST 引脚的链接
//BQ769x2_SetRegister (FETOffDelay、0、1);
//设置关闭命令延迟//0X9253= 8*0.25秒表示连接 RST 引脚
// BQ769x2_SetRegister (ShutdownCommandDelay、8、1);//2秒
//自动关断时间50 mA
// BQ769x2_SetRegister (自动关断时间、15、1);
//睡眠电流//9248= 50 mA
//BQ769x2_SetRegister (SleepCurrent、50、2);
//休眠电压时间//924A = 60秒
// BQ769x2_SetRegister (VoltageTime、60、1);
//睡眠唤醒比较器电流//924B= 500mA
// BQ769x2_SetRegister (WakeComparatorCurrent、500、2);
//睡眠 HYS 时间//924D=60秒
// BQ769x2_SetRegister (SleepHysisTime、60、1);
//休眠充电器电压阈值//924E=2000 //2000 * 10mV
//BQ769x2_SetRegister (SleepChargerVoltageThreshold、2000、2);
//体二极管电流阈值=0x9,273,2500/并联电阻
tempRegValue=(2000*SHUNT_DIV);
i32_temp=(int32_t) tempRegValue;
BQ769x2_SetRegister (BodyDiodeThreshold、i32_temp、2);
//设置 CUV (欠压)阈值- 0x9275 = SetCellUnderVoltage[3](2000)
// CUV 阈值是该值乘以50.6mV
AFE_CellUV=SetCellUnderVoltage[3]-100;
tempRegValue=(float)(AFE_CellUV*10)/506;
u8_regVal=(uint8_t) tempRegValue;
BQ769x2_SetRegister (CUVThreshold、u8_regVal、1);
// CUV 延迟//9276=74 /250.8ms
BQ769x2_SetRegister (CUVDelay、74、2);
/CUV 恢复 HYS //927B=4 //1*50.6mV
BQ769x2_SetRegister (CUVRecoveryHysteresis、1、1);
//设置 COV (过压)阈值- 0x9278 = AFE_CellOV (3900mV)
// COV 阈值是该值乘以50.6mV
AFE_CellOV=SetCellOverVoltage[3]+100;//100mV、如果 MCU 发生故障
tempRegValue=AFE_CellOV;
tempRegValue=(tempRegValue*10)/506;
u8_regVal=(uint8_t) tempRegValue;
BQ769x2_SetRegister (COVThreshold、u8_regVal、1);
//延迟0x9278=74 (250.8ms)
BQ769x2_SetRegister (COVDelay、74、2);
//设置 COV 恢复 HYS//0X927C=5//2*50.6
BQ769x2_SetRegister (COVRecoveryHysteresis、2、1);
//SetMaxChargeCurrent = 15;
// tempRegValue=(float)(SetChargeOverCurrent [1]);
// tempRegValue=(tempRegValue/2.0)* SHUNT_DIV;
// u8_regVal=(uint8_t) tempRegValue;
//设置 OCC (充电过流)阈值- 0x9280 = 0x26 (1.25m Ω 感应电阻器上为125mV = 100A)单位,单位为2mV
TempRegValue=SetAFEMAxChargeCurrent;
tempRegValue=(tempRegValue/2.0f)* SHUNT_DIV;
u8_regVal=(uint8_t) tempRegValue;
if (u8_regVal>62)
U8_regVal=62;
BQ769x2_SetRegister (OCCThreshold、u8_regVal、1);//用于测试~100 Amp
//设置 OCC (充电过流)延迟- 0x9281=0x1E (29*3.3+6.6mS)///102ms
BQ769x2_SetRegister (OCCDelay、4、1);
i32_temp=-2000;
BQ769x2_SetRegister (OCCRecoveryThreshold、i32_temp、2);
//设置 PACK-Tos Delta 电压- 0x92B0 = 200 //200*10mV
//BQ769x2_SetRegister (OCCPACKTOSDelta、200、2);
//设置 OCD1阈值- 0x9282 = 16 (1.25m Ω 感应电阻器上的32mV = 40A) 2mV 单位
BQ769x2_SetRegister (OCD1Threshold、65、1);
//设置 OCD1延迟- 0x9283 = 127 //127*3.3+6.6 Ms
BQ769x2_SetRegister (OCD1Delay、1、1);//50mS
//========================================
//设置 OCD2阈值- 0x9284 = 24 (1.25m Ω 感应电阻器上、48mV = 60A)单位为2mV
BQ769x2_SetRegister (OCD2Threshold、65、1);
//设置 OCD2延迟- 0x9285 = 28 // 28 * 3.3+6.6 Ms=99mS
BQ769x2_SetRegister (OCD2Delay、1、1);
//设置 OCD3阈值- 0x928A =-1000 (-1000=100.0A)
tempRegValue=(SetAFEMAxDisChargeCurrent2*SHUNT_DIV);
i32_temp=(int32_t) tempRegValue;
i32_temp=(i32_temp)*(-100);
i16_temp=(int16_t) i32_temp;
BQ769x2_SetRegister (OCD3Threshold、-12000、2);
//设置 OCD2延迟- 0x928C = 2//2秒
BQ769x2_SetRegister (OCD3Delay、5、1);
//设置 OCD 恢复阈值- 0x928D = 200 //
BQ769x2_SetRegister (OCDRecoveryThreshold、5000、2);
//设置 SCD 阈值- 0x9286 = 6 (125A = 1.25m Ω@100A) 6=125mV
if (SetShortCircuitCurrent>= 10)
SetShortCircuitCurrent=10;
BQ769x2_SetRegister (SCDThreshold、10、1);
//设置 SCD 延迟- 0x9287 = 7 (105us)已启用、延迟为(值- 1)* 15 µs;最小值为1
BQ769x2_SetRegister (SCDDelay、1、1);
//将 SCDL 锁存限制设置为1,以将 SCD 恢复设置为仅带负载移除0x9295 = 0x01
//如果未设置此值,则 SCD 将根据时间进行恢复(SCD 恢复时间参数)。
BQ769x2_SetRegister (SCDLLatchLimit、0x01、1);
//SCD 恢复时间- 0x9294 = 120秒
BQ769x2_SetRegister (SCDRecoveryTime、120、1);
//OTC
//// OTC 阈值- 0x929A = 70度
BQ769x2_SetRegister (OTCThreshold、70、1);
// OTC 延迟- 0x929B = 5秒
BQ769x2_SetRegister (OTCDelay、5、1);
//
// OTC 恢复- 0x929C = 45度
BQ769x2_SetRegister (OTCRecovery、45、1);
//
//OTD
// OTD 阈值- 0x929D = 90度
BQ769x2_SetRegister (OTDThreshold、90、1);
// OTD 延迟- 0x929E = 5秒
BQ769x2_SetRegister (OTDDDelay、5、1);
// OTC 恢复- 0x929F = 55度
BQ769x2_SetRegister (OTDRecovery、50、1);
//负载检测
// LD 时间0x92B4 = 0秒//禁用
BQ769x2_SetRegister (LoadDetectActiveTime、0、1);
// LD 恢复时间= 50秒
BQ769x2_SetRegister (LoadDetectRetryDelay、50、1);
// LD 恢复时间= 1小时
BQ769x2_SetRegister (LoadDetectTimeout、1、1);
//永久失效
//永久失效/深度放电- 0x92C8 = 1500mV
//BQ769x2_SetRegister (CUDEPThreshold、1500、2);
//永久失效/深度放电- 0x92CA = 5秒
BQ769x2_SetRegister (CUDEPDelay、30、1);
// SUV - 0x92CB = 22000mV
BQ769x2_SetRegister (SUVThreshold、2200、2);
// SUV 延迟- 0x92CD = 5秒
BQ769x2_SetRegister (SUVDelay、5、1);
// SOV - 0x92CE = 4000mV
//BQ769x2_SetRegister (SOVThreshold、4000、2);
// SOV 延迟- 0x92D0 = 5秒
//BQ769x2_SetRegister (SOVDelay、5、1);
// TOS - 0x92D1 = 500mV
BQ769x2_SetRegister (TOSSThreshold、1000、2);
// TOS 延迟- 0x92D3 = 10秒
BQ769x2_SetRegister (TOSSDelay、10、1);
// SOCC 0x92D4 = 12500mA * 10mA
BQ769x2_SetRegister (SOCCThreshold、15000、2);
// SOCC 延迟- 0x92D6 = 5秒
BQ769x2_SetRegister (SOCCDelay、5、1);
// SOCD 0x92D7 =-11000mA * 10mA
BQ769x2_SetRegister (SOCDThreshold、(uint32_t)(-11000)、2);
// SOCD 延迟- 0x92D9 = 5秒
BQ769x2_SetRegister (SOCDDelay、5、1);
//保护恢复时间
BQ769x2_SetRegister (ProtectsRecoveryTime、SetProtRecoveryTime、1);
//禁用永久失效功能
BQ769x2_SetRegister (MfgStatusInit、0x0010、2);
//永久失效 VSSF 0X92F4 = 100
BQ769x2_SetRegister (VSSFFailThreshold、100、2);
//永久失效 VSSF 延迟0X92F6 = 5SEC
BQ769x2_SetRegister (VSSFDelay、5、1);
//配置 DCHGPinConfig 0x9301- AS DCHG,高电平有效
BQ769x2_SetRegister (DCHGPinConfig、0xA2、1);
//配置 DDSGPinConfig 0x9302-作为 DDSG,高电平有效
BQ769x2_SetRegister (DDSGPinConfig、0xA2、1);
//退出 configupdate 模式-子命令0x0092
CommandSubcommands (exit_CFGUPDATE);
Beaner_off();
}