XMEGA DMA SPI

OP #2102605
Lesenswert?

Hy,
ich versuche DMA mit meinem XMEGA über SPI im Master Mode.
Hierfür muss man den USART benutzen.
Das Funktioniert auch alles soweit.
Ich kann das was auf meinem Bus liegt über ein Oszi bzw. auch über einen 
AARDVARK abhören.

Hierbei stelle ich fest das mein drittes oder viertes Byte nicht 
gesendet werden. Dies kann ich mir nicht erklären, da ich ja gar nicht 
eingreife bzw. eingreifen kann wenn ich per DMA Daten sende.

Was auch komisch ist ich schreibe:
1
blockSize= 6;
2
channel->TRFCNT = blockSize;
und es werden nur 5 Byte gesendet.

Hat jemand hiermit schon erfahrungen gemacht?

Danke für die Hilfe
OP #2103797
Lesenswert?

Nein ich initialisiere meine Buffer und ändere danach nichts mehr an 
diesem.
Ich benutze die Treiber von Atmel

Verkürzt mache ich das:
1
static char sendData[NUM_BYTES] ;
2

3
void spi_send_init(DMA_CH_t * ch,USART_SPI_Master_t *usart_spi){
4
  DMA_SetupBlock(ch,
5
    sendData,      
6
    DMA_CH_SRCRELOAD_TRANSACTION_gc,
7
    DMA_CH_SRCDIR_INC_gc,
8
    (void*) &usart_spi->module->DATA,      
9
    DMA_CH_DESTRELOAD_NONE_gc ,
10
    DMA_CH_DESTDIR_FIXED_gc,
11
    NUM_BYTES,
12
    DMA_CH_BURSTLEN_1BYTE_gc,
13
    0,
14
    false);
15
  
16
    DMA_SetTriggerSource(ch,DMA_CH_TRIGSRC_USARTC0_DRE_gc);
17
    DMA_EnableSingleShot(ch);
18
    DMA_SetIntLevel( ch, DMA_CH_TRNINTLVL_LO_gc, DMA_CH_ERRINTLVL_LO_gc );
19

20
}
21

22
main(){
23

24
  for(int i=0;i<NUM_BYTES;i++)
25
    sendData[i]=i;
26
............................
27
  DMA_Enable();
28
  spi_send_init(Channel1,&usart_spiMaster);
29
  DMA_EnableChannel( Channel1 );
30
}
(Firma: TravelRec.) Persönliche Seite #2113278
Lesenswert?

Kann das sein, dass die Bitrate von Deinem ControlCenter vielleicht 
etwas zu niedrig ist?!

Hans W. schrieb:
> Hat jemand zufällig auch was mit dem dma usart spi gemacht

Jupp, gerade frisch: Audio-Ein-/Ausgabe über eine über die UART im 
MASTER-SPI-Modus laufende I2S-Emulation. Der XMega macht gut 36Mhz, 
Samplerate des I2S ist 48kHz, 24Bit. Die BitClock liegt bei 3.072Mhz. 1 
Eingabe- und 2 Ausgabestreams laufen zur gleichen Zeit über 3 
DMA-Kanäle. Ich verliere keine Bytes, kann stundenlang Musik über den 
XMEGA hören, ohne dass etwas stottert. Leider verstehe ich nichts von C, 
dafür aber von ASM :-). Ich wollte damit nur sagen, dass die UART im SPI 
hervorragend läuft.
OP #2113911
Lesenswert?

Mercy, das ist aber nicht das problem die eingestellte Bitrate ist nur 
zum Senden da wenn das ControlCenter als Master arbeitet.

Ich hab den Fehler gefunden.

Und zwar hab ich ein
1
void USART_DMA_StartTransfer( volatile DMA_CH_t * channel )
2
{
3
  channel->CTRLA |= DMA_CH_TRFREQ_bm;
4
}
5

6
StartTransfer(Channelx);
gemacht was dazu geführt hat das der DMA Controller bereits am Senden 
war und bei einem Byte nochmal den Befehl bekommen hat und somit dieses 
einfach übersprungen hat.

Trozdem Danke für eure Hilfe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren