www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA DMA SPI


Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht 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:
blockSize= 6;
channel->TRFCNT = blockSize;
und es werden nur 5 Byte gesendet.

Hat jemand hiermit schon erfahrungen gemacht?

Danke für die Hilfe

Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht nicht nur das 3 Byte verloren sondern in einem Regelmäßigen 
abstand von 4 oder 5 Bytes eines Verloren.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibst Du während der Ausgabe auf den DMA-Puffer?

Autor: Hans W. (hans_w30)
Datum:

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

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

void spi_send_init(DMA_CH_t * ch,USART_SPI_Master_t *usart_spi){
  DMA_SetupBlock(ch,
    sendData,      
    DMA_CH_SRCRELOAD_TRANSACTION_gc,
    DMA_CH_SRCDIR_INC_gc,
    (void*) &usart_spi->module->DATA,      
    DMA_CH_DESTRELOAD_NONE_gc ,
    DMA_CH_DESTDIR_FIXED_gc,
    NUM_BYTES,
    DMA_CH_BURSTLEN_1BYTE_gc,
    0,
    false);
  
    DMA_SetTriggerSource(ch,DMA_CH_TRIGSRC_USARTC0_DRE_gc);
    DMA_EnableSingleShot(ch);
    DMA_SetIntLevel( ch, DMA_CH_TRNINTLVL_LO_gc, DMA_CH_ERRINTLVL_LO_gc );

}

main(){

  for(int i=0;i<NUM_BYTES;i++)
    sendData[i]=i;
............................
  DMA_Enable();
  spi_send_init(Channel1,&usart_spiMaster);
  DMA_EnableChannel( Channel1 );
}


Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann das ein Problem mit der Geschwindigkeit sein?
Das er nicht nachkommt und deswegen Bits verschluckt?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans W. schrieb:
> Kann das ein Problem mit der Geschwindigkeit sein?
> Das er nicht nachkommt und deswegen Bits verschluckt?

Nö. Wenn der DMA-Controller nicht nachkommen würde, würden Pausen im 
Datenstrom entstehen, aber es würde nichts verschwinden.

Autor: Hans W. (hans_w30)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft es was wenn ich mal meine Datei anhänge

Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat jemand zufällig auch was mit dem dma usart spi gemacht und kann mir 
seine Datei als Beispiel mal geben?
Ich versteh nicht wo das Byte hängen bleibt

Autor: Hans W. (hans_w30)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal noch ein Log vom SPI.
Es sollte normal
01 02 03 04 05 06 07 08 09 0A
herauskommen.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht 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
void USART_DMA_StartTransfer( volatile DMA_CH_t * channel )
{
  channel->CTRLA |= DMA_CH_TRFREQ_bm;
}

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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja. Der DMA-Controller sendet natürlich immer dann, wenn die 
Triggerbedingung erfüllt ist. Im Falle dessen, dass Du das DRE-Flag der 
UART dafür verwendest, ist die Triggerbedingung von Anfang an und 
solange erfüllt, bis Du 2 Bytes in das DATA-Register eingetragen hast.

Autor: Hans W. (hans_w30)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das stimmt ich hab mich leider zu sehr an dem Beispiel von AVR 
geklammert. Und die machen in dem Beispiel einen Transfer im Speicher.
Habe glaube ich 3 Tage lang diesen Fehler gesucht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.