Forum: Mikrocontroller und Digitale Elektronik FSMC Interface vom STM32 Prozessor


von Jens (Gast)


Lesenswert?

Hi,

ich arbeite gerade mit einem STM32F103 Prozessor und dessen FSMC 
Interface - leider noch ohne zählbaren Erfolg. Als Device ist ein 
ICS2008B SMPTE Prozessor angeschlossen. Die Register dieses Prozessors 
können bzw. sollen über das Ext. Memory Interface ausgelesen und 
beschrieben werden können.

Beim Schreibzugriff stürzt mir bis jetzt aber immer der STM32 Prozessor 
ab und ausgelesen bekomme ich auch nichts brauchbares.

Hier mal meine Hardware-Verbindungen zwischen beiden ICs, vielleicht ist 
hier bereits was falsch:

STM-Prozessor             ICS2008B

A[0, 1]                   A[0, 1]   Addressbus
D[0, 7]                   D[0, 7]
FSMC_NWE                  IOW
FSMC_NOE                  IOR
FSMC_NE3                  UARTCS
FSMC_NE2                  SMPTECS

Externe Pullups oder ähnliches sind nicht installiert.

Write-Pulse-Width vom ICS2008B muss mindestens 150ns lang sein; > daraus 
schließe ich eine Frequenz von maximal 6,66MHz. HCLK ist bei mir die 
SYSCLK. Der STM32 Prozessor läuft mit 72MHz.
1
/* Initialisierung vom FSMC Bus */
2
3
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
4
    FSMC_NORSRAMTimingInitTypeDef  p;
5
6
RCC->AHBENR |= RCC_AHBPeriph_FSMC;
7
RCC->APB2ENR |= (RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF) ;
8
9
GPIO_Init(GPIOD, GPIO_Mode_AF_PP, (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15));
10
          
11
GPIO_Init(GPIOD, GPIO_Mode_AF_PP, (GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
12
GPIO_Pin_15));              
13
14
GPIO_Init(GPIOF, GPIO_Mode_AF_PP, (  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | 
15
GPIO_Pin_14 | GPIO_Pin_15)); 
16
17
GPIO_Init(GPIOG, GPIO_Mode_AF_PP, (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5)); 
18
19
20
GPIO_Init(GPIOD, GPIO_Mode_AF_PP, (GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13)); 
21
22
GPIO_Init(GPIOD, GPIO_Mode_AF_PP, (GPIO_Pin_4 |GPIO_Pin_5));   //NWE, NOE 
23
GPIO_Init(GPIOG, GPIO_Mode_AF_PP, (GPIO_Pin_9 | GPIO_Pin_10));   //NCS0 NCS1
24
GPIO_Init(GPIOE, GPIO_Mode_AF_PP, (GPIO_Pin_0 | GPIO_Pin_1));
25
26
27
p.FSMC_AddressSetupTime = 1;
28
p.FSMC_AddressHoldTime = 1;
29
p.FSMC_DataSetupTime = 1;
30
p.FSMC_BusTurnAroundDuration = 0;
31
p.FSMC_CLKDivision = 16;       //72MHz / 16 
32
p.FSMC_DataLatency = 0;
33
p.FSMC_AccessMode = FSMC_AccessMode_A;
34
35
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
36
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
37
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
38
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
39
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
40
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
41
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
42
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
43
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
44
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
45
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
46
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
47
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
48
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
49
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
50
51
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
52
53
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
54
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
55
56
/*!< Enable FSMC Bank1_SRAM Bank */
57
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM3] |= BCR_MBKEN_Set;
58
FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM2] |= BCR_MBKEN_Set;


Gruß
Jens

von Jens (Gast)


Lesenswert?

einen Fehler hab ich gefunden. Im  zweiten GPIO_Init muss GPIOE stehen. 
Allerdings ist das Ergebnis immer noch dasselbige.

Hab ich den ICS2008B richtig an den STM32 angeschlossen?

von Jens (Gast)


Lesenswert?

keiner eine Idee wo der Fehler noch liegen könnte, um die Register des 
ICS2008B entsprechend auslesen und beschreiben zu können?

von hp-freund (Gast)


Lesenswert?

Ich kämpfe auch gerade mit dem STM32.
Hast Du mal versucht den Takt soweit herunter zu teilen bzw. 
Einzelschritt debuggen das so etwas wie ein Einzelschrittbetrieb 
entsteht?
Dann kannst Du mit LEDs live die Ports beobachten, also eine simple 
Logik Analyse.

