Hallo, ich möchte einen STM32F407VGT (TQFP100) an einen FPGA anschließen. Der STM soll über den FSMC mit dem FPGA reden. Leider habe ich festgestellt, dass der FSMC entweder komisch beschrieben ist, oder einfach absolut ungeeignet. Mehrere Dinge sind mir aufgefallen, die ich gerne bestätigt/widerlegt wüsste: 1: Das PSRAM Interface kann zwar synchron mit Clock und wait Signal kommunizieren. Im Reference Manual steht auch, dass es über einen 16 bit Datenbus zwar 8 bit Werte schreiben kann (Byte Enable leitungen). Allerdings kann es wohl keine 8 bit Lesezugriffe. Warum, verstehe ich absolut nicht. Im asynchronen Modus geht das ja auch. Und warum er die Byte Enables dafür nicht verwendet ist mir ein Rätsel. 2: Das asynchrone RAM Interface kann kein Multiplexing der Daten/Adressleitungen. Das führt dazu, dass man beim TQFP100 die Adressleitungen A[0..9] nicht hat, weil der Port an dem die liegen in diesem Gehäuse nicht verfügbar ist. Ist das wirklich so absolut beschis***, oder habe ich das Ganze schlichtweg nicht verstanden?
Zu1: Die Byteenable Signale sind bei vielen Bus Systemen nur zum Schreiben da. Beim Lesen wird immer alles auf den Bus geblasen was geht und die CPU sucht sich das passende Byte dann aus. Beim Schreiben würde das Byte sonst überschrieben, beim Lesen geht ja nix kaputt. So sieht das zB bei einem selber gebauten MIPS aus: http://www.fritzler-avr.de/spaceage2/hw_memdatamux.htm In der Uni haben wir auch einen ARM kern in VHDL gebaut, ARM hat sowas auch. Aber der Artikel mit Bildern sollte verständlicher sein als etwas schnödes VHDL. Bei einer geraden Adresse wird also das Byte0 zum Byte0 des internen STM32 AHB durchereicht und bei ungeraden Adressen wird Byte1 des FSMC zu Byte0 des AHB durchgereicht. Zu2: Der F407 im 100er kann doch NUR Muxed? Also genau andersrum. Klick dazu mal durch CubeMX. Zum IO klicken ist das Programm gut, aber klick NIE auf Code generieren da kommt absolute Bloatware raus ;) Ab dem 144er Gehäuse sollts gehen.
Mw E. schrieb: > Die Byteenable Signale sind bei vielen Bus Systemen nur zum Schreiben > da. Mir ist schon klar, wie Bussysteme funktionieren. Übrigens haben sehr viele Busse Byteselects auch für reads. In seltenenfällen kann man darüber Endian-Mixing machen und auch register implementieren, die clear on read sind. AXI hat z.B. Byteselects für reads. Zum STM: Im angehängten Bild ist der 8 bit read beim PSRAM ausgegraut. Zitat: Table 218 below displays an example of the supported devices, access modes and transactions when the memory data bus is 16-bit for NOR, PSRAM and SRAM. Transactions not allowed (or not supported) by the FSMC in this example appear in gray. Das heißt doch, dass der keine 8 bit reads kann. Mw E. schrieb: > Klick dazu mal durch CubeMX. Habe kein CubeMX und werde es auch nicht installieren.
Irgendwas ist da komisch, da steht beim synchronen auch nicht mehr, dass er bei 32Bit das in 2FSMC Zugriffe splittet. Ob der Praktikant nur beim grau markieren in Excel auf der Maus abgerutscht ist? Den SYNC Mode hab ich noch nie benutzt, aber testes doch einfach ob dann ein Hardfault kommt.
Mw E. schrieb: > Irgendwas ist da komisch, da steht beim synchronen auch nicht mehr, dass > er bei 32Bit das in 2FSMC Zugriffe splittet. > Ob der Praktikant nur beim grau markieren in Excel auf der Maus > abgerutscht ist? > > Den SYNC Mode hab ich noch nie benutzt, aber testes doch einfach ob dann > ein Hardfault kommt. Ja. Das ist einfach schlecht gemacht diese Tabelle. Ich bin gerade dabie das zu implementieren. Soweit ich sehe, kann man wohl einen externen SRAM mit LAtch anschließen, wenn man den FSMC auf PSRAM stellt und den MUX Modus aktiviert und die BurstModes abschaltet. Warum auch immer das so komisch verwinkelt gelöst ist.
Guggema: http://www.cnblogs.com/xiaomagee/p/5409024.html Die Chinesen mit dem icore3 STM32F407+FPGA Board nehmen auch den muxed Mode (erkennbar am NADV). Aber arbeiten auch garnicht erst mit Byte Enables.
Okay. Habe den FSMC nun im PSRAM Mode (ohne synchrone Bursts). Mux Mode enabled. Das ganze funktioniert so. Vielen Dank, aber die Doku von ST ist IMHO ziemlich verwirrend Hier die Config:
1 | FSMC_Bank1->BTCR[0] = FSMC_BCR1_WREN | FSMC_BCR1_MWID_1 | FSMC_BCR1_MTYP_0 | FSMC_BCR1_MUXEN | FSMC_BCR1_MBKEN; |
2 | FSMC_Bank1->BTCR[1] = (2 << 16) | (20U << 8) | (1<<4) | (1<<0); |
3 | FSMC_Bank1E->BWTR[0] = (2 << 16) | (20U << 8) | (1<<4) | (1<<0); |
Für die Magic Numbers 16, 8, 4 und 0 gibts doch sicherlich die passenden BLAHKEKS_pos defines im Header.
Mw E. schrieb: > Für die Magic Numbers 16, 8, 4 und 0 gibts doch sicherlich die passenden > BLAHKEKS_pos defines im Header. Kann sein. War nur ein Test, damit die Timings irgendwelche Werte haben. Habe das ganze mit dem Logicanalyzer angeschaut.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.