@@ -284,6 +284,45 @@ uint32_t analogReadVDD( void )
284
284
return analogRead_internal (SAADC_CH_PSELP_PSELP_VDD );
285
285
}
286
286
287
+ analogCalibrateOffset ()
288
+ {
289
+ const uint32_t calibrate_done = ( (SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Generated <<
290
+ SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Pos )
291
+ && SAADC_EVENTS_CH_LIMITH_LIMITH_Msk );
292
+
293
+ const uint32_t calibrate_not_done = ( (SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_NotGenerated <<
294
+ SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Pos )
295
+ && SAADC_EVENTS_CH_LIMITH_LIMITH_Msk );
296
+
297
+ const uint32_t saadc_enable = ( (SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos )
298
+ && SAADC_ENABLE_ENABLE_Msk );
299
+
300
+ const uint32_t saadc_disable = ( (SAADC_ENABLE_ENABLE_Disabled << SAADC_ENABLE_ENABLE_Pos )
301
+ && SAADC_ENABLE_ENABLE_Msk );
302
+
303
+ const uint32_t calibrate_trigger = ( (SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Trigger <<
304
+ SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Pos )
305
+ && SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Msk );
306
+
307
+ // Enable the SAADC
308
+ NRF_SAADC -> ENABLE = saadc_enable ;
309
+
310
+ // Be sure the done flag is cleared, then trigger offset calibration
311
+ NRF_SAADC -> EVENTS_CALIBRATEDONE = calibrate_not_done ;
312
+ NRF_SAADC -> TASKS_CALIBRATEOFFSET = calibrate_trigger ;
313
+
314
+ // Wait for completion
315
+ while (NRF_SAADC -> EVENTS_CALIBRATEDONE != calibrate_done );
316
+ //bool done = false;
317
+ //for (int i = 0; (i < 20) && !(done = (NRF_SAADC->EVENTS_CALIBRATEDONE == calibrate_done)); i++ ) delay(1);
318
+
319
+ // Clear the done flag (really shouldn't have to do this both times)
320
+ NRF_SAADC -> EVENTS_CALIBRATEDONE = calibrate_not_done ;
321
+
322
+ // Disable the SAADC
323
+ NRF_SAADC -> ENABLE = saadc_disable ;
324
+ }
325
+
287
326
#ifdef __cplusplus
288
327
}
289
328
#endif
0 commit comments