Forum: Digitale Signalverarbeitung / DSP / Machine Learning µC - XINTF - TMS320F28335 Anbindung


von Tim R. (mugen)


Lesenswert?

Seit einigen Monaten habe ich einen asynchronen SRAM über den parallelen 
Bus XINTF angebunden und dieser funktioniert einwandfrei. Über eine 
weitere Zone wollte ich nun ein Ethernet Modul ansteuern. Allerdings 
muss ich über bestimmte Adressen Daten lesen oder schreiben und ich weiß 
absolut nicht wie ich sowas hinbekommen soll. Im Linker könnte ich die 
Adressen hübsch aufteilen, löst aber letztendlich nicht mein Problem.
Gibt es eine Möglichkeit in C++ direkt Adressen anzusteuern?
Eine Idee wäre es, wenn ich mehrere große Arrays einzeln in 
Speicherblöcke aufteile und somit letztendlich die Adresse direkt zu 
fassen bekomme. Aber ich bin nun mal ganz ehrlich zu mir selbst, die 
Lösung scheint nicht wirklich gescheit zu sein.

Ps. Eine weitere Anfängerfrage ;)

von Micha (Gast)


Lesenswert?

> Gibt es eine Möglichkeit in C++ direkt Adressen anzusteuern?
In C gibt es die durchaus - und damit vermutlich auch in C++. Das geht 
ganz einfach über Zeiger. Ich habe das bei einem, am XINTF des 2812 
angeschlossenen LCD folgendermaßen gemacht:

LCD.h
1
//...
2
#define LCD_BASE_POINTER   0x2000    // define base address
3
#define LCD_KS0066         ((volatile Uint16 *)LCD_BASE_POINTER)
4
//...
LCD.c
1
//...
2
*LCD_KS0066 = cmd;         // write command to display
3
//...
4
data_in = *LCD_KS0066;     // read data from display
5
//...
Den Base-Pointer wählst du entsprechend der gewünschten 
Chip-Select-Zone. Und wenn du das Ganze ein wenig anpasst, kannst du 
mittels, z.B., LCD_KS0066[x] auf entsprechende Register zugreifen, wobei 
x dann der "Offset" ist.

von Franz G. (jogl)


Lesenswert?

Hallo Tim R.

In Deinem Post vom 27.01.2009 schreibst Du, dass Du ein asynchrones SRAM 
per XINTF an deinen TMS320F28335 erfolgreich angebunden hast. Ich stehe 
vor der selben Aufgabe und komme nicht weiter.

Ich muss die XINTF-Funktion in einem bestehenden Projekt einbinden, 
welches über das .cmd-file den Flash als Speicher nutzt. Das 
Beispielprogramm für XINTF nutzt jedoch RAM. Kann ich einfach die 
SECTION "xintffuncs" aus dem .cmd-File (siehe unten) in das 
Flash-basierende .cmd-File einfügen?

Zudem ist mir nicht klar, wie ich später die Daten in das SRAM schreibe.

Danke Jogl
1
SECTIONS
2
{
3
   /* Setup for "boot to SARAM" mode: 
4
      The codestart section (found in DSP28_CodeStartBranch.asm)
5
      re-directs execution to the start of user code.  */
6
   codestart        : > BEGIN,     PAGE = 0
7
   ramfuncs         : > RAML0,     PAGE = 0  
8
   .text            : > RAML1,     PAGE = 0
9
   .cinit           : > RAML0,     PAGE = 0
10
   .pinit           : > RAML0,     PAGE = 0
11
   .switch          : > RAML0,     PAGE = 0
12
13
   xintffuncs       : LOAD = RAML1, 
14
                      RUN = ZONE7A, 
15
                      LOAD_START(_XintffuncsLoadStart),
16
                      LOAD_END(_XintffuncsLoadEnd),
17
                      RUN_START(_XintffuncsRunStart),
18
                      PAGE = 0
19
   
20
   .stack           : > RAMM1,     PAGE = 1
21
   .ebss            : > RAML4,     PAGE = 1
22
   .econst          : > RAML5,     PAGE = 1      
23
   .esysmem         : > RAMM1,     PAGE = 1
24
   IQmath           : > RAML1,     PAGE = 0
25
   IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD 
26
   IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD 
27
   FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD       
28
   DMARAML4         : > RAML4,     PAGE = 1
29
   DMARAML5         : > RAML5,     PAGE = 1
30
   DMARAML6         : > RAML6,     PAGE = 1
31
   DMARAML7         : > RAML7,     PAGE = 1
32
   ZONE7DATA        : > ZONE7B,    PAGE = 1  
33
34
   .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used   */
35
   csm_rsvd         : > CSM_RSVD   PAGE = 0, TYPE = DSECT /* not used for SARAM examples */
36
   csmpasswds       : > CSM_PWL    PAGE = 0, TYPE = DSECT /* not used for SARAM examples */
37
   
38
   /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
39
   .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD
40
     
41
}

von Tim R. (mugen)


Lesenswert?

Hallo Franz G.

1
   xintffuncs       : LOAD = RAML1, 
2
                      RUN = ZONE7A, 
3
                      LOAD_START(_XintffuncsLoadStart),
4
                      LOAD_END(_XintffuncsLoadEnd),
5
                      RUN_START(_XintffuncsRunStart),
6
                      PAGE = 0
Diese Anweisung ist nur dafür da, dass Funktionen aus dem externen RAM 
ausgeführt werden können. Sie Beschreibt letztendlich den Startpunkt und 
den Endpunkt für memcopy. memcopy muss innerhalb der Initialisierung, 
also vor der Endlosschleife in main ausgeführt werden.
Ich selber benutze den externen Speicher nur für Statusdaten, ARRAYs und 
Variablen. Dann ist diese Code-Schnipsel nicht notwendig, sondern:
1
  .extern_prog  : >  ZONE7A  PAGE = 0
2
  .extern_data  : >  ZONE7B  PAGE = 1
3
4
MEMORY
5
{
6
PAGE 0:    
7
    ZONE7A     : origin = 0x200000, length = 0x00FC00
8
9
PAGE 1 : 
10
    ZONE7B     : origin = 0x20FC00, length = 0x000400 
11
}

Im Code selber muss die Variable, bzw. Array einfach per Pragma in den 
Speicher zugewiesen werden:
1
#pragma DATA_SECTION(ARRAY_NAME, ".extern_data")

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.