Forum: Digitale Signalverarbeitung / DSP / Machine Learning TMS320C6713: Daten von AD-Wandler direkt in SDRAM schreiben


von DSPbeginner (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zum TMS320C6713 DSK, den ich mit einem externen 
AD-Wandler (3 MSPS) betreibe.

Da meine Rechenoperationen für das abgetastete Signal für den 
TMS320C6713 zu aufwendig sind, um sie parallel zum Abtasten durchführen 
zu können, ist keine "Real-Time" Signalverarbeitung möglich. Daher 
möchte ich den Signalverlauf für einige Millisekunden aufzeichnen, um 
sie anschließend verarbeiten zu können - hierfür ist aber wiederum der 
interne Speicher mit seinen verfügbaren 64kB zu klein. Daher versuche 
ich, die abgetasteten Daten (anstatt in den internen Speicher) direkt in 
den SDRAM zu schreiben, der von der Größe her ausreichen würde.

Leider bekomme ich das aber nicht hin. Anstelle des jeweiligen 
Abtastwertes enthält jede Variable den Wert "0".



Was ich dazu gemacht habe:

Im Linker-Command-File (CMD-Datei) habe ich folgende Ergänzungen 
vorgenommen, um den SDRAM-Speicherbereich ab 0x80000000 (steht so im 
Datenblatt) zu definieren.
Unter MEMORY:
SDRAM: origin = 0x80000000,  len = 0x01000000

Unter SECTIONS:
.extram: {} > SDRAM

Dazu natürlich im Hauptprogramm (main.c) die Zuweisung der Variablen 
"buffer" (welche die Abtastwerte enthält, ist ein Array) zum oben 
definierten Speicherbereich:
#pragma DATA_SECTION (buffer, ".extram")


Kompiliert wird das alles fehlerfrei, die Variable "buffer" wird beim 
Starten des Programms auch in den gewünschten Speicherbereich 
0x80000000+ verschoben. Problem ist wie gesagt nur: Sie enthält nicht 
mehr die Abtastwerte, sondern alle buffer[i] sind = 0 (obwohl ein Signal 
anliegt).


Am AD-Wandler oder anliegenden Signal selber kann es nicht liegen - 
speichere ich ein paar Abtastwerte in den internen Speicher des DSP, 
dann stimmen die Werte.

Irgendwas im Speichervorgang muss verkehrt laufen. Kann mir eventuell 
jemand einen Tipp geben? Laut Angaben läuft der SDRAM mit 100MHz, was ja 
eigentlich schnell genug sein müsste. An der Geschwindigkeit könnte es 
somit auch nicht liegen - denke ich zumindest. Die Ideen sind mir 
allerdings bereits ausgegangen, ich wäre für jeden Vorschlag dankbar!

Gruß,
Thomas

von DSPbeginner (Gast)


Lesenswert?

Vielleicht war das doch alles mit ein wenig zu viel Text umschrieben, 
daher fasse ich mein Problem hier nochmal etwas kürzer zusammen:

Mein AD-Wandler übergibt immer blockweise 1024 Abtastwerte an den DSP. 
Diese Blöcke möchte ich zur weiteren Verarbeitung direkt in den SDRAM 
schreiben. Das klappt auch alles so weit - allerdings entahlten die 
Blöcke anstelle der realen Abtastwerte nur Nullen (0).
Schreibe ich stattdessen in den internen Speicher des DSP, dann stimmen 
die Abtastwerte. Die Funktion zum Auslesen des AD-Wandlers an sich muss 
also stimmen.

Testweise habe ich nun anstatt eines kompletten Blockes von 1024 
Abtastwerten mal nur einen einzelnen Abtastwert ausgelesen und diesen 
direkt in den SDRAM zu schreiben versucht - das klappt auch. Das 
Ansprechen des SDRAM muss also auch richtig sein.


Hat jemand von euch eventuell bereits Erfahrung, ob ich beim Schreiben 
der Blöcke noch etwas weiteres zu beachten habe? Kann es sein, dass der 
Schreibvorgang eventuell zu lange dauert? Abtastrate sind 3 MSPS, der 
SDRAM läuft mit 100 MHz.

von Martin L. (Gast)


Lesenswert?

Es klingt so, als würde der SDRAM nicht richtig angesteuert werden. Ob 
nun wegen einem verkehrten Timing oder wegen einer Fehlkonfiguration der 
MMU. Dass es mit einem Wert klappt liegt sicher an dem Cache der diesen 
Wert zwischenspeichert. Du kannst ja mal die Variable als volatile 
deklarieren und sehen ob es dann immer noch klappt.
Und bevor Du nicht 100%ig weißt, dass der Fehler nicht am externen 
Speicher zu suchen ist würde ich die Finger vom DMA lassen welches ja 
nochmal neue Fehlerquellen generiert.

Viele Grüße,
 Martin L.

von Jochen Ronn (Gast)


Lesenswert?

@Martin: von welcher MMU sprichst Du? Der C6713 hat keine!!

@DSPbeginner: schick deinen Testcode an das EPIC, die koennen dir helfen 
(epic@ti.com)

von Chris c. (chris78)


Lesenswert?

Hi,

Wie schnell soll (muss) das McBSP denn arbeiten?

Ich habe das McBSP bei der Ausgabe zu einen selbst entwickelten DAC 
(12Bit 6,4MSPs) nicht schnell genung betreiben können (real time). Auch 
die CodeComposerStudio Optimierungslevel haben da nicht geholfen, 
weshalb ich auf eine parallele Ausgabe über das EMIF zurück gegriffen 
habe...

Hätte Interess an Informationen zum verwendeten AD-Wandler um mein 
eigenes System zu erweitern.

MfG

von Chris c. (chris78)


Lesenswert?

Chris Lang wrote:

> Wie schnell soll (muss) das McBSP denn arbeiten?

Ich vermute mal das  Du zur Digitalisierung das "multi chanel buffered 
seriel port"-Interface verwendest, da Du schreibst:

> Mein AD-Wandler übergibt immer blockweise 1024 Abtastwerte an den DSP.
> Diese Blöcke möchte ich zur weiteren Verarbeitung direkt in den SDRAM
> schreiben.

MfG

von Stefan (Gast)


Lesenswert?

Hallo, habe ein ähnliches Problem:
ich möchte beim DSK6713 Werte von einem A/D Wandler direkt ins SDRAM 
speichern. (Möchte längere Zeit aufzeichnen).
Manuelle "Sections" Änderungen in des CMD-Datei werden natürlich von den 
"DSP/BIOS" Einstellungen überschrieben.

Im main.c hätte ich mir folgendes gedacht:
[c)
#define BUFFER_SIZE (131072)
#pragma DATA_SECTION (r_buffer1, ".extram1")
#pragma DATA_SECTION (r_buffer2, ".extram2")
short r_buffer1[BUFFER_SIZE];
short r_buffer2[BUFFER_SIZE];
[/c]
Wie und wo muß ich nun im DSP/BIOS die Speicher extram1 und extram2 
festlegen?
Soll ich unter MEM das SDRAM verkleinern und die freien Wertebereiche 
den Puffern zuweisen?

Oder muß ich ein Eintrag unter BUF -Buffer Pool Manager machen?
Oder bin ich gar ganz auf dem Holzweg?

MfG
Stefan

von Stefan (Gast)


Lesenswert?

Habe nun genau das gleiche Problem wie oben beschrieben!

Kam da inzwishcen eine Lösung zum vorschein?

Gruß Stefan

von Stefan (ein anderer) (Gast)


Lesenswert?

Hi,

Der C6713 hat (IMMER) 256k Internen Speicher, als erst abhilfe solltest 
du den nutzen.
Davon KANN man 0/16/32/48/64 k als Cache benutzen, dann bleiben immer 
noch 192k

Viele Testprogramme sind auch für den C6711 tauglich (bzw. geschreiben) 
der hatte nur 64k internen Speicher.

Zum benutzen: einfach im linker command file (*.cmd) die länge des 
internen Speicher von 0x10000 auf 0x40000 (bzw. 0x30000) ändern....

Grüße,

Stefan

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.