71 #define EEPROM_MFG_DATA_ADDRESS 0 // EEPROM address for first byte of Manufacturing Board ID Data
72 #define EEPROM_MFG_DATA_CRC_ADDRESS (EEPROM_MFG_DATA_ADDRESS + sizeof(EEPROM_MFG_DATA_TYPE))
73 #define EEPROM_MFG_DATA_END (EEPROM_MFG_DATA_CRC_ADDRESS + sizeof(int16) - 1)
75 #define EEPROM_MFG_CAP_ADDRESS 32 // EEPROM address for first byte of Linear factory calibrated capacity values.
76 #define EEPROM_MFG_CAP_CRC_ADDRESS (EEPROM_MFG_CAP_ADDRESS + sizeof(EEPROM_CAP_TYPE))
77 #define EEPROM_MFG_CAP_END (EEPROM_MFG_CAP_CRC_ADDRESS + sizeof(int16) - 1)
78 #if EEPROM_MFG_CAP_ADDRESS <= EEPROM_MFG_DATA_END
79 #error "EEPROM_MFG_CAP_ADDRESS" overlaps "EEPROM_MFG_DATA_END"
82 #define EEPROM_MFG_CURRENT_ADDRESS 80 // EEPROM address for first byte of Linear factory calibrated balance current values.
83 #define EEPROM_MFG_CURRENT_CRC_ADDRESS (EEPROM_MFG_CURRENT_ADDRESS + sizeof(EEPROM_CURRENT_TYPE))
84 #define EEPROM_MFG_CURRENT_END (EEPROM_MFG_CURRENT_CRC_ADDRESS + sizeof(int16) - 1)
85 #if EEPROM_MFG_CURRENT_ADDRESS <= EEPROM_MFG_CAP_END
86 #error "EEPROM_MFG_CURRENT_ADDRESS" overlaps "EEPROM_MFG_CAP_END"
89 #define EEPROM_USER_CAP_ADDRESS 128 // EEPROM address for first byte of User entered capacity values.
90 #define EEPROM_USER_CAP_CRC_ADDRESS (EEPROM_USER_CAP_ADDRESS + sizeof(EEPROM_CAP_TYPE))
91 #define EEPROM_USER_CAP_END (EEPROM_USER_CAP_CRC_ADDRESS + sizeof(int16) - 1)
92 #if EEPROM_USER_CAP_ADDRESS <= EEPROM_MFG_CURRENT_END
93 #error "EEPROM_USER_CAP_ADDRESS" overlaps "EEPROM_MFG_CURRENT_END"
96 #define EEPROM_USER_CURRENT_ADDRESS 176 // EEPROM address for first byte of User entered balance current values.
97 #define EEPROM_USER_CURRENT_CRC_ADDRESS (EEPROM_USER_CURRENT_ADDRESS + sizeof(EEPROM_CURRENT_TYPE))
98 #define EEPROM_USER_CURRENT_END (EEPROM_USER_CURRENT_CRC_ADDRESS + sizeof(int16) - 1)
99 #if EEPROM_USER_CURRENT_ADDRESS <= EEPROM_USER_CAP_END
100 #error "EEPROM_USER_CURRENT_ADDRESS" overlaps "EEPROM_USER_CAP_END"
104 #define eeprom_read(board_num, address, data_ptr, num_bytes) \
106 Eeprom_24AA64_Read(board_num, address, data_ptr, num_bytes); \
107 eeprom_number_reads += num_bytes; \
111 #define eeprom_write(board_num, address, data_ptr, num_bytes) \
113 Eeprom_24AA64_Write(board_num, address, data_ptr, num_bytes); \
114 eeprom_number_writes += num_bytes; \
128 int16 eeprom_number_reads;
129 int16 eeprom_number_writes;
134 void eeprom_write_with_crc(int8 board_num, int8* data_ptr, int16 address, int16 num_bytes);
135 BOOLEAN eeprom_read_with_crc(int8 board_num, int8* data_ptr, int16 address, int16 num_bytes);
136 void eeprom_cap_use_defaults(int8 board_num);
137 void eeprom_current_use_defaults(int8 board_num);
148 eeprom_number_reads = 0;
149 eeprom_number_writes = 0;
151 memset(Eeprom_cap_values, 0,
sizeof(Eeprom_cap_values));
152 memset(Eeprom_current_values, 0,
sizeof(Eeprom_current_values));
175 if((FALSE == eeprom_read_with_crc(board_num, &Eeprom_cap_values[board_num], EEPROM_USER_CAP_ADDRESS,
sizeof(
EEPROM_CAP_TYPE))) ||
178 if(FALSE == eeprom_read_with_crc(board_num, &Eeprom_cap_values[board_num], EEPROM_MFG_CAP_ADDRESS,
sizeof(
EEPROM_CAP_TYPE)))
180 eeprom_cap_use_defaults(board_num);
190 if((FALSE == eeprom_read_with_crc(board_num, &Eeprom_current_values[board_num], EEPROM_USER_CURRENT_ADDRESS,
sizeof(
EEPROM_CURRENT_TYPE))) ||
193 if(FALSE == eeprom_read_with_crc(board_num, &Eeprom_current_values[board_num], EEPROM_MFG_CURRENT_ADDRESS,
sizeof(
EEPROM_CURRENT_TYPE)))
195 eeprom_current_use_defaults(board_num);
207 eeprom_write_with_crc(board_num, &Eeprom_cap_values[board_num], EEPROM_MFG_CAP_ADDRESS,
sizeof(
EEPROM_CAP_TYPE));
209 eeprom_write_with_crc(board_num, &Eeprom_cap_values[board_num], EEPROM_USER_CAP_ADDRESS,
sizeof(
EEPROM_CAP_TYPE));
220 eeprom_write_with_crc(board_num, &Eeprom_current_values[board_num], EEPROM_MFG_CURRENT_ADDRESS,
sizeof(
EEPROM_CURRENT_TYPE));
222 eeprom_write_with_crc(board_num, &Eeprom_current_values[board_num], EEPROM_USER_CURRENT_ADDRESS,
sizeof(
EEPROM_CURRENT_TYPE));
233 eeprom_cap_use_defaults(board_num);
248 eeprom_current_use_defaults(board_num);
263 eeprom_cap_use_defaults(board_num);
281 eeprom_current_use_defaults(board_num);
295 return eeprom_read_with_crc(board_num, mfg_data, EEPROM_MFG_DATA_ADDRESS,
sizeof(
EEPROM_MFG_DATA_TYPE));
301 eeprom_write_with_crc(board_num, mfg_data, EEPROM_MFG_DATA_ADDRESS,
sizeof(
EEPROM_MFG_DATA_TYPE));
309 void eeprom_write_with_crc(int8 board_num, int8* data_ptr, int16 address, int16 num_bytes)
312 unsigned int16 crc_address;
314 eeprom_write(board_num, address, data_ptr, num_bytes);
318 crc_address = address + num_bytes;
320 eeprom_write(board_num, crc_address, (int8*)&crc,
sizeof(crc));
325 BOOLEAN eeprom_read_with_crc(int8 board_num, int8* data_ptr, int16 address, int16 num_bytes)
327 unsigned int16 crc_read, crc_calc;
328 unsigned int16 crc_address;
330 eeprom_read(board_num, address, data_ptr, num_bytes);
334 crc_address = address + num_bytes;
335 eeprom_read(board_num, crc_address, (int8*)&crc_read,
sizeof(crc_read));
337 if(crc_calc == crc_read)
355 void eeprom_cap_use_defaults(int8 board_num)
359 if(System_Cap_Demo.demo_present == 1)
361 for (cell_num = 0; cell_num < DC2100A_NUM_CELLS; cell_num++)
363 Eeprom_cap_values[board_num].
cap[cell_num] = SOC_CAP_DEMO_DEFAULT;
366 Eeprom_cap_values[board_num].
cap[5] = SOC_CAP_DEMO_CELL_6_DEFAULT;
367 Eeprom_cap_values[board_num].
cap[6] = SOC_CAP_DEMO_CELL_7_DEFAULT;
371 if((System_Model[board_num] ==
'A') || (System_Model[board_num] ==
'B'))
373 for (cell_num = 0; cell_num < DC2100A_NUM_CELLS; cell_num++)
375 Eeprom_cap_values[board_num].
cap[cell_num] = SOC_CAPACITY_AB_DEFAULT;
381 for (cell_num = 0; cell_num < DC2100A_NUM_CELLS; cell_num++)
383 Eeprom_cap_values[board_num].
cap[cell_num] = SOC_CAPACITY_CD_DEFAULT;
397 void eeprom_current_use_defaults(int8 board_num)
400 int8 charge_default_12cell;
401 int8 discharge_default_12cell;
404 if((System_Model[board_num] ==
'A') || (System_Model[board_num] ==
'B'))
415 for (cell_num = 0; cell_num < DC2100A_NUM_CELLS / 2; cell_num++)
417 Eeprom_current_values[board_num].
current[cell_num].
charge = charge_default_12cell;
418 Eeprom_current_values[board_num].
current[cell_num].
discharge = discharge_default_12cell;
422 for (cell_num = DC2100A_NUM_CELLS / 2; cell_num < DC2100A_NUM_CELLS; cell_num++)
424 Eeprom_current_values[board_num].
current[cell_num].
charge = 0;
EEPROM_CURRENT_TYPE Eeprom_current_values[DC2100A_MAX_BOARDS]
Copy of balance currents values allows quick balance calculations.
struct EEPROM_CURRENT_TYPE::@0 current[DC2100A_NUM_CELLS]
current calibration factor in BALANCER_CURRENT_SCALE units
void Eeprom_Current_Load(int8 board_num, int8 mfg_key)
Loads the customer saved or Linear factory calibrated balance current values from EEPROM into global ...
#define BALANCER_AB_CURRENT_CHARGE_12CELL
in mA, nominal charge balance current for cells with 12 cell secondary connections on a DC2100A-A or ...
Structure containing manufacturing data for one DC2100A PCB.
void Eeprom_Current_Save(int8 board_num, int8 mfg_key)
Saves the customer saved or Linear factory calibrated balance current values from global shadow RAM i...
Reference Application File for EEPROM Data specific to the LTC6804-2 Battery Monitor on the DC2100A P...
void Eeprom_24AA64_Erase(int8 board_num)
Erases the full contents of the 24AA64 EEPROM.
#define BALANCER_CD_CURRENT_CHARGE_12CELL
in mA, nominal charge balance current for cells with 12 cell secondary connections on a DC2100A-C or ...
void Eeprom_Current_Save_Defaults(int8 board_num, int8 mfg_key)
Resets customer saved balance current values to Linear factory calibrated balance current values...
EEPROM_CAP_TYPE Eeprom_cap_values[DC2100A_MAX_BOARDS]
@ EEPROM Shadow RAMShadow RAM for cell data stored in DC2100A EEPROM.
API Header File for LTC6804-2 Multicell Battery Monitors.
Reference Application File for Interface to 24AA64 EEPROM through the LTC6804-2 Battery Monitor on th...
#define BALANCER_CD_CURRENT_CHARGE_6CELL
in mA, nominal charge balance current for cells with 6 cell secondary connections on a DC2100A-C or D...
signed int8 charge
charge current calibration factor
void Eeprom_Init(void)
Initializes the EEPROM code module.
#define EEPROM_MFG_KEY
Key allows access for Linear factory calibrated values.
unsigned int16 LTC6804_PEC_Calc(char *data, int length)
Calculates the LTC6804 CRC over a string of bytes as per datasheet figure 22.
void Eeprom_Mfg_Data_Set(int8 board_num, EEPROM_MFG_DATA_TYPE *mfg_data)
Saves the Manufacturing Board ID Data from global shadow RAM into EEPROM.
#define BALANCER_AB_CURRENT_DISCHARGE_6CELL
in mA, nominal discharge balance current for cells with 6 cell secondary connections on a DC2100A-A o...
BOOLEAN Eeprom_Mfg_Data_Get(int8 board_num, EEPROM_MFG_DATA_TYPE *mfg_data)
Loads the Manufacturing Board ID Data from EEPROM into global shadow RAM.
#define BALANCER_AB_CURRENT_CHARGE_6CELL
in mA, nominal charge balance current for cells with 6 cell secondary connections on a DC2100A-A or D...
signed int8 discharge
discharge current calibration factor
Structure containing balance current calibration factors for one DC2100A PCB.
unsigned int16 cap[DC2100A_NUM_CELLS]
cell capacity in SOC_CAP_SCALE_FACTOR units
void Eeprom_Cap_Load_Defaults(int8 board_num, int8 mfg_key)
Loads Linear factory calibrated or nominal capacity values.
void Eeprom_Current_Load_Defaults(int8 board_num, int8 mfg_key)
Loads Linear factory calibrated or nominal balance current values.
#define BALANCER_AB_CURRENT_DISCHARGE_12CELL
in mA, nominal discharge balance current for cells with 12 cell secondary connections on a DC2100A-A ...
void Eeprom_Cap_Save(int8 board_num, int8 mfg_key)
Saves the customer saved or Linear factory calibrated capacity values from global shadow RAM into EEP...
Structure containing capacity data for one DC2100A PCB.
void Eeprom_Cap_Load(int8 board_num, int8 mfg_key)
Loads the customer saved or Linear factory calibrated capacity values from EEPROM into global shadow ...
BOOLEAN Eeprom_Reset(int8 board_num, char *reset_key)
Resets the EEPROM to blank values.
#define BALANCER_CD_CURRENT_DISCHARGE_12CELL
in mA, nominal discharge balance current for cells with 12 cell secondary connections on a DC2100A-C ...
#define EEPROM_RESET_KEY
Key allows reset of EEPROM to blank values.
void Eeprom_Cap_Save_Defaults(int8 board_num, int8 mfg_key)
Resets customer saved capacity values to Linear factory calibrated capacity values, or factory calibrated capacity values to nominal.
Reference Application File for Controlling the LTC3300-1 Battery Balancers through the LTC6804-2 Batt...
#define BALANCER_CD_CURRENT_DISCHARGE_6CELL
in mA, nominal discharge balance current for cells with 6 cell secondary connections on a DC2100A-C o...
#define BALANCER_CURRENT_SCALE_CALC(desired_current, base_current)
calculation of calibration current values
#define EEPROM_RESET_KEY_SIZE
Size of EEPROM_RESET_KEY.