@@ -77,17 +77,21 @@ void analogReadResolution(int res)
77
77
78
78
if (res > 10 ) {
79
79
ADC0 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_12BIT_Val ;
80
+ ADC1 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_12BIT_Val ;
80
81
_ADCResolution = 12 ;
81
82
} else if (res > 8 ) {
82
83
ADC0 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_10BIT_Val ;
84
+ ADC1 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_10BIT_Val ;
83
85
_ADCResolution = 10 ;
84
86
} else {
85
87
ADC0 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_8BIT_Val ;
88
+ ADC1 -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_8BIT_Val ;
86
89
_ADCResolution = 8 ;
87
90
}
88
91
89
92
90
93
while (ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_CTRLB ); //wait for sync
94
+ while (ADC1 -> SYNCBUSY .reg & ADC_SYNCBUSY_CTRLB ); //wait for sync
91
95
#else
92
96
93
97
if (res > 10 ) {
@@ -131,6 +135,7 @@ void analogReference(eAnalogReference mode)
131
135
{
132
136
#if defined(__SAMD51__ )
133
137
while (ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_REFCTRL ); //wait for sync
138
+ while (ADC1 -> SYNCBUSY .reg & ADC_SYNCBUSY_REFCTRL ); //wait for sync
134
139
135
140
//TODO: fix gains
136
141
switch (mode )
@@ -139,11 +144,13 @@ void analogReference(eAnalogReference mode)
139
144
case AR_INTERNAL2V23 :
140
145
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
141
146
ADC0 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val ; // 1/1.48 VDDANA = 1/1.48* 3V3 = 2.2297
147
+ ADC1 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val ; // 1/1.48 VDDANA = 1/1.48* 3V3 = 2.2297
142
148
break ;
143
149
144
150
case AR_EXTERNAL :
145
151
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
146
152
ADC0 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val ;
153
+ ADC1 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val ;
147
154
break ;
148
155
149
156
/* Don't think this works on SAMD51
@@ -156,12 +163,14 @@ void analogReference(eAnalogReference mode)
156
163
case AR_INTERNAL1V65 :
157
164
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
158
165
ADC0 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val ; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
166
+ ADC1 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val ; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
159
167
break ;
160
168
161
169
case AR_DEFAULT :
162
170
default :
163
171
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_DIV2_Val;
164
172
ADC0 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val ; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
173
+ ADC1 -> REFCTRL .bit .REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val ; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
165
174
166
175
break ;
167
176
}
@@ -253,8 +262,13 @@ uint32_t analogRead(uint32_t pin)
253
262
#endif
254
263
255
264
#if defined(__SAMD51__ )
256
- while ( ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_INPUTCTRL ); //wait for sync
257
- ADC0 -> INPUTCTRL .bit .MUXPOS = g_APinDescription [pin ].ulADCChannelNumber ; // Selection for the positive ADC input
265
+ Adc * adc ;
266
+ if (g_APinDescription [pin ].ulPinAttribute & PIN_ATTR_ANALOG ) adc = ADC0 ;
267
+ else if (g_APinDescription [pin ].ulPinAttribute & PIN_ATTR_ANALOG_ALT ) adc = ADC1 ;
268
+ else return 0 ;
269
+
270
+ while ( adc -> SYNCBUSY .reg & ADC_SYNCBUSY_INPUTCTRL ); //wait for sync
271
+ adc -> INPUTCTRL .bit .MUXPOS = g_APinDescription [pin ].ulADCChannelNumber ; // Selection for the positive ADC input
258
272
259
273
// Control A
260
274
/*
@@ -268,27 +282,27 @@ uint32_t analogRead(uint32_t pin)
268
282
* Before enabling the ADC, the asynchronous clock source must be selected and enabled, and the ADC reference must be
269
283
* configured. The first conversion after the reference is changed must not be used.
270
284
*/
271
- while ( ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
272
- ADC0 -> CTRLA .bit .ENABLE = 0x01 ; // Enable ADC
285
+ while ( adc -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
286
+ adc -> CTRLA .bit .ENABLE = 0x01 ; // Enable ADC
273
287
274
288
// Start conversion
275
- while ( ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
289
+ while ( adc -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
276
290
277
- ADC0 -> SWTRIG .bit .START = 1 ;
291
+ adc -> SWTRIG .bit .START = 1 ;
278
292
279
293
// Clear the Data Ready flag
280
- ADC0 -> INTFLAG .reg = ADC_INTFLAG_RESRDY ;
294
+ adc -> INTFLAG .reg = ADC_INTFLAG_RESRDY ;
281
295
282
296
// Start conversion again, since The first conversion after the reference is changed must not be used.
283
- ADC0 -> SWTRIG .bit .START = 1 ;
297
+ adc -> SWTRIG .bit .START = 1 ;
284
298
285
299
// Store the value
286
- while (ADC0 -> INTFLAG .bit .RESRDY == 0 ); // Waiting for conversion to complete
287
- valueRead = ADC0 -> RESULT .reg ;
300
+ while (adc -> INTFLAG .bit .RESRDY == 0 ); // Waiting for conversion to complete
301
+ valueRead = adc -> RESULT .reg ;
288
302
289
- while ( ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
290
- ADC0 -> CTRLA .bit .ENABLE = 0x00 ; // Disable ADC
291
- while ( ADC0 -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
303
+ while ( adc -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
304
+ adc -> CTRLA .bit .ENABLE = 0x00 ; // Disable ADC
305
+ while ( adc -> SYNCBUSY .reg & ADC_SYNCBUSY_ENABLE ); //wait for sync
292
306
293
307
#else
294
308
syncADC ();
0 commit comments