-
Hi,
ohne zu wissen, ob deine SetupWriteChannel Funktion (und auch die anderen) richtig arbeitet, fällt mir auf, dass du den DMA auf 1Byte-Burst sowie auf SCRDIR_FIXED gestellt hast. Das PER Register der Timer ist aber 16Bit breit, das passt schonmal nicht.
Außerdem weiß ich nicht, ob du das PER Register überhaupt irgendwo veränderst? Dir ist klar, was dieses Register macht?
Gruß
Chris
-
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.