mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Auf ADSP-2185M via IDMA zugreifen


Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Seit gegrüßt an diesem wunderschönen ersten Mai, den ich heute 
Nachmittag
definitiv im Freien verbringen werde :) Bis dahin beschäftigt mich
allerdings ein Problem, mit dem ich schon seit Tagen kämpfe.

Ich benutze einen ADSP-2185M, welcher extern mit 36 MHz getaktet wird, 
d.
h. intern läuft er mit 72 MHz. Die Corespannung des DSP beträgt 2,5V,
die externe Spannung für IOs usw. beträgt 3,3V. Alle unbenutzten Pins
des DSP sind gemäß Empfehlung des Datenblatts beschaltet. Nach anlegen
der Spannungen wird die Reset-Leitung des DSPs für ca. 1s auf low
gehalten, um der PLL etc. ausreichend Zeit zum Einschwingen zu geben.
Der DSP verfügt über 4 Mode-Pins, welche festlegen, wie der DSP nach dem 
einschalten booten soll. Er ist so konfiguriert, dass er
über den IDMA-Port seine Prorammdaten erwartet und erst nachdem die
Adresse 0x0000 via IDMA beschrieben wurde, läuft der DSP los. Das ist 
aber uninteressant, da ich vorerst nicht möchte, dass der DSP irgendwas 
macht.

Ich möchte nun auf den DSP via IDMA unter Zuhilfenahme eines ATmega128L,
der mit 8MHz läuft, zugreifen. Alle relevanten Signale (16
Datenleitungen, /RD, /WR, /IS und IAL) sind mit dem ATmega128 verbunden
und die Ansteuerung scheint auch zu funktionieren. Zumindest habe ich
das alles so gut wie möglich mit dem Oszilloskop überprüft.

Der ADSP hat einmal Programmspeicher (16k x 24 Bit), und einmal
Datenspeicher (16k x 16 Bit). Der Zugriff auf den Datenspeicher
gestaltet sich so, dass man zunächst die Adresse in den ADSP schreiben 
(latchen) muß. Dazu zieht man /IS auf low, IAL auf high, legt dann die 
Adresse an den 16 Bit Bus an, und zieht IAL wieder auf low sowie /IS auf 
high.

Nun kann man, indem /IS auf low und /RD auf low gelegt werden, die Daten
einlesen, anschließend muß /IS und /RD wieder auf high gehen. Also im
Prinzip nicht anders als der Zugriff auf ein normales SRAM. Der DSP 
erhöht nach jedem Speicherzugriff den internen Adresszähler automatisch.

Problem: wenn ich z. B. Adresse 0x0001 latche, lese ich die Daten, die
eigentlich an Adresse 0x0000 stehen. M. a. W. ich lese immer die Daten
der vorherigen Adresse. Warum???

Im Datenblatt steht zwar, dass man die vorherigen Daten ausliest, wenn
man nach /IS=0 und /RD=0 nicht lange genug wartet. Die Zeit beläuft sich
aber im unteren ns-Bereich und der ATmega128L ist so langsam, da sollte
das eigentlich keine Rolle spielen, zumal ich Delays eingefügt habe.

Zum latchen der Adresse nutze ich folgende Routine:
void IDMA_SetStartAddr(unsigned int adr, unsigned char mem)
{
  IDMA_DIR_DATAL = OUTPUT;
  IDMA_DIR_DATAH = OUTPUT;

  SetBit(IDMA_PORT_IAL, IDMA_BIT_IAL);
  ClrBit(IDMA_PORT_nIS, IDMA_BIT_nIS);

  IDMA_PORT_DATAL = adr;
  IDMA_PORT_DATAH = (adr>>8)+mem;

  delay(2);

  SetBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
  ClrBit(IDMA_PORT_IAL, IDMA_BIT_IAL);
}

Zum lesen eines Worts aus dem Datenspeicher:
unsigned int IDMA_ReadMem16(void)
{
  unsigned int data = 0;

  IDMA_DIR_DATAL = INPUT;
  IDMA_DIR_DATAH = INPUT;

  ClrBit(IDMA_PORT_nIRD, IDMA_BIT_nIRD);
  ClrBit(IDMA_PORT_nIS, IDMA_BIT_nIS);

  delay(2);

  data = ((unsigned int)IDMA_PIN_DATAH<<8) + 
                (unsigned int)IDMA_PIN_DATAL;

  SetBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
  SetBit(IDMA_PORT_nIRD, IDMA_BIT_nIRD);

  return data;
}

Im Anhang mein kompletter Code wegen der Initialisierungen und 
Definitionen.

Sorry für diesen ewig langen Text aber ich hoffe, jemand hat sich mit 
dem IDMA-Port mal beschäftigt und kann mir helfen. Evtl. ist auch ein 
anderer Klopper drin, denn ich vor lauter Bäumen nicht sehe.

Trotzdem schon mal vielen Dank für das lesen :)

Thorsten

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.