Введите переменную статуса spi. Пусть она принимает значения 0, 1, 2. 0 - spi не занят, 1 - доступ к устройству 1, 2 - доступ к устройству 2.
В цикле или прерываниях проверяете. Если spi свободен и нужно обратится к одному из устройств - выставляете соотв статус spi и выполняете обращение. По завершению освобождаете spi. Если нужно обратится а spi занят (как у Вас бывает в прерывании) то выставляете флаг что необходимо выполнить обращение к такому-то устройству (если устройства 2 то и флагов будет 2) и далее в основном цикле организовывайте дополнительный опрос этих флагов чтобы выполнить обращение к устройствам в порядке приоритета. Это простейший (наверное) вариант

У меня для подобных случаев организовывается задача доступа к определённой переферии (например usart). Остальные задачи которые хотят получить доступ к переферии выставляют запрос на доступ. Задача доступа анализирует флаги запроса и в текущий момент времени все потоки данных переадресуются только этой задаче.