@@ -42,7 +42,8 @@ TLE9012::TLE9012() //Constructor
42
42
errorcallbacks.open_load_error_callback = NULL ;
43
43
errorcallbacks.overvoltage_callback = NULL ;
44
44
errorcallbacks.reg_crc_error_callback = NULL ;
45
- errorcallbacks.undevoltage_callback = NULL ;
45
+ errorcallbacks.undervoltage_callback = NULL ;
46
+ errorcallbacks.ps_error_sleep_callback = NULL ;
46
47
}
47
48
48
49
/*
@@ -287,7 +288,7 @@ void TLE9012::wakeUp()
287
288
errorcallbacks.overvoltage_callback = errorhandler;
288
289
break ;
289
290
case UNDERVOLTAGE_ERROR:
290
- errorcallbacks.undevoltage_callback = errorhandler;
291
+ errorcallbacks.undervoltage_callback = errorhandler;
291
292
break ;
292
293
case ADC_ERROR:
293
294
errorcallbacks.adc_error_callback = errorhandler;
@@ -319,9 +320,114 @@ void TLE9012::wakeUp()
319
320
void TLE9012::checkErrors (uint8_t nodeID)
320
321
{
321
322
uint16_t gen_diag = 0 ;
322
- readRegisterSingle (nodeID,GEN_DIAG,&gen_diag);
323
+ (void ) readRegisterSingle (nodeID,GEN_DIAG,&gen_diag);
324
+
325
+ if (gen_diag & 0x8000 )
326
+ {
327
+ uint16_t balancing_oc_flags = 0 ;
328
+ (void ) readRegisterSingle (nodeID,BAL_DIAG_OC,&balancing_oc_flags);
329
+ if (errorcallbacks.balancing_error_overcurrent_callback != NULL )
330
+ errorcallbacks.balancing_error_overcurrent_callback (nodeID,balancing_oc_flags);
331
+ }
332
+
333
+ if (gen_diag & 0x4000 )
334
+ {
335
+ uint16_t balancing_uc_flags = 0 ;
336
+ (void ) readRegisterSingle (nodeID,BAL_DIAG_UC,&balancing_uc_flags);
337
+ if (errorcallbacks.balancing_error_undercurrent_callback != NULL )
338
+ errorcallbacks.balancing_error_undercurrent_callback (nodeID,balancing_uc_flags);
339
+ }
340
+
341
+ if (gen_diag & 0x2000 )
342
+ {
343
+ uint16_t cell_ov_diag = 0 ;
344
+ (void ) readRegisterSingle (nodeID,CELL_OV,&cell_ov_diag);
345
+ if (errorcallbacks.overvoltage_callback != NULL )
346
+ errorcallbacks.overvoltage_callback (nodeID,cell_ov_diag);
347
+ }
348
+
349
+ if (gen_diag & 0x1000 )
350
+ {
351
+ uint16_t cell_uv_diag = 0 ;
352
+ (void ) readRegisterSingle (nodeID,CELL_UV,&cell_uv_diag);
353
+ if (errorcallbacks.undervoltage_callback != NULL )
354
+ errorcallbacks.undervoltage_callback (nodeID,cell_uv_diag);
355
+ }
356
+
357
+ if (gen_diag & 0x0800 )
358
+ {
359
+ uint16_t overtemp = 0 ;
360
+ (void ) readRegisterSingle (nodeID,INT_TEMP,&overtemp);
361
+ if (errorcallbacks.internal_temp_error_callback != NULL )
362
+ errorcallbacks.internal_temp_error_callback (nodeID,overtemp);
363
+ }
364
+
365
+ if (gen_diag & 0x0400 )
366
+ {
367
+ uint16_t ext_temp_err = 0 ;
368
+ (void ) readRegisterSingle (nodeID,EXT_TEMP_DIAG,&ext_temp_err);
369
+ if (errorcallbacks.external_temp_error_callback != NULL )
370
+ errorcallbacks.external_temp_error_callback (nodeID,ext_temp_err);
371
+ }
372
+
373
+ if (gen_diag & 0x0200 )
374
+ {
375
+ uint16_t reg_crc = 0 ;
376
+ (void ) readRegisterSingle (nodeID,REG_CRC_ERR,®_crc);
377
+ if (errorcallbacks.reg_crc_error_callback != NULL )
378
+ errorcallbacks.reg_crc_error_callback (nodeID,reg_crc);
379
+ }
380
+
381
+ if (gen_diag & 0x0100 )
382
+ {
383
+ uint16_t ic_error = 0 ;
384
+ if (errorcallbacks.internal_IC_error_callback != NULL )
385
+ errorcallbacks.internal_IC_error_callback (nodeID,0x0000 );
386
+ }
387
+
388
+ if (gen_diag & 0x0080 )
389
+ {
390
+ uint16_t open_load = 0 ;
391
+ (void ) readRegisterSingle (nodeID,DIAG_OL,&open_load);
392
+ if (errorcallbacks.open_load_error_callback != NULL )
393
+ errorcallbacks.open_load_error_callback (nodeID,open_load);
394
+ }
395
+
396
+ if (gen_diag & 0x0040 )
397
+ {
398
+ if (errorcallbacks.adc_error_callback != NULL )
399
+ errorcallbacks.adc_error_callback (nodeID,0x0000 );
400
+ }
401
+
402
+ if (gen_diag & 0x0020 )
403
+ {
404
+ if (errorcallbacks.ps_error_sleep_callback != NULL )
405
+ errorcallbacks.ps_error_sleep_callback (nodeID,0x0000 );
406
+ }
323
407
}
324
408
409
+ void TLE9012::resetErrors (uint8_t nodeID)
410
+ {
411
+ (void ) writeRegisterSingle (nodeID,GEN_DIAG,0x0000 );
412
+ }
413
+
414
+ void TLE9012::configFaultMasks (uint8_t nodeID, err_emm_error_mask_t err_mask)
415
+ {
416
+ uint16_t errormask = 0 ;
417
+ errormask |= err_mask.balancing_overcurrent_error <<15 ;
418
+ errormask |= err_mask.balancing_undercurrent_error <<14 ;
419
+ errormask |= err_mask.overvoltage_error << 13 ;
420
+ errormask |= err_mask.undervoltage_error << 12 ;
421
+ errormask |= err_mask.internal_temperature_error << 11 ;
422
+ errormask |= err_mask.external_termperature_error << 10 ;
423
+ errormask |= err_mask.reg_crc_err << 9 ;
424
+ errormask |= err_mask.int_ic_err << 8 ;
425
+ errormask |= err_mask.open_load_error << 7 ;
426
+ errormask |= err_mask.adc_error << 6 ;
427
+ errormask |= err_mask.err_pin << 5 ;
428
+
429
+ (void ) writeRegisterSingle (nodeID,FAULT_MASK,errormask);
430
+ }
325
431
// Round Robin Functions
326
432
327
433
void TLE9012::setRoundRobinErrorHandling (uint8_t nodeID, uint16_t rr_sleep_interval, uint8_t rr_temp_measurement_interval, uint8_t n_errors)
0 commit comments