Midnight Sun Firmware
Loading...
Searching...
No Matches
current_ads122c14irter.h
1#pragma once
2
3/************************************************************************************************
4 * @file current_ads122c14iter.h
5 *
6 * @brief Header file to implement the current sensing from the ADS122C14ITER ADC
7 *
8 * @date 2026-06-16
9 * @author Midnight Sun Team #24 - MSXVI
10 ************************************************************************************************/
11
12/* Standard library Headers */
13#include <stdbool.h>
14#include <stdint.h>
15
16/* Inter-component Headers */
17#include "gpio.h"
18#include "i2c.h"
19#include "status.h"
20
21/* Intra-component Headers */
22
29#define _PACKED __attribute__((packed))
30
31#define ADS122_NUM_REG 16U
32
33/*ADS122_REG_STATUS_MSB*/
34#define ADS122_RESETn_BITOFFSET 7
35#define ADS122_RESETn_MASK (1 << 7)
36
37#define ADS122_AVDD_UV_BITOFFSET 6
38#define ADS122_AVDD_UV_MASK (1 << 6)
39
40#define ADS122_REF_UV_BITOFFSET 5
41#define ADS122_REF_UV_MASK (1 << 5)
42
43#define ADS122_REG_MAP_CRC_FAULT_BITOFFSET 3
44#define ADS122_REG_MAP_CRC_FAULT_MASK (1 << 3)
45
46#define ADS122_MEM_FAULT_BITOFFSET 2
47#define ADS122_MEM_FAULT_MASK (1 << 2)
48
49#define ADS122_REG_WRITE_FAULT_BITOFFSET 1
50#define ADS122_REG_WRITE_FAULT_MASK (1 << 1)
51
52#define ADS122_DRDY_BITOFFSET 0
53#define ADS122_DRDY_MASK (1 << 0)
54
55/* ADS122_REG_STATUS_LSB*/
56#define ADS122_CONV_COUNT_BITOFFSET 4 // should this be 4 or 7
57#define ADS122_CONV_COUNT_MASK (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4)
58
59#define ADS122_GPIO3_DAT_IN_BITOFFSET 3
60#define ADS122_GPIO3_DAT_IN_MASK (1 << 3)
61
62#define ADS122_GPIO2_DAT_IN_BITOFFSET 2
63#define ADS122_GPIO2_DAT_IN_MASK (1 << 2)
64
65#define ADS122_GPIO1_DAT_IN_BITOFFSET 1
66#define ADS122_GPIO1_DAT_IN_MASK (1 << 1)
67
68#define ADS122_GPIO0_DAT_IN_BITOFFSET 0
69#define ADS122_GPIO0_DAT_IN_MASK (1 << 0)
70
71/*ADS122_REG_CONVERSION_CTRL*/
72#define ADS122_RESET_BITOFFSET 2
73#define ADS122_RESET_MASK (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2)
74
75#define ADS122_START_BITOFFSET 1
76#define ADS122_START_MASK (1 << 1)
77
78#define ADS122_STOP_BITOFFSET 0
79#define ADS122_STOP_MASK (1 << 0)
80
81/*ADS122_REG_DEVICE_CFG*/
82// which speed??
83#define ADS122_REG_DEVICE_CFG_DEFAULT ((uint8_t)0x04)
84
85#define ADS122_PWDN_BITOFFSET 7
86#define ADS122_PWDN_MASK (1 << 7)
87
88#define ADS122_STBY_MODE_BITOFFSET 6
89#define ADS122_STBY_MODE_MASK (1 << 6)
90
91#define ADS122_BOCS_BITOFFSET 4
92#define ADS122_BOCS_MASK (1 << 5) | (1 << 4)
93
94#define ADS122_CLK_SEL_BITOFFSET 3
95#define ADS122_CLK_SEL_MASK (1 << 3)
96
97#define ADS122_CONV_MODE_BITOFFSET 2
98#define ADS122_CONV_MODE_MASK (1 << 2)
99
100#define ADS122_SPEED_MODE_BITOFFSET 0
101#define ADS122_SPEED_MODE_MASK (1 << 1) | (1 << 0)
102
103/* ADS122_REG_DATA_RATE_CFG*/
104#define ADS122_REG_DATA_RATE_CFG_DEFAULT ((uint8_t)0x00)
105
106#define ADS122_DELAY_BITOFFSET 4
107#define ADS122_DELAY_MASK (1 << 7) | (1 << 6) || (1 << 5) || (1 << 4)
108
109#define ADS122_GC_EN_BITOFFSET 3
110#define ADS122_GC_EN_MASK (1 << 3)
111
112#define ADS122_FLTR_OSR_BITOFFSET 0
113#define ADS122_FLTR_OSR_MASK (1 << 2) | (1 << 1) | (1 << 0)
114
115/* ADS122_REG_MUX_CFG*/
116#define ADS122_REG_MUX_CFG_DEFAULT ((uint8_t)0x00)
117
118#define ADS122_AINP_BITOFFSET 4
119#define ADS122_AINP_MASK (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4)
120
121#define ADS122_AINN_BITOFFSET 0
122#define ADS122_AINN_MASK (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
123
124/*ADS122_REG_GAIN_CFG*/
125#define ADS122_REG_GAIN_CFG_DEFAULT ((uint8_t)0x00)
126
127#define ADS122_SYS_MON_BITOFFSET 4
128#define ADS122_SYS_MON_MASK (1 << 6) | (1 << 5) | (1 << 4)
129
130#define ADS122_GAIN_BITOFFSET 0
131#define ADS122_GAIN_MASK (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
132
133/*ADS122_REG_REFERENCE_CFG */
134#define ADS122_REG_REFERENCE_CFG_DEFAULT ((uint8_t)0x00)
135
136#define ADS122_REF_UV_EN_BITOFFSET 7
137#define ADS122_REF_UV_EN_MASK (1 << 7)
138
139#define ADS122_REFP_BUF_EN_BITOFFSET 5
140#define ADS122_REFP_BUF_EN_MASK (1 << 5)
141
142#define ADS122_REFN_BUF_EN_BITOFFSET 4
143#define ADS122_REFN_BUF_EN_MASK (1 << 4)
144
145#define ADS122_REF_VAL_BITOFFSET 2
146#define ADS122_REF_VAL_MASK (1 << 2)
147
148#define ADS122_REF_SEL_BITOFFSET 0
149#define ADS122_REF_SEL_MASK (1 << 1) | (1 << 0)
150
151/*ADS122_REG_DIGITAL_CFG*/
152#define ADS122_REG_DIGITAL_CFG_DEFAULT ((uint8_t)0x00)
153
154#define ADS122_REG_MAP_CRC_EN_BITOFFSET 6
155#define ADS122_REG_MAP_CRC_EN_MASK (1 << 6)
156
157#define ADS122_I2C_CRC_EN_BITOFFSET 5
158#define ADS122_I2C_CRC_EN_MASK (1 << 5)
159
160#define ADS122_STATUS_EN_BITOFFSET 4
161#define ADS122_STATUS_EN_MASK (1 << 4)
162
163#define ADS122_FAULT_PIN_BEHAVIOR_BITOFFSET 3
164#define ADS122_FAULT_PIN_BEHAVIOR_MASK (1 << 3)
165
166#define ADS122_CODING_BITOFFSET 1
167#define ADS122_CODING_MASK (1 << 1)
168
169/*ADS122_REG_GPIO_CFG*/
170#define ADS122_REG_GPIO_CFG_DEFAULT ((uint8_t)0x00)
171
172#define ADS122_GPIO3_CFG_BITOFFSET 6
173#define ADS122_GPIO3_CFG_MASK (1 << 7) | (1 << 6)
174
175#define ADS122_GPIO2_CFG_BITOFFSET 4
176#define ADS122_GPIO2_CFG_MASK (1 << 5) | (1 << 4)
177
178#define ADS122_GPIO1_CFG_BITOFFSET 2
179#define ADS122_GPIO1_CFGR_MASK (1 << 3) | (1 << 2)
180
181#define ADS122_GPIO0_CFG_BITOFFSET 0
182#define ADS122_GPIO0_CFG_MASK (1 << 1) | (1 << 0)
183
184/*ADS122_REG_GPIO_DATA_OUTPUT*/
185#define ADS122_REG_GPIO_DATA_OUTPUT_DEFAULT ((uint8_t)0x00)
186
187#define ADS122_GPIO3_SRC_BITOFFSET 7
188#define ADS122_GPIO3_SRC_MASK (1 << 7)
189
190#define ADS122_GPIO2_SRC_BITOFFSET 6
191#define ADS122_GPIO2_SRC_MASK (1 << 6)
192
193#define ADS122_GPIO3_DAT_OUT_BITOFFSET 3
194#define ADS122_GPIO3_DAT_OUT_MASK (1 << 3)
195
196#define ADS122_GPIO2_DAT_OUT_BITOFFSET 2
197#define ADS122_GPIO2_DAT_OUT_MASK (1 << 2)
198
199#define ADS122_GPIO1_DAT_OUT_BITOFFSET 1
200#define ADS122_GPIO1_DAT_OUT_MASK (1 << 1)
201
202#define ADS122_GPIO0_DAT_OUT_BITOFFSET 0
203#define ADS122_GPIO0_DAT_OUT_MASK (1 << 0)
204
205/*ADS122_REG_IDAC_MAG_CFG*/
206#define ADS122_REG_IDAC_MAG_CFG_DEFAULT ((uint8_t)0x00)
207
208#define ADS122_I2MAG_BITOFFSET 4
209#define ADS122_I2MAG_MASK (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4)
210
211#define ADS122_I1MAG_BITOFFSET 0
212#define ADS122_I1MAG_MASK (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)
213
214#define ADS122_IUNIT_Length 4
215
216/*ADS122_REG_IDAC_MUX_CFG*/
217#define ADS122_REG_IDAC_MUX_CFG_DEFAULT ((uint8_t)0x10)
218
219#define ADS122_IUNIT_BITOFFSET 7
220#define ADS122_IUNIT_MASK (1 << 7)
221
222#define ADS122_I2MUX_BITOFFSET 4
223#define ADS122_I2MUX_MASK (1 << 6) | (1 << 5) | (1 << 4)
224
225#define ADS122_I1MUX_BITOFFSET 0
226#define ADS122_I1MUX_MASK (1 << 2) | (1 << 1) | (1 << 0)
227
228/*ADS122_REG_REG_MAP_CRC*/
229#define ADS122_REG_REG_MAP_CRC_DEFAULT ((uint8_t)0x00)
230
231/*All registers of ADS122*/
232typedef enum {
233 ADS122_REG_DEVICE_ID = 0b00000000,
234 ADS122_REG_REVISION_ID = 0b00000001,
235 ADS122_REG_STATUS_MSB = 0b00000010,
236 ADS122_REG_STATUS_LSB = 0b00000011,
237 ADS122_REG_CONVERSION_CTRL = 0b00000100,
238 ADS122_REG_DEVICE_CFG = 0b00000101, /* Start init configs here*/
239 ADS122_REG_DATA_RATE_CFG = 0b00000110,
240 ADS122_REG_MUX_CFG = 0b00000111,
241 ADS122_REG_GAIN_CFG = 0b00001000,
242 ADS122_REG_REFERENCE_CFG = 0b00001001,
243 ADS122_REG_DIGITAL_CFG = 0b00001010,
244 ADS122_REG_GPIO_CFG = 0b00001011,
245 ADS122_REG_GPIO_DATA_OUTPUT = 0b00001100,
246 ADS122_REG_IDAC_MAG_CFG = 0b00001101,
247 ADS122_REG_IDAC_MUX_CFG = 0b00001110,
248 ADS122_REG_REG_MAP_CRC = 0b00001111,
249} ADS122C14ITER_Register;
250
251/*Commands*/
252typedef enum {
253 ADS122_WRITE_COMMAND = 0b10000000,
254 ADS122_READ_COMMAND = 0b01000000,
255 ADS122_READ_CONVERSION_COMMAND = 0b00000000,
256} ADS122C14ITER_Command;
257
258typedef struct {
259 I2CPort i2c_port;
260 I2CAddress i2c_address;
261 I2CSettings i2c_settings;
263
264/*All config registers*/
265static uint8_t ADS122_CONFIG_REGISTERS[] = { ADS122_REG_DEVICE_CFG, ADS122_REG_DATA_RATE_CFG, ADS122_REG_MUX_CFG, ADS122_REG_GAIN_CFG, ADS122_REG_REFERENCE_CFG, ADS122_REG_DIGITAL_CFG,
266 ADS122_REG_GPIO_CFG, ADS122_REG_GPIO_DATA_OUTPUT, ADS122_REG_IDAC_MAG_CFG, ADS122_REG_IDAC_MUX_CFG, ADS122_REG_REG_MAP_CRC };
267
274StatusCode ads122_get_conversion_data(ADS122Storage *storage, uint8_t rx_data[]);
275
285StatusCode ads122_init(ADS122Storage *storage, I2CPort i2c_port_storage, I2CAddress i2c_address_storage, uint8_t register_map[], I2CSettings *i2c_settings_storage);
286
293
300StatusCode ads122_change_MUX(ADS122Storage *storage, uint8_t MUX_CFG);
301
StatusCode ads122_change_MUX(ADS122Storage *storage, uint8_t MUX_CFG)
Change the MUX of the ADS122 driver.
Definition: current_ads122c14irter.c:92
StatusCode ads122_get_conversion_data(ADS122Storage *storage, uint8_t rx_data[])
Get the conversion data.
Definition: current_ads122c14irter.c:131
StatusCode ads122_start_conversion(ADS122Storage *storage)
Start the conversion of the ADS122 driver.
Definition: current_ads122c14irter.c:78
StatusCode ads122_init(ADS122Storage *storage, I2CPort i2c_port_storage, I2CAddress i2c_address_storage, uint8_t register_map[], I2CSettings *i2c_settings_storage)
Initialize the ADS122 driver.
Definition: current_ads122c14irter.c:97
uint8_t I2CAddress
I2C address type.
Definition: i2c.h:34
I2CPort
I2C Port selection.
Definition: i2c.h:37
StatusCode
StatusCodes for various errors.
Definition: status.h:27
Definition: current_ads122c14irter.h:258
I2C settings struct.
Definition: i2c.h:56