Man kann leider viele Fehler beim STM32 machen :-(

von Jens (Gast)


Lesenswert?

die einzlnen Pins wiei NWE oder NOE werden auf jeden Fall entsprechend 
gesetzt. Die HCLK hab ich durch 16 geteilt, weil der ICS2008B lediglich 
6,66MHz verträgt. Aber im Speicherbereich wird leider immer nur das 
gleiche Muster 0x0A07 angezeigt - egal welche Einstellungen ich mache.

von Jens (Gast)


Lesenswert?

irgendwie bekomme ich es nicht geregelt, dass die beiden ICs miteinander 
kommunizieren bzw. mir die Daten aus dem ICS2008B angezeigt werden.
1
p.FSMC_AddressSetupTime = 1;
2
p.FSMC_AddressHoldTime = 1;
3
p.FSMC_DataSetupTime = 1;
4
p.FSMC_BusTurnAroundDuration = 8;    //
5
p.FSMC_CLKDivision = 0;       //not supported
6
p.FSMC_DataLatency = 0;       //not supported
7
p.FSMC_AccessMode = FSMC_AccessMode_A;
8
9
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
10
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
11
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
12
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
13
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
14
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
15
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
16
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
17
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
18
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
19
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
20
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enabled;
21
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
22
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
23
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
24
25
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
26
27
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
28
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

HCLK = SYSCLK = AHB-Clock = 72MHz

Mit diesen Settings werden zwar irgendwelche Daten über das Ext. 
Memory-Interface übertragen aber nicht die richtigen.

ICS2008B (auf Seite 15 ist das Timing-Diagramm aufgeführt)
http://datasheet.octopart.com/2008BY-10-IDT-datasheet-7619573.pdf

STM32 Reference Manual
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf

Sobald ich den p.FSMC_DataSetupTime Wert größer als 1 wähle, bleibt 
unabhängig von den anderen Einstellungen (wie AddressHoldTime und 
AddressSetupTime) das angezeigte Ergebnis im Memory-Viewer immer gleich. 
Bei einem p.FSMC_DataSetupTime = 0 bekomme ich einen Hardfault-Error, 
den ich auch nicht ganz nachvollziehen kann.

Gruß
Jens

von Sven Wagner (Gast)


Lesenswert?

Jens schrieb:
> STM-Prozessor             ICS2008B
>
> A[0, 1]                   A[0, 1]   Addressbus
Du hast nur vier verschiedene Adressen, sehe ich das richtig?

> D[0, 7]                   D[0, 7]
Ok.

> FSMC_NWE                  IOW
Ist das write enable auf der ICS-Seite auch low-aktiv?

> FSMC_NOE                  IOR
Das passt nicht. NOE ist ein low-aktives output enable und kein 
read.

oe(aktiv) AND we(aktiv)   = write
oe(aktiv) AND we(inaktiv) = read

Da muß wahrscheinlich etwas glue logic dazwischen.

> FSMC_NE3                  UARTCS
> FSMC_NE2                  SMPTECS
Passt hier die Polarität?

Hast Du ein Oszi oder Logicanalyzer zur Hand?
Damit solltest Du Dir die Signale mal anschauen und mit dem Datenblatt 
vergleichen.

Grüße
Sven

von Eddy C. (chrisi)


Lesenswert?

Klassiker bei STM32: Clock eingestellt, aber nicht enabled.

von Jens (Gast)


Lesenswert?

Sven Wagner schrieb:
>> FSMC_NWE                  IOW
> Ist das write enable auf der ICS-Seite auch low-aktiv?
>
>> FSMC_NOE                  IOR
> Das passt nicht. NOE ist ein low-aktives output enable und kein
> read.

Das sollte so schon passen (Seite 500 sieht man den verwendeten Read und 
Write-Access 
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00171190.pdf). 
Beide Signals sind bei beiden Prozessoren low-active.

Sven Wagner schrieb:
> oe(aktiv) AND we(aktiv)   = write
> oe(aktiv) AND we(inaktiv) = read

Bei Write ist WE active und bei Read ist OE active. Bei beiden Zugriffen 
ist zusätzlich der jeweils benötigte CS low-active. Besitze leider nur 
ein normales Oszi mit zwei Eingängen. Auf allen Leitungen (OE, CS, NWE 
und den Addr und Datenleitungen) kann ich die Aktivität mir anschauen.

Eddy Current schrieb:
> Klassiker bei STM32: Clock eingestellt, aber nicht enabled.

Die Clocks hab ich auch enabled
1
RCC->AHBENR |= RCC_AHBPeriph_FSMC;
2
RCC->APB2ENR |= (RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF) ;

Meine Vermutung liegt eher darin, dass mein verwendetes Timing nicht 
passt.

Gruß
Jens

von Claude S. (claudeschwarz)


Lesenswert?

Ich habe noch nichts mit dem F103 und dessen FSMC gemacht (Nur am F4), 
aber kann es sein das sich
1
p.FSMC_CLKDivision
nur auf den Clockout des FSMCs bei Synchronen Interfaces (PSRAM etc) 
bezieht?
So habe ich das jedenfalls beim F4 verstanden. Und mein F4 läuft ganz 
gut mit einem Memory Mapped FPGA dran , Buszyklus nur durch Setup und 
Hold Parameter auf das Interface angepasst.

Bezüglich des Hardfault bei
1
 p.FSMC_DataSetupTime = 0
 meint das ST RM  folgendes :
1
Duration of the second access phase (DATAST+1 HCLK cycles for 
2
write accesses, DATAST+3 HCLK cycles for read accesses). 
3
This value cannot be 0 (minimum is 1).

von Jens (Gast)


Lesenswert?

Claude Schwarz schrieb:
> meint das ST RM  folgendes :Duration of the second access phase (DATAST+1 HCLK 
cycles for
> write accesses, DATAST+3 HCLK cycles for read accesses).
> This value cannot be 0 (minimum is 1).

ok, das würde das auf jeden Fall erklären.

Claude Schwarz schrieb:
> Ich habe noch nichts mit dem F103 und dessen FSMC gemacht (Nur am F4),
> aber kann es sein das sichp.FSMC_CLKDivision

Ich schätze mal, dass diese sehr ähnlich aufgebaut sein werden. Das mit 
dem CLKDevision hab ich auch im Datenblatt gelesen. Wird nur bei 
synchronen Interfaces.

Jens schrieb:
> p.FSMC_AddressSetupTime = 1;
> p.FSMC_AddressHoldTime = 1;
> p.FSMC_DataSetupTime = 1;
> p.FSMC_BusTurnAroundDuration = 8;    //
> p.FSMC_CLKDivision = 0;       //not supported
> p.FSMC_DataLatency = 0;       //not supported
> p.FSMC_AccessMode = FSMC_AccessMode_A;

Im Prinzip hab man ja nur drei Parameter zur Auswahl mit denen man das 
Timing ggf. anpassen kann - AddressSetuptime, -holdtime und 
DataSetupTime. Die BusTurnAroundDuration gibt nur den zeitlichen Abstand 
zwischen zwei Zugriffen auf den extern angeschlossenen IC an.

Gruß
Jens

von Sven Wagner (Gast)


Lesenswert?

Jens schrieb:
>>> FSMC_NOE                  IOR
>> Das passt nicht. NOE ist ein low-aktives output enable und kein
>> read.
>
> Das sollte so schon passen (Seite 500 sieht man den verwendeten Read und
> Write-Access
> http://www.st.com/internet/com/TECHNICAL_RESOURCES...).
Ok. Ich ziehe meine Aussage zurück und behaupte das Gegenteil :)

Die haben aber auch eine komische Nomenklatur bei STM. M.E. etwas zu 
sehr SRAM-fixiert.

> Besitze leider nur
> ein normales Oszi mit zwei Eingängen. Auf allen Leitungen (OE, CS, NWE
> und den Addr und Datenleitungen) kann ich die Aktivität mir anschauen.
Nagut. Bei mir haben eigentlich alle Oszis vier Eingänge. Aber was nicht 
ist, kann ja noch werden :)

