diff --git a/components/flow3r_bsp/flow3r_bsp_ad7147.c b/components/flow3r_bsp/flow3r_bsp_ad7147.c
index f5409a625a9a1d13c54fc39911848790d15e36e0..31dd1e809d2b6d9f55f3d2fd3fd91678a6caa640 100644
--- a/components/flow3r_bsp/flow3r_bsp_ad7147.c
+++ b/components/flow3r_bsp/flow3r_bsp_ad7147.c
@@ -158,17 +158,18 @@ static void _on_data(void *user, uint16_t *data, size_t len) {
     if (chip->seq_position == 0) {
         // Deal with calibration pending flag, possibly starting calibration.
         if (chip->calibration_pending) {
-            if (chip->calibration_cycles == 0) {
+            if (!chip->calibration_active) {
                 ESP_LOGI(TAG, "%s: calibration starting...", chip->name);
                 chip->calibration_cycles = _AD7147_CALIB_CYCLES;
+                chip->calibration_active = true;
             }
             chip->calibration_pending = false;
         }
 
-        if (chip->calibration_cycles > 0) {
+        if (chip->calibration_active) {
             // Deal with active calibration.
             chip->calibration_cycles--;
-            if (chip->calibration_cycles == 0) {
+            if (chip->calibration_cycles <= 0) {
                 // Calibration measurements done. Calculate average amb data for
                 // each channel.
                 for (size_t i = 0; i < chip->nchannels; i++) {
@@ -206,6 +207,7 @@ static void _on_data(void *user, uint16_t *data, size_t len) {
                              chip->name, rerun);
                     chip->calibration_cycles = _AD7147_CALIB_CYCLES;
                 } else {
+                    chip->calibration_active = false;
                     ESP_LOGI(TAG, "%s: calibration done.", chip->name);
                 }
             }
diff --git a/components/flow3r_bsp/flow3r_bsp_ad7147.h b/components/flow3r_bsp/flow3r_bsp_ad7147.h
index 5082a87d066d51f87bb3a2541958c5330ed79b96..fa2ff2e2ee772036fe90aa626188cea165155ab7 100644
--- a/components/flow3r_bsp/flow3r_bsp_ad7147.h
+++ b/components/flow3r_bsp/flow3r_bsp_ad7147.h
@@ -61,8 +61,9 @@ typedef struct {
     ad7147_hw_t dev;
     bool failed;
 
-    bool calibration_pending;
-    size_t calibration_cycles;
+    volatile bool calibration_pending;
+    volatile bool calibration_active;
+    int8_t calibration_cycles;
 } ad7147_chip_t;
 
 // Call to initialize the chip at a given address. Structure must be zeroed, and
@@ -75,4 +76,4 @@ esp_err_t flow3r_bsp_ad7147_chip_init(ad7147_chip_t *chip,
 
 // Call to poll the chip and perform any necessary actions. Can be called from
 // an interrupt.
-esp_err_t flow3r_bsp_ad7147_chip_process(ad7147_chip_t *chip);
\ No newline at end of file
+esp_err_t flow3r_bsp_ad7147_chip_process(ad7147_chip_t *chip);
diff --git a/components/flow3r_bsp/flow3r_bsp_captouch.c b/components/flow3r_bsp/flow3r_bsp_captouch.c
index 2b84cbeb7331199d3cfb216c645e425c7fb1c882..e5a7db385dd08a78c3d6e79ea9f182d7f9d5d8e4 100644
--- a/components/flow3r_bsp/flow3r_bsp_captouch.c
+++ b/components/flow3r_bsp/flow3r_bsp_captouch.c
@@ -378,7 +378,7 @@ void flow3r_bsp_captouch_calibrate() {
 }
 
 bool flow3r_bsp_captouch_calibrating() {
-    bool bot = _bot.calibration_pending || _bot.calibration_cycles > 0;
-    bool top = _top.calibration_pending || _top.calibration_cycles > 0;
+    bool bot = _bot.calibration_pending || _bot.calibration_active;
+    bool top = _top.calibration_pending || _top.calibration_active;
     return bot || top;
 }
diff --git a/components/flow3r_bsp/flow3r_bsp_captouch.h b/components/flow3r_bsp/flow3r_bsp_captouch.h
index a8fd1721a089b6124adf3a0dd3bea0a75ddc4fcc..71c12922ec989f38798e2fd342d473dd63b9d9c8 100644
--- a/components/flow3r_bsp/flow3r_bsp_captouch.h
+++ b/components/flow3r_bsp/flow3r_bsp_captouch.h
@@ -83,6 +83,4 @@ flow3r_bsp_captouch_petal_pad_state_t *flow3r_bsp_captouch_pad_for_petal(
 void flow3r_bsp_captouch_calibrate();
 
 // Returns true if captouch is currently calibrating.
-//
-// TODO(q3k): this seems glitchy, investigate.
 bool flow3r_bsp_captouch_calibrating();