Вы или неверно изложили суть проблемы, или выбрали неверную стратегию обработки данных SPI.
Т.е., если "принимается
блок данных по SPI", то логично обрабатывать
прерывание от канала DMA привязанного к SPI. В этом случае прерывание не может "в итоге испортить весь блок данных", т.к. весь блок данных
уже принят и
уже сохранен в памяти.
Если "такое прерывание"
от канала DMA с вызовом функции SignalISR() "затягивается дольше чем принимается байт данных"
следующего блока данных, то необходимо просто настроить канал DMA на работу с двумя буферами в памяти с использованием списка или массива дескрипторов. В этом случае, пока Ваше прерывание от первого блока данных вызывает в обработчике функцию SignalISR(), канал DMA уже принимает данные от второго блока и сохраняет эти данные во втором буфере в памяти.
Если же Вы вызываете прерывание
после каждого принятого по SPI слова, то кроме уменьшения времени обработки в функции SignalISR(), других вариантов вроде как и нет.. Но это не путь Джедая..
Как-то так..