Stimmen den die gemessenen Pulslängen (und evtl. die Abstände der Pulse) 
der einzelnen Signale mit den Erwartungen (und den Angaben im Datenblatt 
des ICS2008B) überein?

Grüße
Sven

von Claude S. (claudeschwarz)


Lesenswert?

Jens schrieb :
>Im Prinzip hab man ja nur drei Parameter zur Auswahl mit denen man das
>Timing ggf. anpassen kann - AddressSetuptime, -holdtime und
>DataSetupTime. Die BusTurnAroundDuration gibt nur den zeitlichen Abstand
>zwischen zwei Zugriffen auf den extern angeschlossenen IC an.

Genau , und hier auf Seite 17 wird beschrieben was für Werte Du für 
einen 150ns Write Cycle einstellen musst :

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00200423.pdf

von Jakob (Gast)


Lesenswert?

Claude Schwarz schrieb:
> Genau , und hier auf Seite 17 wird beschrieben was für Werte Du für
> einen 150ns Write Cycle einstellen musst :

Danke für den Link; hatte erst jetzt wieder Zeit an diesem Projekt 
weiterzuarbeiten -> leider noch ohne Erfolg.

DATAST × tHCLK = tPWE1 -> bei dem IC muss tPWE1 mindestens 150ns
-> DATAST = 10.8 -> = 11;

DATAST >= (tAA + tsu(Data_NE) + tv(A_NE))/tHCLK – ADDSET – 4
11 >= (150ns + 52.76ns)/13.88ns - ADDSET - 4
-> wenn ADDSET = 0 -> 11 = 11;

((ADDSET + 1) + (DATAST + 1)) × tHCLK >= max (tWC)
24 * 13.88ns = 333ns >= 200ns

Alle drei Gleichungen sind locker erfüllt, aber die Daten kann ich aus 
dem ICS2008B immer noch nicht auslesen. Egal welche Zeiten ich für 
Datasetup oder Addrsetup eingebe, ich lese immer die gleichen Zahlen aus 
dem IC aus :-(

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.