Hallo, ich will ein System (master) abfragen mit einem STM32F4 (slave). Dieses System liefert mir mit ca. 10MHz parallel Daten (8Bit + 2Bit Status). Zum Steuern gibt es eine enable und eine Takt Leitung, also genauso wie SPI. Mein FreeRtos mit Ethernet soll aber noch genug Rechen Zeit bekommen! Gibt es eine flotte Methode das einzulesen? Ich glaube das ein normaler Pin-Change-Interrupt wohl nicht reichen wird. DMA wäre glaube ich das beste, aber geht sowas damit überhaupt? Marco
Schau Dir mal das SDIO Modul an. Eine SD-Card kannst Du anstatt mit dem 1-Bit SPI Modus auch in einem 4-Bit SPI Modus betreiben. Dann sind 4 Datenleitungen im Spiel. Das SDIO Modul hat 1,4 oder 8. Ob das allerdings als Slave geht, weiss ich nicht. Das Kamera-Interface würde ähnlich arbeiten. Als Slave. Dort müsste man mal schauen, ob das auch mit generischen Daten klar kommt
Marco schrieb: > DMA wäre glaube ich das beste, aber geht sowas damit überhaupt? Ja das geht. Wenn Du aber so spezielle Wünsche hast, dann solltest Du eventuell diese Chipfamilie nehmne: PSoC 5LP Das ist ein Cortex-M3 mit etwas programmierbarer Peripherie drumrum.
Dispol schrieb: > Ob das allerdings als Slave geht, weiss ich nicht. Das Kamera-Interface > würde ähnlich arbeiten. Als Slave. Dort müsste man mal schauen, ob das > auch mit generischen Daten klar kommt Bei den ARMs von Atmel kann man sich ebenfalls sowas "zusammenbasteln". Das würde mit generischen Daten klar kommen.
:
Bearbeitet durch User
Von Atmel bin ich gerade erst weg, weil mir die STM32 Prozessoren einfach besser gefallen hatten. So ein bisschen Logik wäre schon toll, aber dann ist es ein Spezialtyp von Prozessor und das will ich einfach nicht mehr haben. Die beste Spezialtyp Lösung wäre dann auch von XMOS, den XMOS gibt es auch mit eingebauten ARM M3 Kern. Aber wie gesagt, bitte nur Standard Prozessoren und keine Spezialtypen. Das mit dem SDIO schaue ich mir mal an. Das da was von 8Bit steht, habe ich anscheinend übersehen. Marco
Das mit dem SDIO müsste jemand erklären der sich damit auskennt. Soweit ich das sehe kann man damit nicht das machen was ich brauche. Das Kamerainterface könnte möglicherweise funktionieren. Da muss ich aber erst mal schauen wie ich die gewünschten Signale mit meinen Signale hin bekomme. Aber das sollte gehen im Notfall muss ich ein Signal invertieren damit es geht. Danke auf das Kamerainterface wäre ich nie gekommen. Marco
der STM kann ein halbes (oder ganzes Port) also 8 oder 16bit per DMA direkt ins RAM kopieren (mit RAM-Adress increment usw) falls du deine Signale also so routen kannst, das sie auf einem gemeinsamen Port liegen, ist das kein Problem diese Methode benutze ich z.B. in meinem Logic-Analyzer Projekt Gruss Uwe
Wenn Du DMA einsetzt und dein Master den Takt vorgibt, dann muss(!) der Systemtakt mindestens das 14fache betragen. Also wenn dein Master 10MHz Ausgabetakt bringt, dann musst dein STM32 mit mindestens 140MHz laufen. Das ist bei Atmel genauerer beschrieben, warum das so ist, gilt aber auch auf dem STM32.
Marco schrieb: > ich will ein System (master) abfragen mit einem STM32F4 (slave). Ich habe es nicht verstanden: der 'slave' fragt den 'master' ab? adenin schrieb: > Das ist bei Atmel genauerer beschrieben, warum das so ist, gilt aber > auch auf dem STM32. DMA auf diversen ARM-Prozessoren ist herstellerabhängig. Beim STM32F4 gibt es z.B. keinen ext. DMAREQ; dessen Möglichkeiten bzgl. DMA sind eher bescheiden.
m.n. schrieb: > DMA auf diversen ARM-Prozessoren ist herstellerabhängig. Beim STM32F4 > gibt es z.B. keinen ext. DMAREQ; dessen Möglichkeiten bzgl. DMA sind > eher bescheiden. Es gibt die Möglichkeit eines "ext. DMAREQ". Man muss nur wissen, wozu Dinge missbrauchbar sind.
adenin schrieb: > Es gibt die Möglichkeit eines "ext. DMAREQ". > Man muss nur wissen, wozu Dinge missbrauchbar sind. Dann sage es bitte und behalte dein Wissen nicht für dich. Ich wette, das würde viele interessieren.
Der CLK des Masters geht an den ETR von einen der Timer des STM32. Dieser Timer ist so konfiguriert, das er nach einem Zählimpuls den UEV erzeugt und so einen DMA-Request auslöst. Elementar, mein lieber Watson...
adenin schrieb: > Elementar, mein lieber Watson... Das mag schon sein, mein lieber Holmes :-) Aber jeder fängt mal an und weiß nicht von Geburt an alles. Vielen Dank für deine Erläuterungen!
Tricks wollte ich nicht unbedingt benutzen, auch wenn das recht interessant ist was Du da gemacht hast. Ich werde das Kamerainterface benutzen. Das ganze ist dann austauschbar auf andere Prozessoren mit diesem Interface. Auch wenn ich da so schnell nicht wieder ran will, obwohl so ein M7 wäre auch nett dafür. Da Du dich anscheinend gut auskennst: Ich bekomme X Daten geliefert (10Bit) die brauche ich aber nachher in 2 getrennten Arrays (Bit 0-7 Daten) (Bit 8-9 ERROR Status). Das Kamerainterface speichert die aber als 16Bit Array. Wie könnte man die Daten umkopieren ohne es von Hand zumachen? Also eine Art DMA memcpy mit "kopiere nur die Ungeraden/Geraden Bytes". Für meine Anwendung muss ich extern ein paar Inverter und wenn das mit dem kopieren nicht geht noch 2 FlipFlops zur ERROR-Status Speicherung einbauen. Marco
Eigendlich gibt es ja dafür struct. Aber dafür hätt ich einen Trick, wenn Du umbedingt zwei Arrays willst.
Marco schrieb: > Von Atmel bin ich gerade erst weg, weil mir die STM32 Prozessoren > einfach besser gefallen hatten. > > So ein bisschen Logik wäre schon toll, aber dann ist es ein Spezialtyp > von Prozessor und das will ich einfach nicht mehr haben. Was heißt Spezialtyp? Bis auf den Core sind die div. Cortex-Mx von Atmel, Freescale, NXP, ST usw. usf. auch nicht zueinander kompatibel. Ebenso die genannten PSoC5 LP: Core ist ein normaler Cortex-M3, die Peripherie was eigenes. So was gab/gibt es von FPGA-Hersteller schon länger.
@adenin: Wie geht der Trick? Mit Spezialtypen meinte ich wirklich diese "Exoten" mit FPGA/2. Kern/.... Ich habe lieber normale Standard Ware. Wenn ich in 5 Jahren das Projekt nochmal ändern will, gibt es mit Sicherheit einen Standard Prozessor mit einen ähnlichen Interface. Das je nach Prozessor Familie Unterschiede gibt sollte doch jeden klar sein.
Marco schrieb: > @adenin: Wie geht der Trick? Naja, der ist nicht schön, aber selten, und ich würde es auf keinen Fall so machen. Du hast dein BufferArray, wo die DMA die Daten reinschreibt. Das Array aus dem Du die Daten ausließt beginnt bei der selben Adresse, wie das BufferArray. Das Array für die Statusbits beginnt an der um ein Byte höheren Adresse.
1 | uint16_t BufferArray[1025]; //eins mehr als Benutzt werden, weil StatusArray das letzte überragt |
2 | uint16_t* DataArray; |
3 | uint16_t* StatusArray; |
4 | |
5 | DataArray = BufferArray; |
6 | StatusArray = BufferArray+1; |
7 | |
8 | //Zum zugreifen du musst aber die unbenötigten Bits maskieren. |
9 | for(i=0;i<1024;i++) |
10 | { |
11 | Data = DataArray[i] & 0x0ff; |
12 | Status = StatusArray[i] & 0x03; |
13 | } |
Besser ist natürlich über struct. Und so mach ich das (naja, so ähnlich).
1 | typedef struct _sample_t{ |
2 | uint8_t Data; |
3 | uint8_t Status; |
4 | } sample_t; |
5 | |
6 | sample_t BufferArray[1024]; |
7 | |
8 | for(i=0;i<1024;i++) |
9 | { |
10 | Data = BufferArray.Data[i]; |
11 | Status = BufferArray.Status[i]; |
12 | } |
Das waren jetzt nur Beispiele und erheben keinen Anspruch auf syntaktische Sauberkeit. ;) Ausserdem könnte es sein, das Du, je nach Verhalten deines Compilers das struct als _attribute_ ((_packed_)) definieren musst. damit das Byte auch wirklich nur 2Byte groß wird. Es könnte sonst unerwatete (aber berechtrigte) 8 Byte groß werden.
:
Bearbeitet durch User
Das ist ein von Hand kopierren, das kostet aber viel zu viel Zeit. Hatte da mehr an DMA gedacht. Nun ja, jetzt ist erst einmal basteln angesagt und das Projekt aufsetzen. Dann werden bestimmt noch mal ein paar fragen aufkommen. Marco
Marco schrieb: > Das ist ein von Hand kopierren, das kostet aber viel zu viel Zeit. > Hatte da mehr an DMA gedacht. Das ist kein "von Hand kopierren". Das ist ein "garnichtkopieren". Die Schleife steht ja nur dafür, das Du irgendwann mal was mit den Daten machst und wie Du darauf zugreifen musst. Hast Du die schon Gedanken machen lassen, ob an dem von Dir gewählten Prozessor überhaupt DCMI und Ethernet gleichzeitig möglich ist? Thema: Maping der Alternativen Funktionen (AF)
Bin gerade am Pin verteilen. An dem LGFP176 sollte das aber alles dran passen. Mal schauen ob das auch an dem 100 oder 144 Pin Typ alles dran passt. Ich brauche nachher keine misch Arrays Die Daten müssen als ein Block vorliegen, sonst kann ich die nicht weiterverarbeiten. Ich werde nur 8Bit abfragen und die 2 Statusleitungen anderweitig auswerten.
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.