www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Usart DMA auf ARM7 funktioniert nicht.


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich grübel seit einigen Tagen an folgendem Problem:
Irgendwie funktioniert der USART-Datenversand mittels DMA nicht.
Habe folgenden Code verwendet:
    u_pUSART0->US_TPR = (AT91_REG)buff; // address of DMA output buffer
    u_pUSART0->US_TCR = length; //we'll transmit length bytes via DMA

    // enable transmit DMA transfers, disable receive DMA transfers
    u_pUSART0->US_PTCR = AT91C_PDC_TXTEN;

    // just wait for end of transmission
    while(! (u_pUSART0->US_CSR & AT91C_US_ENDTX));

Es gehen aber keine Daten raus und dementsprechend bleibt er auch in der 
While-Schleife hängen.
Woran kann das liegen? Also buff und length sind an der Stelle definitiv 
richtig belegt. Die USART Clock habe ich auch vorher aktiviert:
    //enable the clock of USART
    u_pPMC->PMC_PCER = 1<<AT91C_ID_US0;

    //Reset receiver and transmitter
    u_pUSART0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;

    //set baud rate divisor register
    u_pUSART0->US_BRGR = 3003428/baudrate; // 3003428 = 48Mhz / 16

Irgendwelche Ideen? Danke!

Gruß
Florian

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum setzt du AT91C_US_RXDIS und AT91C_US_TXDIS? Wie soll er da was 
senden wenn du das senden disablest?

Gibt es nicht noch einen generellen Enable für den USART? Also ein US_MR 
Register?

Meist hilft das Datenblatt bei solchen Problemen.

Ansonsten würde ich mich näherungsweise an das Problem wagen und 
zunächst normale Transfers ohne DMA zum laufen bringen.

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
danke erstmal!

Beim Initialisieren schreibe ich natürlich in diese Register, hatte ich 
vorhin vergessen mit raus zu kopieren:
    // set mode
    u_pUSART0->US_MR = AT91C_US_USMODE_NORMAL | AT91C_US_NBSTOP_1_BIT | AT91C_US_PAR_NONE | AT91C_US_CHRL_8_BITS | AT91C_US_CLKS_CLOCK;
    // enable transmitter and receiver now
    u_pUSART0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

Schau mir jetzt aber erstmal den Link an.

Autor: Heiko Süsens (heiko_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Florian,
wo sind denn die Sequenzen um den UART zu aktivieren?
Vielleicht solltest Du die Dokumentation doch lesen!

  /* Configure PIO for UART */
  AT91C_BASE_PIOA->PIO_PDR = (UART0_RXD | UART0_TXD);
  AT91C_BASE_PIOA->PIO_ASR = (UART0_RXD | UART0_TXD);

  /* Enable UART Unit */
  AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_US0);

Dann kann man die Pufferadressen füllen

  AT91C_BASE_PDC_US0->PDC_TPR = (unsigned int) tmp_char_p;
  AT91C_BASE_PDC_US0->PDC_TCR = strlen((const char *) tmp_char_p);

und mit

  /* start the PDC transfer */
  AT91C_BASE_PDC_US0->PDC_PTCR = AT91C_PDC_TXTEN;

den transfer starten!

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.