Other Parts Discussed in Thread: BQSTUDIO, BQ76952
Hi Matt,
We are using BQ7695203 and its working but after some time when Cell Connector /Cell Input Connector Insertion/Removal, device is failed to communicate with MCU.
We have observe that VREG18 o/p is .6 V and in normal case its voltage is 1.8V . and status is remain same after multiple time ON/OFF ,( After replacing the BQ with new BQ communication started again.)
We are giving the external VREGIN supply ~5.39V DC using LDO .
R199,R202 -1K
R148-4.7K
U23 --Not Mounted
R161 -4.7K
Please check the attached schematic and provides your input for correction.
2: I am also using Low Side mosfet drive and using CHRG and DCHRG Command ,Is correct or require to change this ?schematic BQ.pdf
3: BQ Initialization Code at Power ON
void BQ769x2_Init(void )
{
float tempRegValue=0;
// Configures all parameters in device RAM
// Enter CONFIGUPDATE mode (Subcommand 0x0090) - It is required to be in CONFIG_UPDATE mode to program the device RAM settings
// See TRM for full description of CONFIG_UPDATE mode
CommandSubcommands(SET_CFGUPDATE);
// After entering CONFIG_UPDATE mode, RAM registers can be programmed. When programming RAM, checksum and length must also be
// programmed for the change to take effect. All of the RAM registers are described in detail in the BQ769x2 TRM.
// An easier way to find the descriptions is in the BQStudio Data Memory screen. When you move the mouse over the register name,
// a full description of the register and the bits will pop up on the screen.
// 'Power Config' - 0x9234 = 0x2D80
// Setting the DSLP_LDO bit allows the LDOs to remain active when the device goes into Deep Sleep mode
// Set wake speed bits to 00 for best performance
BQ769x2_SetRegister(PowerConfig, 0x2D80, 2);
// 'Default Alarm Mask' - 0x..82 Enables the FullScan and ADScan bits, default value = 0xF800
BQ769x2_SetRegister(DefaultAlarmMask, 0xF882, 2);
// 'REG0 Config' - set REG0_EN bit to enable pre-regulator
BQ769x2_SetRegister(REG0Config, 0x00, 1);
// Set DFETOFF pin to control BOTH CHG and DSG FET - 0x92FB = 0x42 (set to 0x00 to disable)
BQ769x2_SetRegister(DFETOFFPinConfig, 0x42, 1);
// Set up ALERT Pin - 0x92FC = 0x2A
// This configures the ALERT pin to drive high (REG1 voltage) when enabled.
// The ALERT pin can be used as an interrupt to the MCU when a protection has triggered or new measurements are available
BQ769x2_SetRegister(ALERTPinConfig, 0x2A, 1);
// Set TS1 to measure Cell Temperature - 0x92FD = 0x07
BQ769x2_SetRegister(TS1Config, 0x00, 1);
// Set TS3 to measure FET Temperature - 0x92FF = 0x0F
BQ769x2_SetRegister(TS3Config, 0x00, 1);
// Set HDQ to measure Cell Temperature - 0x9300 = 0x07
BQ769x2_SetRegister(HDQPinConfig, 0x00, 1); // No thermistor installed on EVM HDQ pin, so set to 0x00
// Enable int Temp as FET temp /internal temp for Cell Protectinon- 0x9303 = 0x1E
//user mV =10mV and user A =10mA
BQ769x2_SetRegister(DAConfiguration, 0x1E, 1);
// 'VCell Mode' - Enable 16 cells - 0x9304 = 0x0000; Writing 0x0000 sets the default of 16 cells
BQ769x2_SetRegister(VCellMode, 0x0000, 2);
// Enable protections in 'Enabled Protections A' 0x9261 = 0xBC
// Enables SCD (short-circuit), OCD1 (over-current in discharge), OCD2,OCC (over-current in charge),
// COV (over-voltage), CUV (under-voltage)
BQ769x2_SetRegister(EnabledProtectionsA, 0xFC, 1);
// Enable all protections in 'Enabled Protections B' 0x9262 = 0xF7
// Enables OTF (over-temperature FET), OTINT (internal over-temperature), OTD (over-temperature in discharge),
// OTC (over-temperature in charge), UTINT (internal under-temperature), UTD (under-temperature in discharge), UTC (under-temperature in charge)
BQ769x2_SetRegister(EnabledProtectionsB, 0xF7, 1);
//Disable All protections in 'Enabled Protections C' 0x9263 = 0x00
BQ769x2_SetRegister(EnabledProtectionsC, 0x00, 1);
//Enable/Disable All protections in 'Charge FET' 0x9265 = 0x98
BQ769x2_SetRegister(CHGFETProtectionsA, 0x98, 1);
//Enable/Disable All protections in 'Charge FET' 0x9266 = 0xD5 //Disable All Protection
BQ769x2_SetRegister(CHGFETProtectionsB, 0xD5, 1);
//Enable/Disable All protections in 'Charge FET' 0x9267 = 0x56 //Disable All Protection
BQ769x2_SetRegister(CHGFETProtectionsC, 0x56, 1);
//Enable/Disable All protections in 'Dis Charge FET' 0x9269/0x926A/0x926B= Default Settings
BQ769x2_SetRegister(DSGFETProtectionsA, 0xE4, 1);
BQ769x2_SetRegister(DSGFETProtectionsB, 0xE6, 1);
BQ769x2_SetRegister(DSGFETProtectionsC, 0xE2, 1);
BQ769x2_SetRegister(FETOptions, 0x0D, 1);
//Enables CHARGE PUMP AND CHARGE PUMP LEVEL 5.5V,0X9309
BQ769x2_SetRegister(ChgPumpControl, 0x00, 1);
//Set Discharge Current for Discharge Status of Battery--0x9310=0x0A--1.0A
BQ769x2_SetRegister(DsgCurrentThreshold, 0x0A, 1);
//Set charge Current for charge Status of Battery--0x9312=0x0A--1.0A
BQ769x2_SetRegister(ChgCurrentThreshold, 0x0A, 1);
//Set Open Wire Check Time --0x9314=0x1E--30 Seconds
BQ769x2_SetRegister(CheckTime, 0x1E, 1);
// Set up Cell Balancing Configuration - 0x9335 = 0x03 - Automated balancing while in Relax or Charge modes
// Also see "Cell Balancing with BQ769x2 Battery Monitors" document on ti.com
BQ769x2_SetRegister(BalancingConfiguration, 0x03, 1);
//SET CELL BALANCE INTERVAL //0X9339=30 SECOND
BQ769x2_SetRegister(CellBalanceInterval, 0x1E, 1);
//SET CELL BALANCE MAX NUMBER OF CELL //0X933A=1
BQ769x2_SetRegister(CellBalanceMaxCells, 0x01, 1);
//SET CELL BALANCE Min CELL VOLTAGE during Charge//0X933B=3600 mV
BQ769x2_SetRegister(CellBalanceMinCellVCharge, 3500, 2);
//SET CELL BALANCE Min delta CELL VOLTAGE during Charge//0X933D=40 mV
BQ769x2_SetRegister(CellBalanceMinDeltaCharge, 40, 1);
//SET CELL BALANCE Min delta Stop VOLTAGE during Charge//0X933e=20 mV
BQ769x2_SetRegister(CellBalanceStopDeltaCharge, 20, 1);
//shutdown
//SET stack Voltage//0X9241=60.0V
BQ769x2_SetRegister(ShutdownStackVoltage, 600, 2);
//SET shutdown delay when stack Voltage below //9243=20 seconds
BQ769x2_SetRegister(LowVShutdownDelay, 20, 1);
//SET shut down Temperature//0X9244=70 degree
BQ769x2_SetRegister(ShutdownTemperature, 70, 1);
//SET shut down Temperature Delay //0X9245=5 Second
BQ769x2_SetRegister(ShutdownTemperatureDelay, 5, 1);
//SET FET shut down Delay //0X9252=0 means Link with RST Pin
BQ769x2_SetRegister(FETOffDelay, 0, 1);
//SET shut down Command Delay //0X9253= 8*.25Second means Link with RST Pin
BQ769x2_SetRegister(ShutdownCommandDelay, 8, 1);//2 seconds
//Auto Shut Down Time //9254=50 mA
BQ769x2_SetRegister(AutoShutdownTime, 15, 1);
//Sleep Current //9248=50 mA
BQ769x2_SetRegister(SleepCurrent, 50, 2);
//Sleep Voltage Time //924A=60 Second
BQ769x2_SetRegister(VoltageTime, 60, 1);
//Sleep wake Comparator current //924B=500mA
BQ769x2_SetRegister(WakeComparatorCurrent, 500, 2);
//Sleep Hys time //924D=60 Second
BQ769x2_SetRegister(SleepHysteresisTime, 60, 1);
//Sleep Charger Voltage Threshold //924E=2000 //2000 * 10 mV
BQ769x2_SetRegister(SleepChargerVoltageThreshold, 2000, 2);
// Set up CUV (under-voltage) Threshold - 0x9275 = SetCellUnderVoltage[3] (2000)
// CUV Threshold is this value multiplied by 50.6mV
tempRegValue=SetCellUnderVoltage[3];
tempRegValue=(tempRegValue*10)/506+.5;
BQ769x2_SetRegister(CUVThreshold, (uint8_t)tempRegValue, 1);
//CUV Delay //9276=74 //250.8 mS
BQ769x2_SetRegister(CUVDelay, 74, 2);
//CUV RECOVERY HYS //927B=4 //4*50.6 mV
BQ769x2_SetRegister(CUVRecoveryHysteresis, 4, 2);
// Set up COV (over-voltage) Threshold - 0x9278 = SetCellOverVoltage[3](3900 mV)
// COV Threshold is this value multiplied by 50.6mV
tempRegValue=SetCellOverVoltage[3];
tempRegValue=(tempRegValue*10)/506;
BQ769x2_SetRegister(COVThreshold, (uint8_t)tempRegValue, 1);
//DELAY 0x9278=74(250.8 mS)
BQ769x2_SetRegister(COVDelay, 74, 2);
//SET COV RECOVERY HYS//0X927C=5//5*50.6
BQ769x2_SetRegister(COVRecoveryHysteresis,5,1);
// Set Pack-Tos Delta Voltage - 0x92B0 = 200 //200*10 mV
BQ769x2_SetRegister(OCCPACKTOSDelta,200, 2);
// Set up OCC (over-current in charge) Threshold - 0x9280 = 0x26 (125 mV = 100A across 1.25mOhm sense resistor) Units in 2mV
BQ769x2_SetRegister(OCCThreshold, 0x26, 1);
// Set up OCC (over-current in charge) Delay - 0x9281 = 0x1E (29*3.3+6.6 mS)//102 mS
BQ769x2_SetRegister(OCCDelay, 0x1D, 1);
// Set up OCD1 Threshold - 0x9282 = 16 (32 mV = 40A across 1.25mOhm sense resistor) units of 2mV
BQ769x2_SetRegister(OCD1Threshold, 16, 1);
// Set up OCD1 Delay - 0x9283 = 127 //127*3.3+6.6 Ms
BQ769x2_SetRegister(OCD1Delay, 127, 1);
// Set up OCD2 Threshold - 0x9284 = 24 (48 mV = 60A across 1.25mOhm sense resistor) units of 2mV
BQ769x2_SetRegister(OCD2Threshold, 24, 1);
// Set up OCD2 Delay - 0x9285 = 28 //28*3.3+6.6 Ms=99mS
BQ769x2_SetRegister(OCD2Delay, 28, 1);
// Set up OCD3 Threshold - 0x928A =-1000 (-1000=100.0 A)
BQ769x2_SetRegister(OCD3Threshold, -1000, 2);
// Set up OCD2 Delay - 0x928C = 2 //2 Seconds
BQ769x2_SetRegister(OCD3Delay, 2, 1);
// Set up OCD Recovery Threshold - 0x928D = 200 //
BQ769x2_SetRegister(OCDRecoveryThreshold, 200, 2);
// Set up SCD Threshold - 0x9286 = 6 (125A = 1.25 mohm @100 A ) 6=125 mV
BQ769x2_SetRegister(SCDThreshold, 0x06, 1);
// Set up SCD Delay - 0x9287 = 7 (105 uS) Enabled with a delay of (value - 1) * 15 µs; min value of 1
BQ769x2_SetRegister(SCDDelay, 0x07, 1);
// Set up SCDL Latch Limit to 1 to set SCD recovery only with load removal 0x9295 = 0x01
// If this is not set, then SCD will recover based on time (SCD Recovery Time parameter).
BQ769x2_SetRegister(SCDLLatchLimit, 0x01, 1);
//OTC
// OTC THRESHOLD - 0x929A = 50 DEGREE
BQ769x2_SetRegister(OTCThreshold, 50, 1);
// OTC DELAY- 0x929B = 5 SECONDS
BQ769x2_SetRegister(OTCDelay, 5, 1);
// OTC RECOVERY - 0x929C = 45 DEGREE
BQ769x2_SetRegister(OTCRecovery, 45, 1);
//OTD
// OTD THRESHOLD - 0x929D = 60 DEGREE
BQ769x2_SetRegister(OTDThreshold, 60, 1);
// OTD DELAY- 0x929E = 5 SECONDS
BQ769x2_SetRegister(OTDDelay, 5, 1);
// OTC RECOVERY - 0x929F = 55 DEGREE
BQ769x2_SetRegister(OTDRecovery, 55, 1);
//OTF
// OTF THRESHOLD - 0x92A0 = 70 DEGREE
BQ769x2_SetRegister(OTFThreshold, 70, 1);
// OTF DELAY- 0x92A1 = 5 SECONDS
BQ769x2_SetRegister(OTFDelay, 5, 1);
// OTC RECOVERY - 0x92A2 = 60 DEGREE
BQ769x2_SetRegister(OTFRecovery, 60, 1);
//LOAD DETECT
// LD TIME 0x92B4 = 10 SECOND
BQ769x2_SetRegister(LoadDetectActiveTime, 10, 1);
// LD RECOVERY TIME = 50 SECONDS
BQ769x2_SetRegister(LoadDetectRetryDelay, 50, 1);
// LD RECOVERY TIME = 1 HRS
BQ769x2_SetRegister(LoadDetectTimeout, 1, 1);
//PERMANENT FAIL
// PERMANENT FAIL /DEEP DISCHARGE - 0x92C8 = 1500mV
BQ769x2_SetRegister(CUDEPThreshold, 1500, 2);
// PERMANENT FAIL /DEEP DISCHARGE- 0x92CA = 5 SECONDS
BQ769x2_SetRegister(CUDEPDelay, 5, 1);
// SUV - 0x92CB = 22000mV
BQ769x2_SetRegister(SUVThreshold, 2200, 2);
// SUV DELAY- 0x92CD = 5 SECONDS
BQ769x2_SetRegister(SUVDelay, 5, 1);
// SOV - 0x92CE = 4000mV
BQ769x2_SetRegister(SOVThreshold, 4000, 2);
// SOV DELAY- 0x92D0 = 5 SECONDS
BQ769x2_SetRegister(SOVDelay, 5, 1);
// TOS - 0x92D1 = 500mV
BQ769x2_SetRegister(TOSSThreshold, 500, 2);
// TOS DELAY- 0x92D3 = 10 SECONDS
BQ769x2_SetRegister(SOVDelay, 10, 1);
// SOCC 0x92D4 = 12500mA *10mA
BQ769x2_SetRegister(SOCCThreshold, 12500, 2);
// SOCC DELAY- 0x92D6 = 5 SECONDS
BQ769x2_SetRegister(SOCCDelay, 5, 1);
// SOCD 0x92D7 = -11000mA *10mA
BQ769x2_SetRegister(SOCDThreshold, -11000, 2);
// SOCD DELAY- 0x92D9 = 5 SECONDS
BQ769x2_SetRegister(SOCDDelay, 5, 1);
// SOT 0x92DA = 65 DEGREE
BQ769x2_SetRegister(SOTThreshold, 65, 1);
// SOT DELAY- 0x92DB = 5 SECONDS
BQ769x2_SetRegister(SOTDelay, 5, 1);
// SOTF 0x92DC = 85 DEGREE
BQ769x2_SetRegister(SOTFThreshold, 85, 1);
// SOTF DELAY- 0x92DD = 5 SECONDS
BQ769x2_SetRegister(SOTFDelay, 5, 1);
// PERMANENT FAIL CHECK VOLTAGE 0x92DE = 3500mV
BQ769x2_SetRegister(VIMRCheckVoltage, 3500, 2);
// PERMANENT FAIL CHECK CURRENT 0x92E0 = 3500mV
BQ769x2_SetRegister(VIMRMaxRelaxCurrent, 10, 2);
// PERMANENT FAIL VIMR 0x92E2 = 500mV
BQ769x2_SetRegister(VIMRThreshold, 500, 2);
// PERMANENT FAIL VIMR DELAY 0x92E4 = 5
BQ769x2_SetRegister(VIMRDelay, 5, 1);
// PERMANENT FAIL VIMR RELAX DURATION 0x92E5 = 90 SEC
BQ769x2_SetRegister(VIMRRelaxMinDuration, 90, 2);
// PERMANENT FAIL VIMA 0x92E7 = 3700
BQ769x2_SetRegister(VIMRDelay, 3700, 2);
// PERMANENT FAIL VIMA MIN ACTIVE CURRENT 0x92E9 = 50mA
BQ769x2_SetRegister(VIMAMinActiveCurrent, 50, 2);
// PERMANENT FAIL VIMA 0x92EB = 200mV
BQ769x2_SetRegister(VIMAThreshold, 200, 2);
// PERMANENT FAIL VIMA DELAY 0x92ED = 5 SECOND
BQ769x2_SetRegister(VIMADelay, 5, 1);
// PERMANENT FAIL CFET OFF 0X92EE = 50mA
BQ769x2_SetRegister(CFETFOFFThreshold, 50, 2);
// PERMANENT FAIL CFET OFF DELAY 0X92F0 = 5 SEC
BQ769x2_SetRegister(CFETFOFFDelay, 5, 1);
// PERMANENT FAIL DFET OFF 0X92F1 = -50mA
BQ769x2_SetRegister(DFETFOFFThreshold, -50, 2);
// PERMANENT FAIL DFET OFF DELAY 0X92F3 = 5 SEC
BQ769x2_SetRegister(DFETFOFFDelay, 5, 1);
// PERMANENT FAIL VSSF 0X92F4 = 100
BQ769x2_SetRegister(VSSFFailThreshold, 100, 2);
// PERMANENT FAIL VSSF DELAY 0X92F6 = 5 SEC
BQ769x2_SetRegister(VSSFDelay, 5, 1);
// Exit CONFIGUPDATE mode - Subcommand 0x0092
CommandSubcommands(EXIT_CFGUPDATE);
}