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


von Thorsten (Gast)


Angehängte Dateien:

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:
1
void IDMA_SetStartAddr(unsigned int adr, unsigned char mem)
2
{
3
  IDMA_DIR_DATAL = OUTPUT;
4
  IDMA_DIR_DATAH = OUTPUT;
5
6
  SetBit(IDMA_PORT_IAL, IDMA_BIT_IAL);
7
  ClrBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
8
9
  IDMA_PORT_DATAL = adr;
10
  IDMA_PORT_DATAH = (adr>>8)+mem;
11
12
  delay(2);
13
14
  SetBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
15
  ClrBit(IDMA_PORT_IAL, IDMA_BIT_IAL);
16
}

Zum lesen eines Worts aus dem Datenspeicher:
1
unsigned int IDMA_ReadMem16(void)
2
{
3
  unsigned int data = 0;
4
5
  IDMA_DIR_DATAL = INPUT;
6
  IDMA_DIR_DATAH = INPUT;
7
8
  ClrBit(IDMA_PORT_nIRD, IDMA_BIT_nIRD);
9
  ClrBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
10
11
  delay(2);
12
13
  data = ((unsigned int)IDMA_PIN_DATAH<<8) + 
14
                (unsigned int)IDMA_PIN_DATAL;
15
16
  SetBit(IDMA_PORT_nIS, IDMA_BIT_nIS);
17
  SetBit(IDMA_PORT_nIRD, IDMA_BIT_nIRD);
18
19
  return data;
20
}

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

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.