2020-2021 Sunseeker Telemetry and Lighting System
sd24_b.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
3 // sd24_b.c - Driver for the sd24_b Module.
4 //
5 //*****************************************************************************
6 
7 //*****************************************************************************
8 //
11 //
12 //*****************************************************************************
13 
14 #include "inc/hw_memmap.h"
15 
16 #ifdef __MSP430_HAS_SD24_B__
17 #include "sd24_b.h"
18 
19 #include <assert.h>
20 
21 void SD24_B_init(uint16_t baseAddress, SD24_B_initParam *param)
22 {
23  // Reset all interrupts and flags
24  HWREG16(baseAddress + OFS_SD24BIE) &= 0x0000; //Reset ALL interrupt enables
25  HWREG16(baseAddress + OFS_SD24BIFG) &= 0x0000; //Reset ALL interrupt flags
26  HWREG16(baseAddress + OFS_SD24BTRGCTL) &= ~(SD24TRGIE | SD24TRGIFG);
27 
28  // Turn off all group conversions
29  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24GRP0SC | SD24GRP1SC
30  | SD24GRP2SC | SD24GRP3SC);
31 
32  // Configure SD24_B
33  HWREG16(baseAddress + OFS_SD24BCTL0) &= ~((SD24DIV4 | SD24DIV3 | SD24DIV2
34  | SD24DIV1 | SD24DIV0) | SD24PDIV_7 | SD24SSEL_3 | SD24REFS);
35  HWREG16(baseAddress + OFS_SD24BCTL0) |= (param->clockSourceSelect |
36  param->clockPreDivider | param->clockDivider | param->referenceSelect);
37 
38  return;
39 }
40 
41 void SD24_B_initConverter(uint16_t baseAddress,
42  SD24_B_initConverterParam *param)
43 {
44  uint16_t address = baseAddress + (OFS_SD24BCCTL0 + (param->converter * 0x08));
45 
46  // Clearing previous settings for configuration
47  HWREG16(address) &= ~(SD24ALGN | SD24SNGL | SD24SCS__GROUP3);
48 
49  HWREG16(address) |= (param->alignment | param->startSelect |
50  (((uint16_t) param->conversionMode) << 8));
51 }
52 
53 void SD24_B_initConverterAdvanced(uint16_t baseAddress,
54  SD24_B_initConverterAdvancedParam *param)
55 {
56  // Getting correct SD24BCCTLx register
57  uint16_t address = baseAddress + (OFS_SD24BCCTL0 + (param->converter * 0x08));
58 
59  // Clearing previous settings for configuration
60  HWREG16(address) &= ~(SD24ALGN | SD24SNGL | SD24DF1 | SD24DF0 | SD24SCS__GROUP3 );
61 
62  HWREG16(address) |= (param->alignment | param->startSelect | param->dataFormat |
63  (((uint16_t) param->conversionMode) << 8));
64 
65  // Getting correct SDBINTCTLx register
66  address = baseAddress + (OFS_SD24BINCTL0 + (param->converter * 0x08));
67 
68  // Clearing previous settings for configuration
69  HWREG16(address) &= ~(SD24GAIN_128 | SD24INTDLY_3);
70 
71  HWREG16(address) |= (param->gain | param->sampleDelay);
72 
73  // Getting correct SDBOSRx register
74  address = baseAddress + (OFS_SD24BOSR0 + (param->converter * 0x08));
75 
76  // Clearing previous settings for configuration
77  HWREG16(address) &= ~(OSR10 | OSR9 | OSR8 | OSR7 | OSR6 | OSR5 | OSR4 |
78  OSR3 | OSR2 | OSR1 | OSR0);
79 
80  HWREG16(address) |= param->oversampleRatio;
81 }
82 void SD24_B_setConverterDataFormat(uint16_t baseAddress,
83  uint8_t converter,
84  uint8_t dataFormat) {
85 
86  uint16_t address = baseAddress + (OFS_SD24BCCTL0_L +
87  (converter * 0x08));
88  // Clearing previous settings for configuration
89  HWREG8(address) &= ~(SD24DF0 | SD24DF1);
90 
91  HWREG8(address) |= dataFormat;
92 }
93 
94 void SD24_B_startGroupConversion(uint16_t baseAddress,
95  uint8_t group)
96 {
97  switch(group) {
98  case SD24_B_GROUP0:
99  HWREG16(baseAddress + OFS_SD24BCTL1) |= SD24GRP0SC; break;
100  case SD24_B_GROUP1:
101  HWREG16(baseAddress + OFS_SD24BCTL1) |= SD24GRP1SC; break;
102  case SD24_B_GROUP2:
103  HWREG16(baseAddress + OFS_SD24BCTL1) |= SD24GRP2SC; break;
104  case SD24_B_GROUP3:
105  HWREG16(baseAddress + OFS_SD24BCTL1) |= SD24GRP3SC; break;
106  }
107 }
108 
109 void SD24_B_stopGroupConversion(uint16_t baseAddress,
110  uint8_t group)
111 {
112  switch(group) {
113  case SD24_B_GROUP0:
114  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24GRP0SC); break;
115  case SD24_B_GROUP1:
116  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24GRP1SC); break;
117  case SD24_B_GROUP2:
118  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24GRP2SC); break;
119  case SD24_B_GROUP3:
120  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24GRP3SC); break;
121  }
122 }
123 
124 void SD24_B_startConverterConversion(uint16_t baseAddress,
125  uint8_t converter)
126 {
127  uint16_t address = baseAddress + (OFS_SD24BCCTL0 + (converter * 0x08));
128 
129  // Clearing trigger generation select
130  HWREG16(address) &= ~(SD24SCS_7);
131 
132  // Setting SD24SC bit to start conversion
133  HWREG16(address) |= SD24SC;
134 }
135 
136 void SD24_B_stopConverterConversion(uint16_t baseAddress,
137  uint8_t converter)
138 {
139  uint16_t address = baseAddress + (OFS_SD24BCCTL0 + (converter * 0x08));
140 
141  // Clearing trigger generation select
142  HWREG16(address) &= ~(SD24SCS_7);
143 
144  // Setting SD24SC bit to start conversion
145  HWREG16(address) &= ~(SD24SC);
146 }
147 
148 void SD24_B_configureDMATrigger(uint16_t baseAddress,
149  uint16_t interruptFlag)
150 {
151  // Clearing previous settings
152  HWREG16(baseAddress + OFS_SD24BCTL1) &= ~(SD24DMA3 | SD24DMA2 |
153  SD24DMA1 | SD24DMA0);
154 
155  HWREG16(baseAddress + OFS_SD24BCTL1) |= interruptFlag;
156 }
157 
158 void SD24_B_setInterruptDelay(uint16_t baseAddress,
159  uint8_t converter,
160  uint8_t sampleDelay)
161 {
162  uint16_t address = baseAddress + (OFS_SD24BINCTL0 + (converter * 0x08));
163 
164  // Clear previous settings
165  HWREG16(address) &= ~(SD24INTDLY_3);
166 
167  HWREG16(address) |= sampleDelay;
168 }
169 
170 void SD24_B_setConversionDelay(uint16_t baseAddress,
171  uint8_t converter,
172  uint16_t cycleDelay)
173 {
174  uint16_t address = baseAddress + (OFS_SD24BPRE0 + (converter * 0x08));
175 
176  // Clear previous settings
177  HWREG16(address) &= ~(0x3FF);
178 
179  HWREG16(address) |= cycleDelay;
180 }
181 
182 void SD24_B_setOversampling(uint16_t baseAddress,
183  uint8_t converter,
184  uint16_t oversampleRatio)
185 {
186  uint16_t address = baseAddress + (OFS_SD24BOSR0 + (converter * 0x08));
187 
188  // Clear previous settings
189  HWREG16(address) &= ~(OSR10 | OSR9 | OSR8 | OSR7 | OSR6 | OSR5 | OSR4 |
190  OSR3 | OSR2 | OSR1 | OSR0);
191 
192  HWREG16(address) |= oversampleRatio;
193 }
194 
195 void SD24_B_setGain(uint16_t baseAddress,
196  uint8_t converter,
197  uint8_t gain)
198 {
199  uint16_t address = baseAddress + (OFS_SD24BINCTL0 + (converter * 0x08));
200 
201  // Clear previous settings
202  HWREG16(address) &= ~(SD24GAIN_128);
203 
204  HWREG16(address) |= gain;
205 }
206 
207 uint32_t SD24_B_getResults(uint16_t baseAddress,
208  uint8_t converter)
209 {
210  // Calculating address to low word
211  uint16_t address = baseAddress + (OFS_SD24BMEML0 + (converter * 0x04));
212 
213  // Getting low word result
214  uint16_t lowResult = HWREG16(address);
215 
216  // Getting high word result and concatenate with low word
217  uint32_t result = (((uint32_t) HWREG16(address + 0x02) ) << 16) + lowResult;
218 
219  return result;
220 }
221 
222 uint16_t SD24_B_getHighWordResults(uint16_t baseAddress,
223  uint8_t converter)
224 {
225  // Calculating address
226  uint16_t address = baseAddress + (OFS_SD24BMEMH0 + (converter * 0x04));
227 
228  // Getting high word result
229  uint16_t result = HWREG16(address);
230 
231  return result;
232 }
233 
234 void SD24_B_enableInterrupt (uint16_t baseAddress,
235  uint8_t converter,
236  uint16_t mask)
237 {
238  //Enable Interrupt
239  HWREG16(baseAddress + OFS_SD24BIE) |= (mask << converter);
240 }
241 
242 void SD24_B_disableInterrupt (uint16_t baseAddress,
243  uint8_t converter,
244  uint16_t mask)
245 {
246  HWREG16(baseAddress + OFS_SD24BIE) &= ~(mask << converter);
247 }
248 
249 void SD24_B_clearInterrupt (uint16_t baseAddress,
250  uint8_t converter,
251  uint16_t mask)
252 {
253  HWREG16(baseAddress + OFS_SD24BIFG) &= ~(mask << converter);
254 }
255 
256 uint16_t SD24_B_getInterruptStatus (uint16_t baseAddress,
257  uint8_t converter,
258  uint16_t mask)
259 {
260  return ( HWREG16(baseAddress + OFS_SD24BIFG) & (mask << converter) );
261 }
262 
263 
264 #endif
265 //*****************************************************************************
266 //
269 //
270 //*****************************************************************************
MPU_initThreeSegmentsParam param
#define HWREG8(x)
Definition: hw_memmap.h:41
#define HWREG16(x)
Definition: hw_memmap.h:39