Midnight Sun Firmware
Loading...
Searching...
No Matches
ltc_afe_regs.h
1#pragma once
2
3/************************************************************************************************
4 * @file ltc_afe_regs.h
5 *
6 * @brief Header file to define the LTC8611 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 LTC6811_CELLS_IN_REG 3
34#define LTC6811_GPIOS_IN_REG 3
35
37#define AUX_ADG731_NUM_PINS 32
38
40#define LTC6811_CMD_SIZE 4
41
43#define LTC6811_NUM_COMM_REG_BYTES 3
44
46#define LTC8611_NUM_PWM_REGS 6
47
49#define LTC_AFE_MAX_CELLS_PER_DEVICE 12
54typedef enum {
68
70typedef enum {
71 LTC_AFE_VOLTAGE_REGISTER_A = LTC_AFE_REGISTER_CELL_VOLTAGE_A,
72 LTC_AFE_VOLTAGE_REGISTER_B = LTC_AFE_REGISTER_CELL_VOLTAGE_B,
73 LTC_AFE_VOLTAGE_REGISTER_C = LTC_AFE_REGISTER_CELL_VOLTAGE_C,
74 LTC_AFE_VOLTAGE_REGISTER_D = LTC_AFE_REGISTER_CELL_VOLTAGE_D,
75 NUM_LTC_AFE_VOLTAGE_REGISTERS
77
82typedef enum {
100
114typedef struct {
115 uint8_t adcopt : 1;
116 uint8_t dten : 1;
117 uint8_t refon : 1;
119 uint8_t gpio : 5;
121 uint32_t undervoltage : 12;
122 uint32_t overvoltage : 12;
124 uint16_t discharge_bitset : 12;
125 uint8_t discharge_timeout : 4;
126} _PACKED LtcAfeConfigRegisterData;
127static_assert(sizeof(LtcAfeConfigRegisterData) == 6, "LtcAfeConfigRegisterData must be 6 bytes");
128
137typedef struct {
138 uint8_t icom0 : 4;
139 uint8_t d0 : 8;
140 uint8_t fcom0 : 4;
141
142 uint8_t icom1 : 4;
143 uint8_t d1 : 8;
144 uint8_t fcom1 : 4;
145
146 uint8_t icom2 : 4;
147 uint8_t d2 : 8;
148 uint8_t fcom2 : 4;
149} _PACKED LtcAfeCommRegisterData;
150static_assert(sizeof(LtcAfeCommRegisterData) == 6, "LtcAfeCommRegisterData must be 6 bytes");
151
153typedef struct {
154 uint8_t wrcomm[LTC6811_CMD_SIZE];
155 LtcAfeCommRegisterData reg;
156 uint8_t pec;
157} _PACKED LtcAfeWriteCommRegPacket;
158
160typedef struct {
161 uint8_t stcomm[LTC6811_CMD_SIZE];
162 uint8_t clk[LTC6811_NUM_COMM_REG_BYTES];
163} _PACKED LtcAfeSendCommRegPacket;
164
166typedef struct {
167 LtcAfeConfigRegisterData reg;
168 uint16_t pec;
169} _PACKED LtcAfeWriteDeviceConfigPacket;
170
174typedef struct {
175 uint8_t wrcfg[LTC6811_CMD_SIZE];
177 LtcAfeWriteDeviceConfigPacket devices[LTC_AFE_MAX_CELLS_PER_DEVICE];
178} _PACKED LtcAfeWriteConfigPacket;
179#define SIZEOF_LTC_AFE_WRITE_CONFIG_PACKET(devices) (LTC6811_CMD_SIZE + (devices) * sizeof(LtcAfeWriteDeviceConfigPacket))
180
181typedef union {
182 uint16_t voltages[3];
183 uint8_t values[6];
185static_assert(sizeof(LtcAfeRegisterData) == 6, "LtcAfeRegisterData must be 6 bytes");
186
187typedef struct {
189 uint16_t pec;
190} _PACKED LtcAfeVoltageData;
191static_assert(sizeof(LtcAfeVoltageData) == 8, "LtcAfeVoltageData must be 8 bytes");
192
193typedef struct {
195 uint16_t pec;
196} _PACKED LtcAfeAuxData;
197static_assert(sizeof(LtcAfeAuxData) == 8, "LtcAfeAuxData must be 8 bytes");
198
203#define LTC6811_WRCFG_RESERVED (1 << 0)
204#define LTC6811_RDCFG_RESERVED (1 << 1)
205#define LTC6811_RDCVA_RESERVED (1 << 2)
206#define LTC6811_RDCVB_RESERVED (1 << 2) | (1 << 1)
207#define LTC6811_RDCVC_RESERVED (1 << 3)
208#define LTC6811_RDCVD_RESERVED (1 << 3) | (1 << 1)
209#define LTC6811_RDAUXA_RESERVED ((1 << 3) | (1 << 2))
210#define LTC6811_RDAUXB_RESERVED ((1 << 3) | (1 << 2)) | (1 << 1)
211#define LTC6811_RDSTATA_RESERVED (1 << 4)
212#define LTC6811_RDSTATB_RESERVED (1 << 4) | (1 << 1)
213#define LTC6811_ADCV_RESERVED ((1 << 9) | (1 << 6) | (1 << 5))
214#define LTC6811_ADOW_RESERVED ((1 << 3) | (1 << 5) | (1 << 9))
215#define LTC6811_CVST_RESERVED ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 9))
216#define LTC6811_ADAX_RESERVED (1 << 10) | (1 << 6) | (1 << 5)
217#define LTC6811_CLRCELL_RESERVED (1 << 0) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
218#define LTC6811_CLRAUX_RESERVED (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
219#define LTC6811_CLRSTAT_RESERVED (1 << 0) | (1 << 1) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
220#define LTC6811_PLADC_RESERVED (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
221#define LTC6811_DIAGN_RESERVED (1 << 0) | (1 << 2) | (1 << 4) | (1 << 8) | (1 << 9) | (1 << 10)
222#define LTC6811_WRCOMM_RESERVED (1 << 0) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
223#define LTC6811_RDCOMM_RESERVED (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
224#define LTC6811_STCOMM_RESERVED (1 << 0) | (1 << 1) | (1 << 5) | (1 << 8) | (1 << 9) | (1 << 10)
225#define LTC6811_WRPWM_RESERVED (1 << 5)
226#define LTC6811_RDPWM_RESERVED (1 << 5) | (1 << 2)
232#define LTC6811_GPIO1_PD_ON (0 << 3)
233#define LTC6811_GPIO1_PD_OFF (1 << 3)
234#define LTC6811_GPIO2_PD_ON (0 << 4)
235#define LTC6811_GPIO2_PD_OFF (1 << 4)
236#define LTC6811_GPIO3_PD_ON (0 << 5)
237#define LTC6811_GPIO3_PD_OFF (1 << 5)
238#define LTC6811_GPIO4_PD_ON (0 << 6)
239#define LTC6811_GPIO4_PD_OFF (1 << 6)
240#define LTC6811_GPIO5_PD_ON (0 << 7)
241#define LTC6811_GPIO5_PD_OFF (1 << 7)
242
247#define LTC6811_CNVT_CELL_ALL 0x00
248#define LTC6811_CNVT_CELL_1_7 0x01
249#define LTC6811_CNVT_CELL_2_8 0x02
250#define LTC6811_CNVT_CELL_3_9 0x03
251#define LTC6811_CNVT_CELL_4_10 0x04
252#define LTC6811_CNVT_CELL_5_11 0x05
253#define LTC6811_CNVT_CELL_6_12 0x06
259#define LTC6811_ADCV_DISCHARGE_NOT_PERMITTED (0 << 4)
260#define LTC6811_ADCV_DISCHARGE_PERMITTED (1 << 4)
261
263#define LTC6811_ADAX_GPIO1 0x01
264#define LTC6811_ADAX_GPIO4 0x04
265#define LTC6811_ADAX_MODE_FAST (0 << 8) | (1 << 7)
268#define LTC6811_ICOM_CSBM_LOW (1 << 3)
269#define LTC6811_ICOM_CSBM_FALL_EDGE (1 << 3) | (1 << 0)
270#define LTC6811_ICOM_CSBM_HIGH (1 << 3) | (1 << 1)
271#define LTC6811_ICOM_NO_TRANSMIT (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
274#define LTC6811_FCOM_CSBM_LOW (0 << 0)
275#define LTC6811_FCOM_CSBM_HIGH (1 << 3) | (1 << 0)
281#define LTC6811_PWMC_DC_100 (0xF)
282
LtcAfeRegister
List of LTC AFE registers.
Definition: ltc_afe_regs.h:54
#define LTC_AFE_MAX_CELLS_PER_DEVICE
Number of voltage cells connected to each device.
Definition: ltc_afe_regs.h:49
#define LTC6811_NUM_COMM_REG_BYTES
3 bytes are required to send 24 clock cycles with our SPI driver for the STCOMM command
Definition: ltc_afe_regs.h:43
#define LTC6811_CMD_SIZE
Size of command code (2 bytes) + PEC (2 bytes)
Definition: ltc_afe_regs.h:40
LtcAfeVoltageRegister
Voltage registers for easy mapping to LtcAfeRegister
Definition: ltc_afe_regs.h:70
LtcAfeDischargeTimeout
Discharge timeout options for the AFE.
Definition: ltc_afe_regs.h:82
@ LTC_AFE_REGISTER_AUX_B
Definition: ltc_afe_regs.h:61
@ LTC_AFE_REGISTER_CONFIG
Definition: ltc_afe_regs.h:55
@ LTC_AFE_REGISTER_CELL_VOLTAGE_C
Definition: ltc_afe_regs.h:58
@ LTC_AFE_REGISTER_STATUS_B
Definition: ltc_afe_regs.h:63
@ LTC_AFE_REGISTER_START_COMM
Definition: ltc_afe_regs.h:65
@ LTC_AFE_REGISTER_CELL_VOLTAGE_B
Definition: ltc_afe_regs.h:57
@ LTC_AFE_REGISTER_CELL_VOLTAGE_D
Definition: ltc_afe_regs.h:59
@ LTC_AFE_REGISTER_STATUS_A
Definition: ltc_afe_regs.h:62
@ LTC_AFE_REGISTER_READ_COMM
Definition: ltc_afe_regs.h:64
@ LTC_AFE_REGISTER_CELL_VOLTAGE_A
Definition: ltc_afe_regs.h:56
@ NUM_LTC_AFE_REGISTERS
Definition: ltc_afe_regs.h:66
@ LTC_AFE_REGISTER_AUX_A
Definition: ltc_afe_regs.h:60
@ LTC_AFE_DISCHARGE_TIMEOUT_10_MIN
Definition: ltc_afe_regs.h:90
@ LTC_AFE_DISCHARGE_TIMEOUT_15_MIN
Definition: ltc_afe_regs.h:91
@ LTC_AFE_DISCHARGE_TIMEOUT_120_MIN
Definition: ltc_afe_regs.h:98
@ LTC_AFE_DISCHARGE_TIMEOUT_30_MIN
Definition: ltc_afe_regs.h:93
@ LTC_AFE_DISCHARGE_TIMEOUT_30_S
Definition: ltc_afe_regs.h:84
@ LTC_AFE_DISCHARGE_TIMEOUT_60_MIN
Definition: ltc_afe_regs.h:95
@ LTC_AFE_DISCHARGE_TIMEOUT_1_MIN
Definition: ltc_afe_regs.h:85
@ LTC_AFE_DISCHARGE_TIMEOUT_75_MIN
Definition: ltc_afe_regs.h:96
@ LTC_AFE_DISCHARGE_TIMEOUT_20_MIN
Definition: ltc_afe_regs.h:92
@ LTC_AFE_DISCHARGE_TIMEOUT_DISABLED
Definition: ltc_afe_regs.h:83
@ LTC_AFE_DISCHARGE_TIMEOUT_2_MIN
Definition: ltc_afe_regs.h:86
@ LTC_AFE_DISCHARGE_TIMEOUT_5_MIN
Definition: ltc_afe_regs.h:89
@ LTC_AFE_DISCHARGE_TIMEOUT_4_MIN
Definition: ltc_afe_regs.h:88
@ LTC_AFE_DISCHARGE_TIMEOUT_3_MIN
Definition: ltc_afe_regs.h:87
@ LTC_AFE_DISCHARGE_TIMEOUT_90_MIN
Definition: ltc_afe_regs.h:97
@ LTC_AFE_DISCHARGE_TIMEOUT_40_MIN
Definition: ltc_afe_regs.h:94
Configuration for the AFE configuration register group (CFGR).
Definition: ltc_afe_regs.h:114
uint32_t overvoltage
Definition: ltc_afe_regs.h:122
uint8_t adcopt
Definition: ltc_afe_regs.h:115
uint8_t refon
Definition: ltc_afe_regs.h:117
uint16_t discharge_bitset
Definition: ltc_afe_regs.h:124
uint8_t gpio
Definition: ltc_afe_regs.h:119
uint32_t undervoltage
Definition: ltc_afe_regs.h:121
uint8_t discharge_timeout
Definition: ltc_afe_regs.h:125
uint8_t dten
Definition: ltc_afe_regs.h:116
Definition: ltc_afe_regs.h:181