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

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