Forum: Digitale Signalverarbeitung / DSP / Machine Learning BF533 EZ-Kit: UART DMA problem


von insecuritate (Gast)


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?!

von GISMO (Gast)


Lesenswert?

du hast doch bestimmt VisualDSP++ oder? so einfach ist es mit dem 
Blackfin nicht. Wo hast du denn die UART inititialsiert(z.B Baudrate 
usw.) ich empfehle dir das Beispiel von VisaualDSP++ an zugucken. 
ADSP-BF561

von insecuritate (Gast)


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
}

von Hippo (Gast)


Lesenswert?

Ich hab genau die selbe Probleme, hast du es gelöst. An was lags denn?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.