Vielen Dank für den Hinweis - ich habe schlicht und einfach vergessen, dass es ein 16 Bit Register ist.
Jetzt funktioniert (theoretisch) alles bestens - eine komplette Messung von 400 ksps mit 16 Bit ohne jegliche CPU-Last (bzw. laufenden Programm-Code).

Der variable mit DMA veränderbare Timer sieht jetzt so aus:
Code:
void SetupWriteTimer( void )
{
    // Start Timer/Counter C0 with actual clock (32MHz) divided by 4
    TCD0.CTRLA = (TCD0.CTRLA & ~TC0_CLKSEL_gm) | TC_CLKSEL_DIV1_gc;
    // AD_Wandlung 1,5 µs - Per = 47
    TCD0.PER = 30;
    // Timer vorladen um Kollision mit Timer TCC0 zu vermeiden
    TCD0.CNT = 15;
    // Priorität setzten
    TCD0.INTCTRLA = TC_OVFINTLVL_MED_gc;
}

#define Interval 4
volatile uint16_t  WriteDelay[Interval] = { 20, 20, 20, 96 };
    
void SetupWriteDelayChannel( DMA_CH_t * dmaChannel )
{
    DMA_SetupBlock(
        dmaChannel,
        WriteDelay,
        DMA_CH_SRCRELOAD_BLOCK_gc,
        DMA_CH_SRCDIR_INC_gc,
        (void *) &(TCD0.PER),
        DMA_CH_DESTRELOAD_BURST_gc,
        DMA_CH_DESTDIR_INC_gc,
        Interval * 2,
        DMA_CH_BURSTLEN_2BYTE_gc,
        0,
        true
    );

    DMA_EnableSingleShot( dmaChannel );
    DMA_SetTriggerSource( dmaChannel, DMA_CH_TRIGSRC_TCD0_OVF_gc );
}
Ich werde jetzt noch einen Test mit der SPI-Geschwindigkeit machen und prüfen, ob fehlerfrei übertragen wird - dann geht es zum Hardware-Aufbau.