Midnight Sun Firmware
Loading...
Searching...
No Matches
adbms_afe_regs.h
1#pragma once
2
3/************************************************************************************************
4 * @file adbms_afe_regs.h
5 *
6 * @brief Header file to define the ADBMS1818 AFE's register layout, configuration, and command code structures
7 *
8 * @date 2025-04-13
9 * @author Midnight Sun Team #24 - MSXVI
10 ************************************************************************************************/
11
12/* Standard library Headers */
13#include <assert.h>
14
15/* Inter-component Headers */
16
17/* Intra-component Headers */
18
26#if defined(__GNUC__)
27#define _PACKED __attribute__((packed))
28#else
29#define _PACKED
30#endif
31
33#define ADBMS1818_CELLS_IN_REG 3
34#define ADBMS1818_GPIOS_IN_REG 3
35
37#define AUX_ADG731_NUM_PINS 32
38
40#define ADBMS1818_CMD_SIZE 4
41
43#define ADBMS1818_NUM_COMM_REG_BYTES 3
44
46#define ADBMS1818_NUM_PWMR_REGS 6
47
49#define ADBMS1818_NUM_PSR_REGS 6
50#define ADBMS1818_NUM_PWM_REGS_IN_PSR 3
51#define ADBMS1818_NUM_SCTL_REGS_IN_PSR 3
54#define ADBMS1818_NUM_PWMS_REGS 6
55
57#define ADBMS_AFE_MAX_CELLS_PER_DEVICE 18
62typedef enum {
81
83typedef enum {
84 ADBMS_AFE_VOLTAGE_REGISTER_A = ADBMS_AFE_REGISTER_CELL_VOLTAGE_A,
85 ADBMS_AFE_VOLTAGE_REGISTER_B = ADBMS_AFE_REGISTER_CELL_VOLTAGE_B,
86 ADBMS_AFE_VOLTAGE_REGISTER_C = ADBMS_AFE_REGISTER_CELL_VOLTAGE_C,
87 ADBMS_AFE_VOLTAGE_REGISTER_D = ADBMS_AFE_REGISTER_CELL_VOLTAGE_D,
88 ADBMS_AFE_VOLTAGE_REGISTER_E = ADBMS_AFE_REGISTER_CELL_VOLTAGE_E,
89 ADBMS_AFE_VOLTAGE_REGISTER_F = ADBMS_AFE_REGISTER_CELL_VOLTAGE_F,
90 NUM_ADBMS_AFE_VOLTAGE_REGISTERS
92
94typedef enum {
95 ADBMS_AFE_AUXILIARY_REGISTER_A = ADBMS_AFE_REGISTER_AUX_A,
96 ADBMS_AFE_AUXILIARY_REGISTER_B = ADBMS_AFE_REGISTER_AUX_B,
97 ADBMS_AFE_AUXILIARY_REGISTER_C = ADBMS_AFE_REGISTER_AUX_C,
98 ADBMS_AFE_AUXILIARY_REGISTER_D = ADBMS_AFE_REGISTER_AUX_D,
99 NUM_ADBMS_AFE_AUXILIARY_REGISTERS
101
106typedef enum {
124
138typedef struct {
139 uint8_t adcopt : 1;
140 uint8_t dten : 1;
141 uint8_t refon : 1;
143 uint8_t gpio : 5;
145 uint32_t undervoltage : 12;
146 uint32_t overvoltage : 12;
148 uint16_t discharge_bitset : 12;
149 uint8_t discharge_timeout : 4;
150} _PACKED AdbmsAfeConfigRegisterAData;
151static_assert(sizeof(AdbmsAfeConfigRegisterAData) == 6, "AdbmsAfeConfigRegisterAData must be 6 bytes");
152
166typedef struct {
167 uint8_t gpio : 4;
169 uint8_t discharge_bitset : 7;
172 uint8_t path_select : 2;
173 uint8_t force_fail : 1;
175 uint8_t mute : 1;
177 uint8_t reserved1;
178 uint8_t reserved2;
179 uint8_t reserved3;
180 uint8_t reserved4;
181} _PACKED AdbmsAfeConfigRegisterBData;
182static_assert(sizeof(AdbmsAfeConfigRegisterBData) == 6, "AdbmsAfeConfigRegisterBData must be 6 bytes");
183
192typedef struct {
193 uint8_t icom0 : 4;
194 uint8_t d0 : 8;
195 uint8_t fcom0 : 4;
196
197 uint8_t icom1 : 4;
198 uint8_t d1 : 8;
199 uint8_t fcom1 : 4;
200
201 uint8_t icom2 : 4;
202 uint8_t d2 : 8;
203 uint8_t fcom2 : 4;
204} _PACKED AdbmsAfeCommRegisterData;
205static_assert(sizeof(AdbmsAfeCommRegisterData) == 6, "AdbmsAfeCommRegisterData must be 6 bytes");
206
208typedef struct {
209 uint8_t wrcomm[ADBMS1818_CMD_SIZE];
210 AdbmsAfeCommRegisterData reg;
211 uint8_t pec;
212} _PACKED AdbmsAfeWriteCommRegPacket;
213
215typedef struct {
216 uint8_t stcomm[ADBMS1818_CMD_SIZE];
217 uint8_t clk[ADBMS1818_NUM_COMM_REG_BYTES];
218} _PACKED AdbmsAfeSendCommRegPacket;
219
221typedef struct {
222 AdbmsAfeConfigRegisterAData cfg;
223 uint16_t pec;
224} _PACKED AdbmsAfeWriteConfigAPacket;
225
227typedef struct {
228 AdbmsAfeConfigRegisterBData cfg;
229 uint16_t pec;
230} _PACKED AdbmsAfeWriteConfigBPacket;
231
232typedef union {
233 uint16_t voltages[3];
234 uint8_t values[6];
236static_assert(sizeof(AdbmsAfeRegisterData) == 6, "AdbmsAfeRegisterData must be 6 bytes");
237
238typedef struct {
240 uint16_t pec;
241} _PACKED AdbmsAfeVoltageData;
242static_assert(sizeof(AdbmsAfeVoltageData) == 8, "AdbmsAfeVoltageData must be 8 bytes");
243
244typedef struct {
246 uint16_t pec;
247} _PACKED AdbmsAfeAuxData;
248static_assert(sizeof(AdbmsAfeAuxData) == 8, "AdbmsAfeAuxData must be 8 bytes");
249
254#define ADBMS1818_WRCFGA_RESERVED (1 << 0)
255#define ADBMS1818_WRCFGB_RESERVED (1 << 5) | (1 << 2)
256#define ADBMS1818_RDCFGA_RESERVED (1 << 1)
257#define ADBMS1818_RDCFGB_RESERVED (1 << 5) | (1 << 2) | (1 << 1)
259#define ADBMS1818_RDCVA_RESERVED (1 << 2)
260#define ADBMS1818_RDCVB_RESERVED (1 << 2) | (1 << 1)
261#define ADBMS1818_RDCVC_RESERVED (1 << 3)
262#define ADBMS1818_RDCVD_RESERVED (1 << 3) | (1 << 1)
263#define ADBMS1818_RDCVE_RESERVED (1 << 3) | (1 << 0)
264#define ADBMS1818_RDCVF_RESERVED (1 << 3) | (1 << 1) | (1 << 0)
266#define ADBMS1818_RDAUXA_RESERVED ((1 << 3) | (1 << 2))
267#define ADBMS1818_RDAUXB_RESERVED ((1 << 3) | (1 << 2)) | (1 << 1)
268#define ADBMS1818_RDAUXC_RESERVED ((1 << 3) | (1 << 2)) | (1 << 0)
269#define ADBMS1818_RDAUXD_RESERVED ((1 << 3) | (1 << 2)) | (1 << 1) | (1 << 0)
271#define ADBMS1818_RDSTATA_RESERVED (1 << 4)
272#define ADBMS1818_RDSTATB_RESERVED (1 << 4) | (1 << 1)
274#define ADBMS1818_WRSCTRL_RESERVED (1 << 4) | (1 << 2)
275#define ADBMS1818_WRPWM_RESERVED (1 << 5)
276#define ADBMS1818_WRPSB_RESERVED (1 << 4) | (1 << 3) | (1 << 2)
277#define ADBMS1818_RDSCTRL_RESERVED (1 << 4) | (1 << 2) | (1 << 1)
278#define ADBMS1818_RDPWM_RESERVED (1 << 5) | (1 << 2)
279#define ADBMS1818_RDPSB_RESERVED (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1)
280#define ADBMS1818_STSCTRL_RESERVED (1 << 4) | (1 << 3) | (1 << 0)
281#define ADBMS1818_CLRSCTRL_RESERVED (1 << 4) | (1 << 3)
283#define ADBMS1818_ADCV_RESERVED ((1 << 9) | (1 << 6) | (1 << 5))
284#define ADBMS1818_ADOW_RESERVED ((1 << 3) | (1 << 5) | (1 << 9))
285#define ADBMS1818_CVST_RESERVED ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 9))
286#define ADBMS1818_ADAX_RESERVED (1 << 10) | (1 << 6) | (1 << 5)
287#define ADBMS1818_CLRCELL_RESERVED (1 << 0) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
288#define ADBMS1818_CLRAUX_RESERVED (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
289#define ADBMS1818_CLRSTAT_RESERVED (1 << 0) | (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
290#define ADBMS1818_PLADC_RESERVED (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
291#define ADBMS1818_DIAGN_RESERVED (1 << 0) | (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
292#define ADBMS1818_WRCOMM_RESERVED (1 << 0) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
293#define ADBMS1818_RDCOMM_RESERVED (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
294#define ADBMS1818_STCOMM_RESERVED (1 << 0) | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
295
300#define ADBMS1818_GPIO1_PD_ON (0 << 3)
301#define ADBMS1818_GPIO1_PD_OFF (1 << 3)
302#define ADBMS1818_GPIO2_PD_ON (0 << 4)
303#define ADBMS1818_GPIO2_PD_OFF (1 << 4)
304#define ADBMS1818_GPIO3_PD_ON (0 << 5)
305#define ADBMS1818_GPIO3_PD_OFF (1 << 5)
306#define ADBMS1818_GPIO4_PD_ON (0 << 6)
307#define ADBMS1818_GPIO4_PD_OFF (1 << 6)
308#define ADBMS1818_GPIO5_PD_ON (0 << 7)
309#define ADBMS1818_GPIO5_PD_OFF (1 << 7)
310#define ADBMS1818_GPIO6_PD_ON (0 << 0)
311#define ADBMS1818_GPIO6_PD_OFF (1 << 0)
312#define ADBMS1818_GPIO7_PD_ON (0 << 1)
313#define ADBMS1818_GPIO7_PD_OFF (1 << 1)
314#define ADBMS1818_GPIO8_PD_ON (0 << 2)
315#define ADBMS1818_GPIO8_PD_OFF (1 << 2)
316#define ADBMS1818_GPIO9_PD_ON (0 << 3)
317#define ADBMS1818_GPIO9_PD_OFF (1 << 3)
318
323#define ADBMS1818_CNVT_CELL_ALL 0x00
324#define ADBMS1818_CNVT_CELL_1_7_13 0x01
325#define ADBMS1818_CNVT_CELL_2_8_14 0x02
326#define ADBMS1818_CNVT_CELL_3_9_15 0x03
327#define ADBMS1818_CNVT_CELL_4_10_16 0x04
328#define ADBMS1818_CNVT_CELL_5_11_17 0x05
329#define ADBMS1818_CNVT_CELL_6_12_18 0x06
335#define ADBMS1818_ADCV_DISCHARGE_NOT_PERMITTED (0 << 4)
336#define ADBMS1818_ADCV_DISCHARGE_PERMITTED (1 << 4)
337
339#define ADBMS1818_ADAX_GPIO_ALL 0x00
340#define ADBMS1818_ADAX_GPIO1_6 0x01
341#define ADBMS1818_ADAX_GPIO2_7 0x02
342#define ADBMS1818_ADAX_GPIO3_8 0x03
343#define ADBMS1818_ADAX_GPIO4_9 0x04
344#define ADBMS1818_ADAX_GPIO5 0x05
345#define ADBMS1818_ADAX_REF2 0x06
346#define ADBMS1818_ADAX_MODE_FAST (0 << 8) | (1 << 7)
349#define ADBMS1818_ICOM_CSBM_LOW (1 << 3)
350#define ADBMS1818_ICOM_CSBM_FALL_EDGE (1 << 3) | (1 << 0)
351#define ADBMS1818_ICOM_CSBM_HIGH (1 << 3) | (1 << 1)
352#define ADBMS1818_ICOM_NO_TRANSMIT (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
355#define ADBMS1818_FCOM_CSBM_LOW (0 << 0)
356#define ADBMS1818_FCOM_CSBM_HIGH (1 << 3) | (1 << 0)
362#define ADBMS1818_PWMC_DC_100 100
363
AdbmsAfeDischargeTimeout
Discharge timeout options for the AFE.
Definition: adbms_afe_regs.h:106
AdbmsAfeVoltageRegister
Voltage registers for easy mapping to AdbmsAfeRegister
Definition: adbms_afe_regs.h:83
AdbsAfeAuxiliaryRegister
Aux registers for easy mapping to AdbmsAfeRegister
Definition: adbms_afe_regs.h:94
AdbmsAfeRegister
List of ADBMS AFE registers.
Definition: adbms_afe_regs.h:62
#define ADBMS1818_CMD_SIZE
Size of command code (2 bytes) + PEC (2 bytes)
Definition: adbms_afe_regs.h:40
#define ADBMS1818_NUM_COMM_REG_BYTES
3 bytes are required to send 24 clock cycles with our SPI driver for the STCOMM command
Definition: adbms_afe_regs.h:43
@ ADBMS_AFE_DISCHARGE_TIMEOUT_2_MIN
Definition: adbms_afe_regs.h:110
@ ADBMS_AFE_DISCHARGE_TIMEOUT_1_MIN
Definition: adbms_afe_regs.h:109
@ ADBMS_AFE_DISCHARGE_TIMEOUT_90_MIN
Definition: adbms_afe_regs.h:121
@ ADBMS_AFE_DISCHARGE_TIMEOUT_5_MIN
Definition: adbms_afe_regs.h:113
@ ADBMS_AFE_DISCHARGE_TIMEOUT_40_MIN
Definition: adbms_afe_regs.h:118
@ ADBMS_AFE_DISCHARGE_TIMEOUT_20_MIN
Definition: adbms_afe_regs.h:116
@ ADBMS_AFE_DISCHARGE_TIMEOUT_15_MIN
Definition: adbms_afe_regs.h:115
@ ADBMS_AFE_DISCHARGE_TIMEOUT_75_MIN
Definition: adbms_afe_regs.h:120
@ ADBMS_AFE_DISCHARGE_TIMEOUT_120_MIN
Definition: adbms_afe_regs.h:122
@ ADBMS_AFE_DISCHARGE_TIMEOUT_10_MIN
Definition: adbms_afe_regs.h:114
@ ADBMS_AFE_DISCHARGE_TIMEOUT_60_MIN
Definition: adbms_afe_regs.h:119
@ ADBMS_AFE_DISCHARGE_TIMEOUT_30_S
Definition: adbms_afe_regs.h:108
@ ADBMS_AFE_DISCHARGE_TIMEOUT_4_MIN
Definition: adbms_afe_regs.h:112
@ ADBMS_AFE_DISCHARGE_TIMEOUT_3_MIN
Definition: adbms_afe_regs.h:111
@ ADBMS_AFE_DISCHARGE_TIMEOUT_30_MIN
Definition: adbms_afe_regs.h:117
@ ADBMS_AFE_DISCHARGE_TIMEOUT_DISABLED
Definition: adbms_afe_regs.h:107
@ ADBMS_AFE_REGISTER_AUX_B
Definition: adbms_afe_regs.h:72
@ ADBMS_AFE_REGISTER_STATUS_A
Definition: adbms_afe_regs.h:75
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_F
Definition: adbms_afe_regs.h:70
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_B
Definition: adbms_afe_regs.h:66
@ ADBMS_AFE_REGISTER_AUX_D
Definition: adbms_afe_regs.h:74
@ ADBMS_AFE_REGISTER_AUX_A
Definition: adbms_afe_regs.h:71
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_C
Definition: adbms_afe_regs.h:67
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_D
Definition: adbms_afe_regs.h:68
@ ADBMS_AFE_REGISTER_READ_COMM
Definition: adbms_afe_regs.h:77
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_E
Definition: adbms_afe_regs.h:69
@ ADBMS_AFE_REGISTER_STATUS_B
Definition: adbms_afe_regs.h:76
@ ADBMS_AFE_REGISTER_CELL_VOLTAGE_A
Definition: adbms_afe_regs.h:65
@ ADBMS_AFE_REGISTER_CONFIG_B
Definition: adbms_afe_regs.h:64
@ NUM_ADBMS_AFE_REGISTERS
Definition: adbms_afe_regs.h:79
@ ADBMS_AFE_REGISTER_AUX_C
Definition: adbms_afe_regs.h:73
@ ADBMS_AFE_REGISTER_CONFIG_A
Definition: adbms_afe_regs.h:63
@ ADBMS_AFE_REGISTER_START_COMM
Definition: adbms_afe_regs.h:78
Configuration for the AFE configuration register group A (CFGRA).
Definition: adbms_afe_regs.h:138
uint8_t discharge_bitset
Definition: adbms_afe_regs.h:169
uint32_t overvoltage
Definition: adbms_afe_regs.h:146
uint8_t adcopt
Definition: adbms_afe_regs.h:139
uint8_t refon
Definition: adbms_afe_regs.h:141
uint16_t discharge_bitset
Definition: adbms_afe_regs.h:148
uint8_t gpio
Definition: adbms_afe_regs.h:143
uint8_t discharge_timer_monitor
Definition: adbms_afe_regs.h:170
uint32_t undervoltage
Definition: adbms_afe_regs.h:145
uint8_t discharge_timeout
Definition: adbms_afe_regs.h:149
uint8_t force_fail
Definition: adbms_afe_regs.h:173
uint8_t mute
Definition: adbms_afe_regs.h:175
uint8_t dten
Definition: adbms_afe_regs.h:140
uint8_t path_select
Definition: adbms_afe_regs.h:172
Definition: adbms_afe_regs.h:232