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
97typedef enum {
115
129typedef struct {
130 uint8_t adcopt : 1;
131 uint8_t dten : 1;
132 uint8_t refon : 1;
134 uint8_t gpio : 5;
136 uint32_t undervoltage : 12;
137 uint32_t overvoltage : 12;
139 uint16_t discharge_bitset : 12;
140 uint8_t discharge_timeout : 4;
141} _PACKED AdbmsAfeConfigRegisterAData;
142static_assert(sizeof(AdbmsAfeConfigRegisterAData) == 6, "AdbmsAfeConfigRegisterAData must be 6 bytes");
143
157typedef struct {
158 uint8_t gpio : 4;
160 uint8_t discharge_bitset : 7;
163 uint8_t path_select : 2;
164 uint8_t force_fail : 1;
166 uint8_t mute : 1;
168 uint8_t reserved1;
169 uint8_t reserved2;
170 uint8_t reserved3;
171 uint8_t reserved4;
172} _PACKED AdbmsAfeConfigRegisterBData;
173static_assert(sizeof(AdbmsAfeConfigRegisterBData) == 6, "AdbmsAfeConfigRegisterBData must be 6 bytes");
174
183typedef struct {
184 uint8_t icom0 : 4;
185 uint8_t d0 : 8;
186 uint8_t fcom0 : 4;
187
188 uint8_t icom1 : 4;
189 uint8_t d1 : 8;
190 uint8_t fcom1 : 4;
191
192 uint8_t icom2 : 4;
193 uint8_t d2 : 8;
194 uint8_t fcom2 : 4;
195} _PACKED AdbmsAfeCommRegisterData;
196static_assert(sizeof(AdbmsAfeCommRegisterData) == 6, "AdbmsAfeCommRegisterData must be 6 bytes");
197
199typedef struct {
200 uint8_t wrcomm[ADBMS1818_CMD_SIZE];
201 AdbmsAfeCommRegisterData reg;
202 uint8_t pec;
203} _PACKED AdbmsAfeWriteCommRegPacket;
204
206typedef struct {
207 uint8_t stcomm[ADBMS1818_CMD_SIZE];
208 uint8_t clk[ADBMS1818_NUM_COMM_REG_BYTES];
209} _PACKED AdbmsAfeSendCommRegPacket;
210
212typedef struct {
213 AdbmsAfeConfigRegisterAData cfg;
214 uint16_t pec;
215} _PACKED AdbmsAfeWriteConfigAPacket;
216
218typedef struct {
219 AdbmsAfeConfigRegisterBData cfg;
220 uint16_t pec;
221} _PACKED AdbmsAfeWriteConfigBPacket;
222
223typedef union {
224 uint16_t voltages[3];
225 uint8_t values[6];
227static_assert(sizeof(AdbmsAfeRegisterData) == 6, "AdbmsAfeRegisterData must be 6 bytes");
228
229typedef struct {
231 uint16_t pec;
232} _PACKED AdbmsAfeVoltageData;
233static_assert(sizeof(AdbmsAfeVoltageData) == 8, "AdbmsAfeVoltageData must be 8 bytes");
234
235typedef struct {
237 uint16_t pec;
238} _PACKED AdbmsAfeAuxData;
239static_assert(sizeof(AdbmsAfeAuxData) == 8, "AdbmsAfeAuxData must be 8 bytes");
240
245#define ADBMS1818_WRCFGA_RESERVED (1 << 0)
246#define ADBMS1818_WRCFGB_RESERVED (1 << 5) | (1 << 2)
247#define ADBMS1818_RDCFGA_RESERVED (1 << 1)
248#define ADBMS1818_RDCFGB_RESERVED (1 << 5) | (1 << 2) | (1 << 1)
250#define ADBMS1818_RDCVA_RESERVED (1 << 2)
251#define ADBMS1818_RDCVB_RESERVED (1 << 2) | (1 << 1)
252#define ADBMS1818_RDCVC_RESERVED (1 << 3)
253#define ADBMS1818_RDCVD_RESERVED (1 << 3) | (1 << 1)
254#define ADBMS1818_RDCVE_RESERVED (1 << 3) | (1 << 0)
255#define ADBMS1818_RDCVF_RESERVED (1 << 3) | (1 << 1) | (1 << 0)
257#define ADBMS1818_RDAUXA_RESERVED ((1 << 3) | (1 << 2))
258#define ADBMS1818_RDAUXB_RESERVED ((1 << 3) | (1 << 2)) | (1 << 1)
259#define ADBMS1818_RDAUXC_RESERVED ((1 << 3) | (1 << 2)) | (1 << 0)
260#define ADBMS1818_RDAUXD_RESERVED ((1 << 3) | (1 << 2)) | (1 << 1) | (1 << 0)
262#define ADBMS1818_RDSTATA_RESERVED (1 << 4)
263#define ADBMS1818_RDSTATB_RESERVED (1 << 4) | (1 << 1)
265#define ADBMS1818_WRSCTRL_RESERVED (1 << 4) | (1 << 2)
266#define ADBMS1818_WRPWM_RESERVED (1 << 5)
267#define ADBMS1818_WRPSB_RESERVED (1 << 4) | (1 << 3) | (1 << 2)
268#define ADBMS1818_RDSCTRL_RESERVED (1 << 4) | (1 << 2) | (1 << 1)
269#define ADBMS1818_RDPWM_RESERVED (1 << 5) | (1 << 2)
270#define ADBMS1818_RDPSB_RESERVED (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1)
271#define ADBMS1818_STSCTRL_RESERVED (1 << 4) | (1 << 3) | (1 << 0)
272#define ADBMS1818_CLRSCTRL_RESERVED (1 << 4) | (1 << 3)
274#define ADBMS1818_ADCV_RESERVED ((1 << 9) | (1 << 6) | (1 << 5))
275#define ADBMS1818_ADOW_RESERVED ((1 << 3) | (1 << 5) | (1 << 9))
276#define ADBMS1818_CVST_RESERVED ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 9))
277#define ADBMS1818_ADAX_RESERVED (1 << 10) | (1 << 6) | (1 << 5)
278#define ADBMS1818_CLRCELL_RESERVED (1 << 0) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
279#define ADBMS1818_CLRAUX_RESERVED (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
280#define ADBMS1818_CLRSTAT_RESERVED (1 << 0) | (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
281#define ADBMS1818_PLADC_RESERVED (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
282#define ADBMS1818_DIAGN_RESERVED (1 << 0) | (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
283#define ADBMS1818_WRCOMM_RESERVED (1 << 0) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
284#define ADBMS1818_RDCOMM_RESERVED (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
285#define ADBMS1818_STCOMM_RESERVED (1 << 0) | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
286
291#define ADBMS1818_GPIO1_PD_ON (0 << 3)
292#define ADBMS1818_GPIO1_PD_OFF (1 << 3)
293#define ADBMS1818_GPIO2_PD_ON (0 << 4)
294#define ADBMS1818_GPIO2_PD_OFF (1 << 4)
295#define ADBMS1818_GPIO3_PD_ON (0 << 5)
296#define ADBMS1818_GPIO3_PD_OFF (1 << 5)
297#define ADBMS1818_GPIO4_PD_ON (0 << 6)
298#define ADBMS1818_GPIO4_PD_OFF (1 << 6)
299#define ADBMS1818_GPIO5_PD_ON (0 << 7)
300#define ADBMS1818_GPIO5_PD_OFF (1 << 7)
301#define ADBMS1818_GPIO6_PD_ON (0 << 0)
302#define ADBMS1818_GPIO6_PD_OFF (1 << 0)
303#define ADBMS1818_GPIO7_PD_ON (0 << 1)
304#define ADBMS1818_GPIO7_PD_OFF (1 << 1)
305#define ADBMS1818_GPIO8_PD_ON (0 << 2)
306#define ADBMS1818_GPIO8_PD_OFF (1 << 2)
307#define ADBMS1818_GPIO9_PD_ON (0 << 3)
308#define ADBMS1818_GPIO9_PD_OFF (1 << 3)
309
314#define ADBMS1818_CNVT_CELL_ALL 0x00
315#define ADBMS1818_CNVT_CELL_1_7_13 0x01
316#define ADBMS1818_CNVT_CELL_2_8_14 0x02
317#define ADBMS1818_CNVT_CELL_3_9_15 0x03
318#define ADBMS1818_CNVT_CELL_4_10_16 0x04
319#define ADBMS1818_CNVT_CELL_5_11_17 0x05
320#define ADBMS1818_CNVT_CELL_6_12_18 0x06
326#define ADBMS1818_ADCV_DISCHARGE_NOT_PERMITTED (0 << 4)
327#define ADBMS1818_ADCV_DISCHARGE_PERMITTED (1 << 4)
328
330#define ADBMS1818_ADAX_GPIO_ALL 0x00
331#define ADBMS1818_ADAX_GPIO1_6 0x01
332#define ADBMS1818_ADAX_GPIO2_7 0x02
333#define ADBMS1818_ADAX_GPIO3_8 0x03
334#define ADBMS1818_ADAX_GPIO4_9 0x04
335#define ADBMS1818_ADAX_GPIO5 0x05
336#define ADBMS1818_ADAX_REF2 0x06
337#define ADBMS1818_ADAX_MODE_FAST (0 << 8) | (1 << 7)
340#define ADBMS1818_ICOM_CSBM_LOW (1 << 3)
341#define ADBMS1818_ICOM_CSBM_FALL_EDGE (1 << 3) | (1 << 0)
342#define ADBMS1818_ICOM_CSBM_HIGH (1 << 3) | (1 << 1)
343#define ADBMS1818_ICOM_NO_TRANSMIT (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
346#define ADBMS1818_FCOM_CSBM_LOW (0 << 0)
347#define ADBMS1818_FCOM_CSBM_HIGH (1 << 3) | (1 << 0)
353#define ADBMS1818_PWMC_DC_100 (0xF)
354
AdbmsAfeDischargeTimeout
Discharge timeout options for the AFE.
Definition: adbms_afe_regs.h:97
AdbmsAfeVoltageRegister
Voltage registers for easy mapping to AdbmsAfeRegister
Definition: adbms_afe_regs.h:83
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:101
@ ADBMS_AFE_DISCHARGE_TIMEOUT_1_MIN
Definition: adbms_afe_regs.h:100
@ ADBMS_AFE_DISCHARGE_TIMEOUT_90_MIN
Definition: adbms_afe_regs.h:112
@ ADBMS_AFE_DISCHARGE_TIMEOUT_5_MIN
Definition: adbms_afe_regs.h:104
@ ADBMS_AFE_DISCHARGE_TIMEOUT_40_MIN
Definition: adbms_afe_regs.h:109
@ ADBMS_AFE_DISCHARGE_TIMEOUT_20_MIN
Definition: adbms_afe_regs.h:107
@ ADBMS_AFE_DISCHARGE_TIMEOUT_15_MIN
Definition: adbms_afe_regs.h:106
@ ADBMS_AFE_DISCHARGE_TIMEOUT_75_MIN
Definition: adbms_afe_regs.h:111
@ ADBMS_AFE_DISCHARGE_TIMEOUT_120_MIN
Definition: adbms_afe_regs.h:113
@ ADBMS_AFE_DISCHARGE_TIMEOUT_10_MIN
Definition: adbms_afe_regs.h:105
@ ADBMS_AFE_DISCHARGE_TIMEOUT_60_MIN
Definition: adbms_afe_regs.h:110
@ ADBMS_AFE_DISCHARGE_TIMEOUT_30_S
Definition: adbms_afe_regs.h:99
@ ADBMS_AFE_DISCHARGE_TIMEOUT_4_MIN
Definition: adbms_afe_regs.h:103
@ ADBMS_AFE_DISCHARGE_TIMEOUT_3_MIN
Definition: adbms_afe_regs.h:102
@ ADBMS_AFE_DISCHARGE_TIMEOUT_30_MIN
Definition: adbms_afe_regs.h:108
@ ADBMS_AFE_DISCHARGE_TIMEOUT_DISABLED
Definition: adbms_afe_regs.h:98
@ 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:129
uint8_t discharge_bitset
Definition: adbms_afe_regs.h:160
uint32_t overvoltage
Definition: adbms_afe_regs.h:137
uint8_t adcopt
Definition: adbms_afe_regs.h:130
uint8_t refon
Definition: adbms_afe_regs.h:132
uint16_t discharge_bitset
Definition: adbms_afe_regs.h:139
uint8_t gpio
Definition: adbms_afe_regs.h:134
uint8_t discharge_timer_monitor
Definition: adbms_afe_regs.h:161
uint32_t undervoltage
Definition: adbms_afe_regs.h:136
uint8_t discharge_timeout
Definition: adbms_afe_regs.h:140
uint8_t force_fail
Definition: adbms_afe_regs.h:164
uint8_t mute
Definition: adbms_afe_regs.h:166
uint8_t dten
Definition: adbms_afe_regs.h:131
uint8_t path_select
Definition: adbms_afe_regs.h:163
Definition: adbms_afe_regs.h:223