Я бы делал 2 автомата состояний. 1) В main() высокоуровневый -
проверяет наличие готовых данных от АЦП, состояния: IDLE, BUSY,
DATA_READY. 2) В прерывании по завершении SPI-передачи. Там вот все
состояния, что вы выше написали, а в конце выставляется DATA_READY.
Ну, или взять FreeRTOS и между задачами гонять сигналы/события/др. https://www.keil.com/pack/doc/CMSIS/RTOS/html/CMSIS_RTOS_Tutorial.pdf