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.
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
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 keinenFall 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.
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.