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.
Lesezeichen