BF533 EZ-Kit: UART DMA problem

Gast #441215
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich möchte mittels UART DMA zwischen PC und EZ-Kit Daten austauschen.
Im Folgenden die Initialisierung der DMA-Register (siehe Code). tx_buf 
enthält die zu sendenden Daten, in rx_buf sollen die empfangenen Werte 
abgelegt werden:

unsigned char tx_buf[BUFLEN];
unsigned char rx_buf[BUFLEN];

void init_dma_tx (void)
{
*pDMA7_CONFIG = 0x1080;
*pDMA7_PERIPHERAL_MAP = 0x7000;
*pDMA7_X_COUNT = BUFLEN;
*pDMA7_X_MODIFY = 0x01;
*pDMA7_START_ADDR = (void*)&tx_buf;
asm("ssync;");
}

void init_dma_rx (void)
{
*pDMA6_CONFIG = 0x1082;
*pDMA6_PERIPHERAL_MAP = 0x6000;
*pDMA6_X_COUNT = BUFLEN;
*pDMA6_X_MODIFY = 0x01;
*pDMA6_START_ADDR = (void*)&rx_buf;
asm("ssync;");
}

Die entsprechenden UART-Einstellungen (Datenformat, TX und RX-Interrupt) 
hab ich vorgenommen.

Was funktioniert, ist die Empfangsroutine. D.h. ich sende einen Wert, 
und dieser wird auf rx_buf[0] abgelegt, DMA6_CURR_ADDR wird entsprechend 
erhöht, so dass der nächste Wert an rx_buf[1] kommt.

Nun zum Problem:

Obwohl ich keine Daten lese, inkrementiert sich der Counter 
DMA7_CURR_ADDR selbstständig, d.h. er zeigt ständig auf einen anderen 
Wert in tx_buf.
Das Lesen an sich funktioniert, ich kann Werte aus tx_buf lesen, Problem 
ist nur, dass duch die "verselbstständigung" des Counters jeglicher 
Bezug verloren geht: Erstes lesen bringt tx_buf[3], das nächste lesen 
einen wahllosen anderen Wert.

Mein Ziel ist es aber, die Werte schrittweise in geordneter Reihenfolge 
vom Index 0 an auszulesen.

Jemand eine Idee, wo mein Fehler liegt?!
Gast #441348
Lesenswert?
• ▲
▼
wie gesagt, uart & pll hab ich initialisiert, funktioniert auch alles 
(code siehe unten) - auch im polling betrieb funktioniert die uart 
bestens. selbst im dma-modus funktioniert das schreiben. nur eben beim 
TX-DMA verstehe ich nicht, warum sich DMA_CURR_ADDR automatisch erhöht, 
ohne dass ich irgendetwas lese...

Code:
void init_pll (void)
{
  asm
  ("  CLI R0;\
    P1.L=0x0;\
    P1.H=0xFFC0;\
    R1.L=0x2C00;\
    W[P1]=R1.L;\
    IDLE;\
    STI R0;\
  ");

  *pPLL_DIV = 0x0005;    // CSEL=00=VCO/1 ; SSEL=0101=VCO/5
}

void init_uart (void)
{
  *pUART_LCR = 0x0080;     // DLAB setzen
  *pUART_DLL = 0x0040;     // Baud = 115,2k
  *pUART_DLH = 0x0000;     // Baud = 115,2k
  *pUART_LCR = 0x0000;     // DLAB löschen
  *pUART_LCR = 0x0003;     // 8 Bit, 1 Stopbit, no parity
  *pUART_GCTL= 0x0001;     // UART clock aktivieren
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.